[토이강의] Blazor C# 으로 유튜브 동영상 나의 플레이리스트 만들기
본 토이강의는 순순히 개인목적을 위한 것이며, 상업적 목적은 1도 없으며, 미디어파일 CRUD를 연습해보기위한 예제일 뿐입니다
난이도 : 중
웹 프레임워크의 기본적인 CRUD 개념은 안다는 가정하에 설명합니다
사전지식: 유튜브 API key 만들어놓기, ffmpeg.exe 준비해놓기, youtube-dl.exe 준비해놓기
https://github.com/najongjine/YoutubeCrawlDotnet
귀찬으면 git clone 이후
YoutubeCrawlDotnet.Shared/Config/Config.cs 쪽만 수정하고
package manager 콘솔에서 update-database 만 쳐주면 끝난다.
실행은 ctrl+f5 누르면 실행된다.
주의사항-
Sql Server 이 DB가 좀 지랄맞다.
연결이 안될경우 cmd 창을 관리자 권한으로 열고
sqllocaldb stop mssqllocaldb -k sqllocaldb delete mssqllocaldb sqllocaldb start "MSSQLLocalDB"
이렇게 입력해주자
Microsoft SQL Server Management Studio
를 열고 기본 접속 화면에서 (localdb)\mssqllocaldb
를 입력하고 접속을 해서 DB 연결이 잘 되는지 확인해보자
기본개념:
Controller= 요청을 받는 API endpoint
Manager= DB 작업을 처리하는 구간
Helper=잡다한 기능을 가진 클래스를 모나 놓는곳(예를들면 문자열에서 특수문자를 제거하는 클래스는 이쪽에다가 만든다)
YoutubeCrawlDotnet.Share= 프론트, 서버가 공용으로 사용하는 클래스들이다.
주로 Entity(DB 객체 자체) 와 DTO(프론트와 서버가 통신할시 데이터를 담는 바구니),
Config(유튜브 API key, localhost주소, 저장경로등 여러가지 설정 정보를 관리 하는놈)
클래스들을 관리한다.
Pages= 프론트쪽의 View 페이지들이다. 기본적으로 라우팅이 지원 된다.
_imports.razor=말로 설명이 힘들다. 프론트에서 클래스들을 쉽게 사용해주기 위해
등록 해주는 곳이다
Program.cs,Startup.cs = 여러가지 서버 설정들을 하는 곳이다.
Spring으로 치면 Bean 등록을 하는 구간이라고 보면 된다.
1. Visual Studio 2019 Community Version 다운로드
https://visualstudio.microsoft.com/ko/thank-you-downloading-visual-studio/?sku=Community&rel=16
2. visual studio installer 수행후 설치
3. visual studio 2019 실행후 새 프로젝트 만들기
4. Blazor 앱 선택
4. 프로젝트 이름 지어준후, 디렉토리 자율선택
5. 프로젝트 세부설정
인증 부분은 '개별 사용자 계정'을 클릭.
이유는 회원가입, 인증 부분을 자동으로 만들어줌.
ASP.net core hosted 체크
5. 모듈 설치
YoutubeCrawlDotnet.Client 우클릭후 nuget 패키지 관리 클릭
Blazored.Video
Microsoft.Extensions.Http
Newtonsoft.json
System.Net.Http.Json
위 목록의 nuget package 들을 설치
Microsoft.AspNetCore.Components.WebAssembly
Microsoft.AspNetCore.Components.WebAssembly.Authentication
Microsoft.AspNetCore.Components.WebAssembly.DevServer
이 3개는 설치 되있는지만 확인 (YoutubeCrawlDotnet.Client->종속성->패키지 에서 확인 가능)
YoutubeCrawlDotnet.Server쪽은 아래 명시된 패키지들 설치
6. 서버쪽 구성
컨트롤러 추가 메뉴 클릭
7.유튜브 크롤링 기능 컨트롤러 구현
Server/Controllers/YoutubeDownloadController.cs
필자가 올린 깃허브 경로에 있는 소스코드를 복붙하자
*[HttpGet("v2/{youtubeUrlId}")]
public async Task<ResponseDTO<string>> SaveVideoToDisk(string youtubeUrlId = null, [FromQuery] string inputStr = "undefined", [FromQuery] bool bMakeItPrivate = false)
이 놈이 사용되는 컨트롤러 진입 포인트다
* 유튜브 URL을 입력해주면 최고영상과 최고 음질로 다운받고, 받은 영상 정보를 DB에 저장하는 코드이다.
코드에 빨간줄이 떠도 당분간은 무시하자
* 주요코드는
var ytdl = new YoutubeDL();
// set the path of the youtube-dl and FFmpeg if they're not in PATH or current directory
ytdl.YoutubeDLPath = $"H:/MyProjects/youtube-dl.exe";
ytdl.FFmpegPath = $"C:/ffmpeg/bin/ffmpeg.exe";
// optional: set a different download folder
ytdl.OutputFolder = $"{Config.PhysicalFilePath}/{inputStr}";
ytdl.RestrictFilenames = true;
// download a video
var data = await ytdl.RunVideoDataFetch(url:url);
유튜브 동영상을 다운하기전, 저장경로, ffmpeg.exe 가 존재하는 경로,
ytdl.RestrictFilenames = true; 옵션으로 특수문자 제거,
youtube-dl.exe 가 존재하는 경로 등의 옵션 설정이다.
이걸 안해주면 파일 관리가 안된다
그후
var data = await ytdl.RunVideoDataFetch(url:url);
코드를 통해서 유튜브 영상을 크롤링 해준다
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
crawled = await youtubeDownloadManager.AddCrawledAsync(crawled);
...
scope.Complete();
}
강제 트랜젝션을 만들어주는 코드이다.
SaveChanges(); 라는 코드는 DB에 변경사항이 생기면 commit을 하는데,
때로는 바로 commit 하는게 위험할수 있다.
TransactionScope 안에 있는 코드들 중에서 하나라도 에러가 난다면
SaveChanges();
코드를 넣었다 하더라도 commit이 되지 않는다.
scope.Complete();
코드를 만나야만 commit을 수행한다.
8. Manager 구현
Manager 폴더를 통째로 복사해서 붙여넣기 하길 권장한다.
YoutubeDownloadManager.cs 에서 중요한 코드
private readonly ApplicationDbContext dbContext;
public YoutubeDownloadManager(ApplicationDbContext dbContext)
{
this.dbContext = dbContext;
}
DB에 접근하기위한 준비를 해주는 코드다.
update-database 를 한 상태에선, dbContext. 이렇게 입력하면 사용할수 있는 DB 테이블들의 목록이 쫙 나온다.
await dbContext.Crawled.AddAsync(crawled);
await dbContext.SaveChangesAsync();
return crawled;
crawled 라는 객체 안에는 크롤링한 동영상의 정보들이 담겨있다.
이 정보들을 Crawled 라는 테이블에 저장하고 커밋하는 코드이다.
데이터가 저장되면, 저장된 데이터의 Id(PK) 값을 crawled 객체에 담아준다.
9.Helper 클래스 파일들
이것들은 기능이 간단하고 클래스 이름처럼 직관적인 놈들이다. 그냥 폴더채로 복붙하자.
댓글
댓글 쓰기