파이썬 실습/유튜브 새로운 영상 올라오면 알림 및 실시간 다운로드하기

파이썬 유튜브 새로운 영상 올라오면 알림 및 실시간 다운로드하기 - 4.유튜브 영상 다운로드 하기

파기차차 2023. 6. 9. 21:53
728x90
반응형
SMALL

ㅁ 개요

 

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

 

 

 

 - 소스파일을 cmd, 파워쉘 또는 vscode 등에서 아래와 같이 실행하시기 바랍니다.
 

 

 > python 7.download_720p.py
 > python 8.download_1080p.py

 

 

 


 
 

 

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 우리가 배운 내용

 

 

 - 오늘은 유튜브 영상을 다운로드 하는 방법을 영상 화질별(720p, 1080p)로 각 각 알아보았습니다.
 
 - 오늘 우리가 배운 내용을 간략히 정리해 보면 아래와 같습니다.
 > 1.2023.04.28 즈음부터 pytube 모률에러가 발생하였습니다.
에러 메시지

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'
 

>수일에 걸쳐 구글링 확인결과 아래 코드와 같이 빨간색 인증 부분의 코드를 추가해야만 에러가 발생하지 않습니다.

(이 경우에도 별도 인증을 1회 거쳐야 합니다. (그 후 추가 인증은 하지 않음) )
YouTube(url, use_oauth=True, allow_oauth_cache=True, on_progress_callback=on_progress).streams.filter(res="720p").first().download()

 

 > 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()

 

 

 

 

오늘은 여기까지이며, 댓글하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.

위의 내용이 유익하셨다면, 댓글과 하트 부탁드립니다.

 

 

 

 

감사합니다.

 

 

 

※ 추가적인 정보는 아래 유튜브 영상에서 해당 내용을 더욱 자세히 보실 수 있습니다.

 

 

728x90
반응형
LIST