본문 바로가기
코딩 연습

유뷰트 영상 다운로드 - 파이썬 tkinter

by good4me 2022. 9. 13.

goodthings4me.tistory.com

예전에 파이썬 라이브러리로 유튜브 영상을 추출하는 소스코드를 올렸다가 라이브러리의 코드 에러가 발생하여 사용을 못했는데 라이브러리가 수정되어 최근에 다시 반영하였다. 이에 유튜브 영상 다운로드하는 프로그램을 파이썬 tkinter로 만들어보고 소스코드와 프로그램을 올려본다. 

 

※이전 포스팅 글

유튜브 다운로드 에러 - 파이썬 pytube 오류 조치

유튜브 영상 다운로드 (파이썬 라이브러리 pytube.YouTube)

(위 포스팅은 참고 사이트이며, 소스코드와 프로그램은 여기를 참고하면 됨)

 

유튜브 동영상 추출 및 저장하는 소스코드와 다운로드 프로그램

☞ 프로그램 다운로드 : 네이버 MyBox에서 공유

 

[유튜브 영상 다운로드(파일 1개씩) 파이썬 소스 코드]

from tkinter import *
import tkinter.messagebox as msgbox
import os
import webbrowser
from pytube import YouTube
from pytube.cli import on_progress


root = Tk()
root.title('Youtube 영상 추출')
root.geometry('450x410+700+100')
root.resizable(False, False)


def youtube_download(file_url):

    # 저장 폴더 만들기
    save_folder = './youtube_download'
    if not os.path.exists(save_folder):
        os.mkdir(save_folder)
    else:
        pass
    
    yt = YouTube(file_url, on_progress_callback=on_progress)
    print(yt.title)
    list_content_view.delete(0, END)  # 리스트박스 내 모든 item 제거
    list_content_view.insert(END, '다운로드 파일명 : ')
    if len(yt.title) <= 40:
        title1 = yt.title
        list_content_view.insert(END, title1)
    else:
        title1 = yt.title[:41]
        title2 = yt.title[41:]
        list_content_view.insert(END, title1)
        list_content_view.insert(END, title2)
    list_content_view.insert(END, f'영상 길이 : {yt.length} sec. [{str(yt.length // 60).zfill(2)}:{str(yt.length % 60).zfill(2)}]')
    list_content_view.update()

    list_content_view.insert(END, '=============================================')
    list_content_view.insert(END, '파일을 받는중입니다. 하단 "실행중..." 표시가')
    list_content_view.insert(END, '"추출 작업 완료!!"로 변경될 때까지 조금만 기다리세요.')
    list_content_view.insert(END, '=============================================')
    list_content_view.update()

    down_clip = yt.streams.get_highest_resolution().download(save_folder)
    list_content_view.insert(END, '파일 다운로드 완료...')
    list_content_view.update()


# 프로그램 닫기
def func_quit():
    root.quit()  # root.destroy()


# 시작 버튼
def start():
    # 입력란이 비었는지 확인
    if not len(txt_entry_url.get()):
        msgbox.showwarning('Info', '유튜브 주소(URL)를 입력하세요!')
        return

    url = txt_entry_url.get()
    if len(txt_entry_url.get()):
        state_var.set(f'실행중.....')
        root.update_idletasks()
        file_list = youtube_download(url)  # 함수 호출
        state_var.set('추출 작업 완료..!!')
    else:
        msgbox.showerror('오류', '내용을 정확하게 입력하세요!')
        return


def read_me():
    msgbox.showwarning('Info', '유튜브 주소(URL)의 영상을 추출하여 파일로 저장합니다.\n\n'
                             '유튜브 주소(URL)를 마우스로 드래그하여 복사하거나,\n'
                             '유튜브 영상 위에서 마우스 우클릭 후 "동영상 URL 복사"를\n'
                             '클릭합니다.\n\n'
                             '프로그램 입력란("유튜브 URL:")에 붙여넣기(Ctrl+V) 한 후\n'
                             '"추출 시작" 버튼을 클릭하면 실행이 됩니다.\n\n'
                             '유튜브 웹페이지 소스 코드가 바뀌면 실행이 안 될수 있습니다.\n\n'
                             '잘못된 URL을 입력하면 영상 추출이 안되거나 오류가 발생하여\n'
                             '프로그램이 중지될 수 있습니다.\n\n'
                             '궁금한 사항은 haemil40@nate.com 으로 문의해주세요.')


def callback(url):
    webbrowser.open_new(url)


# 사용법 표시 들어갈 공간
lbl_use_frame = Frame(root)
lbl_use_frame.pack(fill='x', padx=2, pady=2)

txt_url = '유튜브 영상 다운로드 >>>'
lbl_url_txt = Label(lbl_use_frame, text=txt_url, font=('Helveticabold', 11, 'bold'), justify='left', fg='blue', cursor='hand2')
lbl_url_txt.pack(side='left', fill='x', padx=7, pady=5, ipadx=1)
lbl_url_txt.bind('<Button-1>', lambda e: callback('https://blog.naver.com/borame365/222594667168'))


# URL 입력 설명 LabelFrame
url_frame = LabelFrame(root, text="유튜브 URL 입력 후 '추출 시작' 버튼을 클릭하세요.")
url_frame.pack(fill="x", padx=10, pady=5, ipady=5)

# URL 입력 레이블
lbl_url = Label(url_frame, text='유튜브 URL :', width=10)
lbl_url.configure(font=('Arial', 10, 'bold'))
lbl_url.pack(side='left', padx=5, pady=5)

# URL 입력 란
txt_entry_url = Entry(url_frame)
txt_entry_url.insert(0, '')
txt_entry_url.pack(side='left', fill='x', expand=True, padx=5, pady=5)

# URL 추출 - 텍스트 파일 저장 알림
lbl_ex_frame = Frame(root)
lbl_ex_frame.pack(fill='x', padx=8, pady=0)

lbl_ex_url1 = Label(lbl_ex_frame, text='* youtube_download 폴더에 영상 다운로드됨')
lbl_ex_url1.pack(side='left')

# URL 입력 레이블 - 오른쪽(Read Me)
btn_url = Button(lbl_ex_frame, text='Read Me', width=7, command=read_me)
btn_url.pack(side='right', padx=5, pady=5)


# 리스트 프레임 - 데이터 추출 시 보이게 하는 Listbox 공간의 프레임
list_frame = Frame(root)
list_frame.pack(fill='both', padx=10, pady=5)

# 리스트박스 우측 스크롤
scrollbar = Scrollbar(list_frame)
scrollbar.pack(side='right', fill='y')

# 리스트박스 - 데이터 출력 현황 보이게 하는 곳
list_content_view = Listbox(list_frame, height=8, yscrollcommand=scrollbar.set)
list_content_view.pack(side='left', fill='both', expand=True)
scrollbar.config(command=list_content_view.yview)


# 프로그램 실행 표시 들어갈 공간
lbl_execute_frame = Frame(root)
lbl_execute_frame.pack(fill='x', padx=5, pady=5)

state_var = StringVar()
state_var.set(' ')
lbl_state_txt = Label(lbl_execute_frame, textvariable=state_var)
lbl_state_txt.configure(font=('Arial', 12, 'bold', 'italic'))
lbl_state_txt.pack(side='right', fill='x', padx=5, pady=5)


# 실행 프레임 - 시작, 닫기
frame_run = Frame(root)
frame_run.pack(fill='x', padx=10, pady=5)

btn_close = Button(frame_run, padx=5, pady=5, text='닫기', width=12, fg='black', cursor='hand2', command=func_quit)
btn_close.pack(side='right', padx=5, pady=5)

btn_start = Button(frame_run, padx=5, pady=5, text='추출 시작', width=12, fg='black', cursor='hand2', command=start)
btn_start.configure(font=('Arial', 10, 'bold'))
btn_start.pack(side='right', padx=5, pady=5)


root.mainloop()

위 소스코드는 

  • 유튜브 동영상을 추출하는 파이썬 라이브러리인 pytube를 사용하여 유튜브 영상 1개씩을 저장할 수 있는 코드와
  • 파이썬 Tkinter 모듈을 사용해서 일반 사용자들이 사용할 수 있도록 프로그램으로 만들었다.
  • 물론, 유튜브 영상 저장 라이브러리에 문제가 발생하면 실행이 안 될 수 있다. 
  • 유튜브 영상 추출하는 파이썬 라이브러리는 pytube는 pip install pytube 명령으로 설치한다.

 

good4me.co.kr

 

[실행 결과 - 터미널]

(venv) D:\python\pyinstaller>d:/python/pyinstaller/venv/Scripts/python.exe d:/python/pyinstaller/youtube_movie_download2_tkinter_posting.py
[케스코 원데이 시공]  봄날 샷시 교체만으로 집안이 확 밝아집니다!
 ↳ |████████████████████| 100.0%
(venv) D:\python\\pyinstaller>

 

 

※ 유튜브 다운로드 프로그램 사용법

☞ 프로그램 다운로드 : 네이버 MyBox에서 공유

 

Windows 10 이나 11에서 프로그램 실행 시 다음과 같은 메시지 창이 뜰 경우,

 

"추가 정보"를 클릭하고 "실행"을 클릭한다.

 

 

▶ 프로그램 사용법

유튜브 다운로드 프로그램 실행
유튜브 다운로드 프로그램 실행

파일 다운로드 후 실행하면 위 이미지처럼 보인다.

(간혹, 특정 보안프로그램에서 바이러스가 있는 것으로 오인하는 경우가 있는데, 바이러스 확인 사이트(https://www.virustotal.com/)에서 체크 후 올리는 프로그램이며, 하단에 체크 결과 이미지 있음)

 

유뷰브 영상 추출 프로그램
유뷰브 영상 추출 프로그램

유튜브 URL 란에 유튜브 주소(URL)를 입력하지 않고 추출 시작 버튼을 클릭한 경우이며, URL을 정확하게 입력한 후 "추출 시작" 버튼을 클릭한다.

 

유튜브 다운로드 프로그램 사용 방법
유튜브 다운로드 프로그램 사용 방법

유튜브 주소(URL)의 영상을 추출하여 파일로 저장합니다

  1. 유튜브 주소(URL)를 마우스로 드래그하여 복사하거나, 유튜브 영상 위에서 마우스 우클릭 후 "동영상 URL 복사"를 클릭합니다.
  2. 프로그램 입력란("유튜브 URL:")에 붙여넣기(Ctrl+V) 한 후 "추출 시작" 버튼을 클릭하면 실행이 됩니다.
  3. 유튜브 웹페이지 소스 코드가 바뀌면 실행이 안 될수 있습니다.
  4. 잘못된 URL을 입력하면 영상 추출이 안되거나 오류가 발생하여 프로그램이 중지될 수 있습니다.

 

유튜브 영상 URL 입력
유튜브 영상 URL 입력

※ 영상 주소 : https://www.youtube.com/watch?v=PR-pT2_mlVY&t=4s 

 

위 영상 주소(URL)을 입력하고 "추출 시작" 버튼을 클릭하면 아래 이미지처럼 실행된다.

 

유튜브 영상 추출 시작
유튜브 영상 추출 시작

유튜브 동영상 파일을 다운로드하는 시간이 필요하다.

중간 메시지 내용에서 설명하고 있듯이 하단에 "실행중...."이라고 표시가 되고 파일 받기가 완료되면 "추출 작업 완료!!" 메시지가 나타날 때까지 기다려야 한다.

 

유튜브 영상 다운로드 완료
유튜브 영상 다운로드 완료

유뷰브 동영상 저장이 완료되었다.

추가로 더 받으려면, 유튜브 URL에 다시 URL을 복사하여 붙여넣고 "추출 시작" 버튼을 클릭한다.

 

 

※ 바이러스 오인 프로그램 1개

 

 

 

댓글