본문 바로가기
code/Python

Python으로 Youtube_Downloader만들기

by 0x01 2024. 1. 6.

Project : Youtube_Downloader

 

준비물 : Python, Visual Studio Code

 

Python과 Visual Studio Code를 이용하여 Youtube_Downloader 를 만들어보자.

 

chatgpt에게 모르는 것들을 물어가면 완성한 코드를 먼저 보자.

 

chatgpt는 정말 나에게 신인거 같아.

 

전체코드

import tkinter as tk
from tkinter import filedialog
from pytube import YouTube
from tkinter import ttk

def select_download_directory():
    download_dir = filedialog.askdirectory()
    if download_dir:
        download_dir_entry.delete(0, tk.END)
        download_dir_entry.insert(0, download_dir)

def download_video():
    url = url_entry.get()
    download_dir = download_dir_entry.get()
    try:
        yt = YouTube(url, on_progress_callback=show_progress)
        title = yt.title
        status_label.config(text="Downloading...")
        
        if download_dir:
            stream = yt.streams.filter(res="720p").first()
            stream.download(download_dir)
            status_label.config(text=f"{title} downloaded successfully to {download_dir}.")
        else:
            status_label.config(text="Please select a download directory.")
    except Exception as e:
        status_label.config(text="Error: Invalid URL or download failed.")

def show_progress(stream, chunk, bytes_remaining):
    total_size = stream.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = (bytes_downloaded / total_size) * 100
    percentage_of_completion = round(percentage_of_completion, 2)
    progress_label.config(text=f"Progress: {percentage_of_completion}%")

# Create a GUI window
window = tk.Tk()
window.title("YouTube Video Downloader")

# Calculate screen width and height
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()

# Calculate the position for the window to be in the center
x = (screen_width - 500) // 2  # Adjust '500' as needed for window width
y = (screen_height - 300) // 2  # Adjust '300' as needed for window height

# Set the window's position
window.geometry(f"500x300+{x}+{y}")

# Create a label for instructions
instructions_label = tk.Label(window, text="Enter the YouTube video URL:")
instructions_label.pack()

# Create an entry field for the URL
url_entry = tk.Entry(window, width=50)
url_entry.pack()

# Create a label and entry field for download directory
download_dir_label = tk.Label(window, text="Download Directory:")
download_dir_label.pack()
download_dir_entry = tk.Entry(window, width=50)
download_dir_entry.pack()

# Create a button to select download directory
select_dir_button = ttk.Button(window, text="Select", command=select_download_directory, style="TButton")
select_dir_button.pack()

# Create a button to initiate download
download_button = ttk.Button(window, text="Download", command=download_video, style="TButton")
download_button.pack()

# Create a label to display download status
status_label = tk.Label(window, text="")
status_label.pack()

# Create a label to display download progress
progress_label = tk.Label(window, text="")
progress_label.pack()

# Create a style for the buttons
style = ttk.Style()
style.configure("TButton", padding=10, relief="solid")

# Start the GUI loop
window.mainloop()

 

코드 실행시 이런 프로그램 창이 생성이 되고,

 

Youtube video URL 주소를 첫번째 줄에 입력한다.

 

두번째 줄에 다운 받을 주소를 수기 입력을 해도 되고, Select 버튼을 눌러 폴더를 선택 하여준다.

 

이후 다운 로드를 하게 되면 mp4 파일로 다운을 받을 수가 있다.

 

 

완료시  유튜브에 영상 제목과, 다운받은 주소 Progress: 100.0% print 문을 출력 후 완료된다.

 

 

다운이 잘 되었다. 

 

 

영상도 잘 나온다 

 

코드리뷰 :

#1. tkinter와 필요한 모듈을 가져오는 부분:

import tkinter as tk
from tkinter import filedialog
from pytube import YouTube
from tkinter import ttk

#이 부분에서는 tkinter 및 관련 모듈을 가져옵니다.
#다운로드 디렉토리 선택 함수 select_download_directory:

def select_download_directory():
    download_dir = filedialog.askdirectory()
    if download_dir:
        download_dir_entry.delete(0, tk.END)
        download_dir_entry.insert(0, download_dir)
        
#이 함수는 다운로드 디렉토리를 선택하는 대화상자를 열고 선택된 디렉토리 경로를 입력 필드에 표시합니다.
#동영상 다운로드 함수 download_video:

def download_video():
    url = url_entry.get()
    download_dir = download_dir_entry.get()
    try:
        yt = YouTube(url, on_progress_callback=show_progress)
        title = yt.title
        status_label.config(text="Downloading...")
        
        if download_dir:
            stream = yt.streams.filter(res="720p").first()
            stream.download(download_dir)
            status_label.config(text=f"{title} downloaded successfully to {download_dir}.")
        else:
            status_label.config(text="Please select a download directory.")
    except Exception as e:
        status_label.config(text="Error: Invalid URL or download failed.")

#이 함수는 입력된 YouTube URL에서 동영상을 다운로드합니다. 다운로드 진행 상황을 표시하는 show_progress 콜백 함수를 사용하며, 선택된 다운로드 디렉토리에 720p 해상도의 동영상을 다운로드합니다.
#다운로드 진행 상황 표시 콜백 함수 show_progress:

def show_progress(stream, chunk, bytes_remaining):
    total_size = stream.filesize
    bytes_downloaded = total_size - bytes_remaining
    percentage_of_completion = (bytes_downloaded / total_size) * 100
    percentage_of_completion = round(percentage_of_completion, 2)
    progress_label.config(text=f"Progress: {percentage_of_completion}%")

이 함수는 다운로드 진행 상황을 계산하고 progress_label 레이블에 표시합니다.
#GUI 창 생성 및 위젯 추가:

# Create a GUI window
window = tk.Tk()
window.title("YouTube Video Downloader")

# 창의 위치 및 크기 설정

# Create a label for instructions
instructions_label = tk.Label(window, text="Enter the YouTube video URL:")
instructions_label.pack()

# Create an entry field for the URL
url_entry = tk.Entry(window, width=50)
url_entry.pack()

# Create a label and entry field for download directory
download_dir_label = tk.Label(window, text="Download Directory:")
download_dir_label.pack()
download_dir_entry = tk.Entry(window, width=50)
download_dir_entry.pack()

# Create a button to select download directory
select_dir_button = ttk.Button(window, text="Select", command=select_download_directory, style="TButton")
select_dir_button.pack()

# Create a button to initiate download
download_button = ttk.Button(window, text="Download", command=download_video, style="TButton")
download_button.pack()

# Create a label to display download status
status_label = tk.Label(window, text="")
status_label.pack()

# Create a label to display download progress
progress_label = tk.Label(window, text="")
progress_label.pack()

# Create a style for the buttons
style = ttk.Style()
style.configure("TButton", padding=10, relief="solid")

# Start the GUI loop
window.mainloop()

#이 부분은 GUI 창을 생성하고 다양한 위젯(레이블, 입력 필드, 버튼 등)을 추가하여 사용자와 상호작용할 수 있도록 합니다.

 

필요한 것이 있을 때마다 하나씩 만들어서 리뷰하는 형식으로 공부를 하는것도 좋은 방법이 될 것 같다.

 

'code > Python' 카테고리의 다른 글

Python으로 ToDoList 만들기  (1) 2023.12.31