본문으로 바로가기
반응형

오늘 포스팅할 내용은 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), 이중 원형 연결 리스트 예제

2019/12/22 - [프로그래밍/C] - 프로그래머스 2016년, 날짜에 따른 요일 구하기

2019/08/25 - [프로그래밍/C#] - C# 마우스 제어(클릭, 좌표 이동)

반응형