오늘 포스팅할 내용은 C#을 이용해서 유튜브 동영상 다운로더를 만드는 방법입니다.
제가 만든 방법으로 유튜브 동영상을 MP3, MP4 포맷으로 다운로드할 수 있습니다. 다만 아쉽게도 MP4 포맷의 해상도는 조절을 할 수 없습니다. 라이브러리에 해상도 선택이 없는 것으로 보이네요. 720p 고정으로 다운로드되는 것 같은데, 다운로드를 할 수 있다는 것에 의미를 둬야 할 것 같습니다.
해상도 조절 방법을 아시는 분 댓글 좀 부탁드리겠습니다.
라이브러리 |
솔루션 탐색기에서 NuGet 패키지 들어가 2개의 라이브러리를 다운로드합니다.
VideoLibrary 설치. URL을 통해서 동영상을 다운로드하기 위해 필요합니다.
MediaTookit 설치. MP4 포맷으로 다운로드한 동영상을 MP3로 변환하기 위해서 필요합니다.
UI 구성 |
TextBox
- URL(url_textBox)
- File Path(path_textBox)
RadioButton
- MP3, MP4 파일 포맷 선택.
(MP3_radiobtn, MP4_radiobtn)
Button
- Browse 버튼.(Browse_btn)
- Donwload 버튼.(Download_btn)
ProgressBar
- progressBar(progressBar)
소스 코드 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Threading; using System.IO; using VideoLibrary; using MediaToolkit; using System.Net; namespace WindowsFormsApp2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); MP3_radiobtn.Checked = false; MP4_radiobtn.Checked = true; } private void Form1_Load(object sender, EventArgs e) { } private void Browse_btn_Click(object sender, EventArgs e) { using (FolderBrowserDialog fdb = new FolderBrowserDialog() { Description = "Select your path" }) { if (fdb.ShowDialog() == DialogResult.OK) { path_textBox.Text = fdb.SelectedPath; } } } private async void Download_btn_Click(object sender, EventArgs e) { progressBar.Minimum = 0; progressBar.Maximum = 100; progressBar.Value = 0; IbIPercentage.Text = "0%"; // Title WebRequest GetTitle = HttpWebRequest.Create(url_textBox.Text); var youtube = YouTube.Default; var video = await youtube.GetVideoAsync(url_textBox.Text); File.WriteAllBytes(path_textBox.Text + @"\" + video.FullName, await video.GetBytesAsync()); if (MP3_radiobtn.Checked == Enabled) { var inputFile = new MediaToolkit.Model.MediaFile { Filename = path_textBox.Text + @"\" + video.FullName }; var outputFile = new MediaToolkit.Model.MediaFile { Filename = $"{path_textBox.Text + @"\" + video.FullName}.mp3" }; using (var enging = new Engine()) { enging.GetMetadata(inputFile); enging.Convert(inputFile, outputFile); } /*if (MP4_radiobtn.Checked == true) { File.Delete($"{path_textBox.Text + @"\" + video.FullName}.mp3"); } else */if(MP3_radiobtn.Checked == true) { File.Delete(path_textBox.Text + @"\" + video.FullName); } } progressBar.Value = 100; IbIPercentage.Text = "100%"; } private void progressBar_Click(object sender, EventArgs e) { } private void MP3_radiobtn_CheckedChanged(object sender, EventArgs e) { } private void MP4_radiobtn_CheckedChanged(object sender, EventArgs e) { } } } | cs |
소스코드를 살펴보겠습니다.
1 2 3 | using VideoLibrary; using MediaToolkit; using System.Net; |
1 2 3 4 5 6 7 8 9 10 | private void Browse_btn_Click(object sender, EventArgs e) { using (FolderBrowserDialog fdb = new FolderBrowserDialog() { Description = "Select your path" }) { if (fdb.ShowDialog() == DialogResult.OK) { path_textBox.Text = fdb.SelectedPath; } } } |
다운로드 경로를 받아 path_textBox에 넣습니다.
1 2 3 4 5 6 7 | // Title WebRequest GetTitle = HttpWebRequest.Create(url_textBox.Text); var youtube = YouTube.Default; var video = await youtube.GetVideoAsync(url_textBox.Text); File.WriteAllBytes(path_textBox.Text + @"\" + video.FullName, await video.GetBytesAsync()); |
해당 URL(url_textBox.Text)에 동영상을 다운로드하는 코드입니다. GetTitle은 해당 동영상의 제목으로 저장을 할 수 있게 해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var inputFile = new MediaToolkit.Model.MediaFile { Filename = path_textBox.Text + @"\" + video.FullName }; var outputFile = new MediaToolkit.Model.MediaFile { Filename = $"{path_textBox.Text + @"\" + video.FullName}.mp3" }; using (var enging = new Engine()) { enging.GetMetadata(inputFile); enging.Convert(inputFile, outputFile); } /*if (MP4_radiobtn.Checked == true) { File.Delete($"{path_textBox.Text + @"\" + video.FullName}.mp3"); } else*/ if(MP3_radiobtn.Checked == true) { File.Delete(path_textBox.Text + @"\" + video.FullName); } |
MP4로 받은 포맷을 MP3로 변환해 주는 코드입니다. MP4를 MP3로 변환 후 MP4를 삭제합니다.
해상도를 선택 못한다는 게 좀 아쉽네요. 추후에 FHD 해상도 이상을 다운로드할 수 있도록 만들어보도록 하겠습니다.
2020/02/26 - [프로그래밍/C++] - 프로그래머스 - 완주하지 못한 선수, sort algorithm 정리
2020/01/20 - [프로그래밍] - tortoise svn lock 해제 update 매크로
2020/01/11 - [프로그래밍] - 비트맵의 구조, 24비트 비트맵의 구조는 어떻게 될까?
2020/01/05 - [프로그래밍/C] - 이중 연결 리스트(Double linked list), 이중 원형 연결 리스트 예제
'프로그래밍 > C#' 카테고리의 다른 글
C# USB 통신, LibUsbDotNet (0) | 2020.08.27 |
---|---|
C# 시리얼 통신 아스키 외 값 읽기 (8) | 2020.08.17 |
C# 마우스 제어(클릭, 좌표 이동) (4) | 2019.08.25 |
C#을 이용한 시리얼 통신(포트 검색/연결/해제) (12) | 2019.04.15 |
[Zedgraph] C# 그래프 라이브러리를 이용한 실시간 그래프 (5) | 2019.04.08 |