파이썬 실습/유튜브 동영상 다운로드 프로그램 만들기

파이썬 유튜브 동영상 다운로드 프로그램 만들기

파기차차 2022. 10. 22. 14:12
728x90
반응형
SMALL
728x90
ㅁ 개요

 

O 프로그램 소개
 

 - 이번 프로그램은 파이썬을 이용하여 유튜브 동영상을 다운로드 하는 프로그램으로 프로그램 실행 시 다운로드 진행율을 표시해 주고, 다운로드가 완료되면 해당 동영상의 다운로드가 완료되었다고 보여주는 간단한 프로그램입니다.

(본 블로그의 내용은 유튜브 동영상(파이썬 유튜브 동영상 다운로드 프로그램 만들기(making YouTube Download Program by python))에서 더욱 자세히 보실 수 있습니다.)

 

 

O 완성된 프로그램 실행 화면
 
 - 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

(1) 프로그램 실행시 다운로드 진행율을 알려주고, 지정된 폴더에 유튜브 동영상을 다운로드 해줍니다.

 

 

 

 

 

 


 

ㅁ 세부 내용
 
O 완성된 소스

 

from pytube import YouTube

url = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&t=9s'

yt = YouTube(url)
title = yt.title

print("[영상 제목]", yt.title)  # 영상제목
print("[영상 게시자]", yt.author) # 영상 게시자
print("[조회수]", yt.views)
print("[평균평점]", yt.rating) # 평균 평점
print("[영상길이(초)]", yt.length)
print("[연령제한여부]", yt.age_restricted)
print("[영상 설명]", yt.description) # 영상 설명
print("[썸네일URL]", yt.thumbnail_url,"\n\n") # 썸네일 url 주소


def on_progress(vid, chunk, bytes_remaining):
    total_size = vid.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = bytes_downloaded / total_size * 100
    totalsz = (total_size/1024)/1024
    totalsz = round(totalsz,1)
    remain = (bytes_remaining / 1024) / 1024
    remain = round(remain, 1)
    dwnd = (bytes_downloaded / 1024) / 1024
    dwnd = round(dwnd, 1)
    percentage_of_completion = round(percentage_of_completion,2)

    #print(f'Total Size: {totalsz} MB')
    print(f'Download Progress: {percentage_of_completion}%, Total Size:{totalsz} MB, Downloaded: {dwnd} MB, Remaining:{remain} MB')

yt = YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download('./imsi')

print(title,"(",url,")", " 가 다운로드 완료 되었습니다.\n")
print("#############################################################\n")

 

O 소스 다운로드
 - 소스파일 다운로드 후 cmd 또는 파워쉘, 비주얼스튜디오코드 등에서 아래와 같이 실행하시기 바랍니다.
# pytube 모듈 설치
> python -m pip install pytube
# 소스(소스명:pytube3.py) 실행
> python pytube3.py
 

 

pytube3.py
0.00MB

 

 


 
 
O 핵심 내용

 

1. from pytube import YouTube <-- 'pytube 패키지에서 YouTube 모듈부분을 사용하겠다' 라는의미

2. yt = YouTube(url) <-- 유튜브 영상의 정보를 뽑아내서 yt변수에 저장

3. title = yt.title <-- 하단의 다운로드 완료 메시지를 뿌리는데 사용하기 위해 keep해 둠

4. print("[영상 제목]", yt.title)  <-- 영상의 각종 정보를 보여줌

5. def on_progress() <-- 영상의 다운로드 진행율을 표시하기 위해 사용자 정의 함수로 만들어 둠

6. on_progress_callback=on_progress <-- 콜백에 내가 만든 사용자 정의 함수(on_progress)를 지정, 만일 사용자 정의 함수가 없는 경우 디폴드 함수(on_progress로 이름이 동일함)가 실행됨

7. streams.filter(res="720p") <-- 영상의 화질을 지정

8. download('./imsi') <-- 다운로드 폴더를 지정

 

 


 

O 기본 내용

아래 세부 설명을 위해 단계별(Part I, Part II, Part III)로 나누어서 설명드리겠습니다.

 

 

 

 

Part I. 기본

-기본적인 유튜브 동영상 다운로드 버전입니다.

from pytube import YouTube
from pytube.cli import on_progress


link = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&t=9s'

# link=input('enter url:')
yt=YouTube(link,on_progress_callback=on_progress) # on_progress_callback 으로 on_progress를 지정하거나, 사용자 정의 함수를 지정할 수 있음

videos=yt.streams.first() # 첫번째 스트림을 가져옴
videos.download()
print("################# 다운로드 완료 #############################")

 

 

 

 

1.아래 사이트에서 pytube 모듈의 전반적인 사용방법을 보실 수 있으며, 자세한 내용은 pytube.io 에서 확인 가능합니다.

먼저, 모듈을 pip로 설치하셔야 합니다.

https://github.com/pytube/pytube

 

 

 

2. 아래와 같이 소스를 작성합니다.

from pytube.cli import on_progress <-- 디폴트 함수 on_progress 을 사용해야 하므로 모듈을 선언해 줍니다.

그리고, 다운로드 받을 유튜브 주소를 복사하여 link변수에 할당 후 유튜브 모듈(YouTube(link, on_progress_callback=on_progress) )을 yt변수에 할당합니다. 그리고 스트림을 가져와서 다운로드 합니다.

 

 

 

3. 실제 실행하면 아래와 같이 진행상태 bar가 나타나고 완료됩니다.

 

 

 

4. 폴더에 가서 확인한 결과 프로그램을 실행한 폴더에 잘 다운로드 된 것을 확인할 수 있습니다.

 

 

 

5. 그런데, 문제가 있습니다. 실제 동영상을 확인해 보니 화질이 너무 좋지 않아 내용을 확인하기가 어렵습니다.

아래에서 우리는 이문제를 해결할 것입니다.

 

 


 

 

 

Part II. 응용

 

-기본적인 유튜브 동영상 다운로드 버전을 응용한 버전입니다.

from pytube import YouTube
# from pytube.cli import on_progress #this module contains the built in progress bar.


def on_progress(vid, chunk, bytes_remaining):
    total_size = vid.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = bytes_downloaded / total_size * 100
    totalsz = (total_size/1024)/1024
    totalsz = round(totalsz,1)
    remain = (bytes_remaining / 1024) / 1024
    remain = round(remain, 1)
    dwnd = (bytes_downloaded / 1024) / 1024
    dwnd = round(dwnd, 1)
    percentage_of_completion = round(percentage_of_completion,2)

    #print(f'Total Size: {totalsz} MB')
    print(f'Download Progress: {percentage_of_completion}%, Total Size:{totalsz} MB, Downloaded: {dwnd} MB, Remaining:{remain} MB')
#
url = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&t=9s'

# yt = YouTube(url, on_progress_callback=on_progress)
yt = YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download()

 

 

1. def on_progress(vid, chunk, bytes_remaining): <-- 사용자 정의 함수를 지정하였습니다. 사실 이 함수는 없어도 무방합니다. 만일 이 함수가 없으면 pytube의 내장 기본 함수인 on_progress(함수 이름이 동일함)가 실행됩니다.

아래에서는 내가 만든 사용자정의 함수인 on_progress()를 만들어 지정하였고(따라서 from pytube.cli import on_progress <-- 모듈을 임포트할 필요가 없음), 화질도 720p(streams.filter(res="720p"))로 올려 줬습니다.

 

 

 

2. 실제 실행 결과 다운로드 시 파일이 얼마나 받아졌는지 진행율과 전체크기, 다운로드된 사이즈 및 남은 사이즈를 보여주고 있습니다.

 

 

 

3. 최종 완료 이후 프로그램을 실행한 폴더에 가서 확인한 결과 해당 경로에 잘 받아진 것을 확인할 수 있습니다. 화질을 높였더니 '.mp4' 확장자로 받아진 것으로 알 수 있습니다.

 

 

4. 영상을 실행해 보니 이전보다 화질이 많이 좋아진 것을 확인할 수 있습니다.

 

 

 


 

 

Part III. 응용2

 

-기본적인 유튜브 동영상 다운로드 버전을 응용한 버전을 다시 몇가지 기능을 추가한 버전입니다.

from pytube import YouTube

url = 'https://www.youtube.com/watch?v=4ASVa2HPr6M&t=9s'

yt = YouTube(url)
title = yt.title

print("[영상 제목]", yt.title)  # 영상제목
print("[영상 게시자]", yt.author) # 영상 게시자
print("[조회수]", yt.views)
print("[평균평점]", yt.rating) # 평균 평점
print("[영상길이(초)]", yt.length)
print("[연령제한여부]", yt.age_restricted)
print("[영상 설명]", yt.description) # 영상 설명
print("[썸네일URL]", yt.thumbnail_url,"\n\n") # 썸네일 url 주소


def on_progress(vid, chunk, bytes_remaining):
    total_size = vid.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = bytes_downloaded / total_size * 100
    totalsz = (total_size/1024)/1024
    totalsz = round(totalsz,1)
    remain = (bytes_remaining / 1024) / 1024
    remain = round(remain, 1)
    dwnd = (bytes_downloaded / 1024) / 1024
    dwnd = round(dwnd, 1)
    percentage_of_completion = round(percentage_of_completion,2)

    #print(f'Total Size: {totalsz} MB')
    print(f'Download Progress: {percentage_of_completion}%, Total Size:{totalsz} MB, Downloaded: {dwnd} MB, Remaining:{remain} MB')

yt = YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download('./imsi')

print(title,"(",url,")", " 가 다운로드 완료 되었습니다.\n")
print("#############################################################\n")

 

1. 다른 부분은 Part II와 동일하며, 다운로드 시 폴더를 지정할 수 있도록 download('./imsi') 와 같이 imsi폴더를 지정해 주었습니다.

 

 

 

2. 영상 다운로드 시 다운받은 영상의 기본적 정보를 표시해주고, 다운로드 상태를 보여준 다음 다운로드가 완료되었습니다.

 

 

 

3. 지정한 './imsi' 폴더에 잘 다운로드 된 것을 확인 할 수 있습니다.

 

 

 

 


 

ㅁ 정리
 
O 우리가 배운 내용
 
 - 오늘은 파이썬으로 유튜브 동영상을 다운로드하는 프로그램을 만들어 보았습니다.
 - 오늘 우리가 배운 내용을 간단히 정리해 보면 다음과 같습니다.
 > 1. 다운로드할 유튜브 동영상 url 주소 복사 후
 > 2. on_progress()함수 사용자 정의(선택사항)
 > 3. 유튜브 영상 다운로드시 화질 설정(예: 720p)
 > 4. 다운로드 폴더 설정(예: './imsi')
 
 
올려드린 프로그램이 간혹 작동되지 않는 경우가 있습니다. 이 문제의 대부분의 원인은 pytube 모듈이 업데이트 되었기 때문인데, 아래와 같이 해보시고 그래도 안되시면 댓글을 남겨주시기 바랍니다.
>pip install --upgrade pytube
 
 
이후 글에서는 유튜브 영상을 한꺼번에 받는 방법에 대해서 올려보도록 하겠습니다.
 

 

위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.

 

 

감사합니다.

 

728x90
반응형
LIST