ㅁ 개요
O 프로그램 소개
- 이번 글은 이전글(파이썬 유튜브 새로운 영상 올라오면 알림 및 실시간 다운로드하기 - 3.변경 사항 체크하기)에 이은 5번째 글로 유튜브 영상을 다운로드 하는 방법을 살펴보며, 영상 화질별로 720p, 1080p 를 받는 방법이 다르므로 각 각 살펴보도록 하겠습니다.
O 완성된 프로그램 실행 화면
- 최종 완성된 프로그램의 결과화면은 아래와 같습니다..
유튜브 영상 다운로드 시 2023.04.27까지 잘되던 코드가 2023.04.28 즈음부터 pytube 모률에러가 발생하여 영상을 다운로드 할 수 없었으며, 그 후 계속 안되다가 2023.05.02일부터 해결방안을 찾아 소스코드에 적용 후 다운로드 할 수 있었습니다.
1.720p 프로그램을 실행하면 아래와 같이 실행됩니다.
((2)번과 (3)번은 아래를 참고 하시기 바랍니다.)
2.아래와 같이 뜨면 계정을 클릭합니다.
3.다시 계정 *****@gmail.com 클릭해 줍니다.
4. 프로그램 실행시에 확인한 코드를 입력해 줍니다.
5. 탐색기에서 확인한 결과 720p영상이 잘 받아 졌습니다.
6.프로그램의 속성 > 자세히 > 프레임 높이 에서 확인결과 720p임을 확인하였습니다.
7. 만일 다시 실행하면 이번에는 인증 없이 잘 다운로드가 됩니다.
8.1080p 프로그램을 실행하면 아래와 같이 실행됩니다.(인증 하지 않음)
비디오 파일과 오디오 파일을 각각 다운로드 하고,
이후 ffmpeg가 실행됩니다.
ffmpeg는 위에서 받은 비디오/오디오 파일에서 영상과 음성 스트림을 뽑아서 합쳐주고, 최종 완성 파일을 만듭니다.
9. 탐색기에서 확인 결과 1080p파일이 잘 만들어 졌고, 실행 시 잘 합쳐진것을 볼 수 있습니다.
10. 1080p 영상 파일의 속성 > 자세히 > 프레임 높이를 확인 결과 1080p임을 확인했습니다.
O 사전 준비 작업
시간이 되시는 분들은 아래 내용을 보시기 전에 이전에 올려 드린 아래 관련글에 설치부터 상세하 내용을 담고 있으니 참고하시기 바랍니다.
[파이썬 실습/유튜브 동영상 다운로드 프로그램 만들기] - 파이썬 유튜브 동영상 다운로드 프로그램 만들기
[파이썬 실습/유튜브 동영상 다운로드 프로그램 만들기] - 파이썬 유튜브 동영상 한꺼번에 다운로드 하는 프로그램 만들기
ㅁ 세부 내용
O 완성된 소스
소스 : 7.download_720p.py
from pytube import YouTube
import os
from conf import *
from datetime import datetime
now=datetime.now()
date__ = str(now.year)+"-"+str(now.month)+"-"+str(now.day)+"-"+str(now.hour)+"-"+str(now.minute)
############################################################################
# 화질 720
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')
def download_youtube_720(title, url):
url = 'https://youtu.be/' + url
print("제목 : ", title, "\t주소 : ", url, " 영상을 다운로드 받습니다.")
YouTube(url, use_oauth=True, allow_oauth_cache=True, on_progress_callback=on_progress).streams.filter(res="720p").first().download()
# YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download()
if os.path.exists(title+'.mp4'):
os.rename(title+'.mp4', title+"_720p_"+date__+'.mp4')
########################################################################
download_youtube_720('파이썬 Voice ChatGPT3.5 만들기 - 1.소개편(voice conversation with chatGPT3.5 - 1.intro)', '5guNSqTlk-0')
# https://youtu.be/5guNSqTlk-0
소스 : 8.download_1080p.py
from pytube import YouTube
import os
from conf import *
import ffmpeg
from datetime import datetime
now=datetime.now()
date__ = str(now.year)+"-"+str(now.month)+"-"+str(now.day)+"-"+str(now.hour)+"-"+str(now.minute)
############################################################################
# 화질 1080
def download_youtube_1080(title, url):
if os.path.exists('video_1080.mp4'):
os.remove('video_1080.mp4')
url = 'https://youtu.be/' + url
print("제목 : ", title, "\t주소 : ", url, " 영상을 다운로드 받습니다.")
# youtube = YouTube(url) # 유튜브 영상 주소
youtube = YouTube(url, use_oauth=True, allow_oauth_cache=True) # 유튜브 영상 주소
video = youtube.streams.filter(res="1080p").first().download()
os.rename(video,"video_1080.mp4")
audio = youtube.streams.filter(only_audio=True)
audio[0].download()
print("video, audio download 완료")
# 비디오와 오디오를 합쳐서 최종 영상 생성
video_stream = ffmpeg.input('video_1080.mp4')
title = title.replace(".","") #<-------- 영상제목에 "." 가 포함된 경우 삭제되므로 이를 제거해 주어야 에러가 발생하지 않음
# '파이썬 GUI Window 폴더 용량체크 프로그램 만들기-3파일및폴더용량 한번에 체크(3check volume file&folder(at a time)).mp4'
# '파이썬 GUI Window 폴더 용량체크 프로그램 만들기-3.파일및폴더용량 한번에 체크(3.check volume file&folder(at a time)).mp4'
audio_stream = ffmpeg.input(title+'.mp4') # 유튜브 영상 제목
ffmpeg.output(audio_stream, video_stream, 'out.mp4').run()
if os.path.exists('video_1080.mp4'):
os.remove('video_1080.mp4')
if os.path.exists(title+'.mp4'):
os.remove(title+'.mp4')
if os.path.exists('out.mp4'):
os.rename('out.mp4', title+"_1080p_"+date__+'.mp4')
########################################################################
download_youtube_1080('파이썬 GUI Window 폴더 용량체크 프로그램 만들기-3.파일및폴더용량 한번에 체크(3.check volume file&folder(at a time))', 'JUgtDlW-wJU')
# https://www.youtube.com/watch?v=JUgtDlW-wJU
# https://youtu.be/JUgtDlW-wJU
O 주요 내용
1. 7.download_720p.py 소스를 간략하게 살펴보겠습니다.
(대부분의 설명은 아래 주석에 달아 놓았으므로 이부분을 참고하여 주시기 바랍니다.)
영상제목이 중복되지 않도록 유니크하게 만들기 위해 날짜관련 변수를 설정해 줍니다.(line 7)
다운로드 진행상황을 보여주기 위해 on_progress()함수를 설정합니다.(line 10~20)
download_youtube_720()함수에서 YouTube()를 이용하여 실제 유튜브 영상을 다운로드 하며, 이번에 바뀐 아래 부분을 추가해 주어야 합니다.(line 29)
YouTube(url, use_oauth=True, allow_oauth_cache=True, on_progress_callback=on_progress).streams.filter(res="720p").first().download()
영상 다운로드가 완료되면 영상의 제목의 중복을 방지하기 위하여 이름을 변경(위의 날짜변수를 추가)해 줍니다.(line 35)
2. 7.download_1080p.py 소스를 간략하게 살펴보겠습니다.
(대부분의 설명은 아래 주석에 달아 놓았으므로 이부분을 참고하여 주시기 바랍니다.)
마찬가지로 아래와 같이 이번에 바뀐 부분을 추가해 주어야 합니다.(line 29)
youtube = YouTube(url, use_oauth=True, allow_oauth_cache=True)
그리고 나서 영상(video)과 음성(audio)을 따로 다운로드 합니다.
위의 과정이 완료되면 ffmpeg 패키지로 위에서 받은 비디오와 오디오의 스트림을 뽑아내어 합쳐줍니다.(line 29~34)
단, 주의할 점이 하나 있는데, 1080p에서 비디오/오디오를 각각 다운로드 시 영상 제목에 "."(점) 이 있는 경우 해당 점이 사라집니다. 따라서 아래와 같이 코드를 넣어 주어야 에러가 발생하지 않습니다.
title = title.replace(".","") #<-------- 영상제목에 "." 가 포함된 경우 삭제되므로 이를 제거해 주어야 에러가 발생하지 않음
(ffmpeg가 설치되지 않으신 분들은 ffmpeg 다운로드 및 환경변수 설정과 관련하여 아래 글을 참고하시기 바랍니다.)
https://pagichacha.tistory.com/161
최종 완성된 파일(out.mp4)이 완성되면 이전에 생성된 불필요한 파일(비디오 및 오디오 임시파일)은 삭제해 주고 최종 파일의 이름을 변경해 주었습니다.
ㅁ 정리
O 우리가 배운 내용
Traceback (most recent call last):
File "D:\100-1 Study\710_Wikidocs\210_wikiDocsAutoBitcoin\620_유튜버&블로그\20230216_파이썬_유튜브영상 변경사항 체크 및 실시간 다운로드하기\최종\7.download_720p.py", line 34, in <module>
download_youtube_720('[AI(인공지능) 미인대회] 인공지능은 과연 어떤 모습을 미인으로 생각할까?', 'Y0WuGHV9dc4')
File "D:\100-1 Study\710_Wikidocs\210_wikiDocsAutoBitcoin\620_유튜버&블로그\20230216_파이썬_유튜브영상 변경사항 체크 및 실시간 다운로드하기\최종\7.download_720p.py", line 29, in download_youtube_720
YouTube(url, on_progress_callback=on_progress).streams.filter(res="720p").first().download()
File "F:\anaconda3\lib\site-packages\pytube\__main__.py", line 296, in streams
return StreamQuery(self.fmt_streams)
File "F:\anaconda3\lib\site-packages\pytube\__main__.py", line 176, in fmt_streams
stream_manifest = extract.apply_descrambler(self.streaming_data)
File "F:\anaconda3\lib\site-packages\pytube\__main__.py", line 161, in streaming_data
return self.vid_info['streamingData']
KeyError: 'streamingData'
>수일에 걸쳐 구글링 확인결과 아래 코드와 같이 빨간색 인증 부분의 코드를 추가해야만 에러가 발생하지 않습니다.
> 2.1080p 화질로 다운로드 받기위해서는 ffmpeg를 사용해야 하며, 영상에서 비디오/오디오를 각 각 다운로드 받은 후 해당 영상/오디오에서 스트림을 추출 후 아래와 같이 합쳐야 합니다.
video_stream = ffmpeg.input('video_1080.mp4')
title = title.replace(".","") #<-------- 영상제목에 "." 가 포함된 경우 삭제되므로 이를 제거해 주어야 에러가 발생하지 않음
# '파이썬 GUI Window 폴더 용량체크 프로그램 만들기-3파일및폴더용량 한번에 체크(3check volume file&folder(at a time)).mp4'
# '파이썬 GUI Window 폴더 용량체크 프로그램 만들기-3.파일및폴더용량 한번에 체크(3.check volume file&folder(at a time)).mp4'
audio_stream = ffmpeg.input(title+'.mp4')
ffmpeg.output(audio_stream, video_stream, 'out.mp4').run()
오늘은 여기까지이며, 댓글과 하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.
위의 내용이 유익하셨다면, 댓글과 하트 부탁드립니다.
감사합니다.
※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.