from pytube import YouTube
import tkinter as tk
from tkinter import Menu
from tkinter import messagebox as msg
from tkinter import font
from tkinter import filedialog
from tkinter import ttk
import os
from time import sleep
from threading import Thread
import glob
import os.path
from tkinter import messagebox
class Application(tk.Frame):
def __init__(self,master):
super().__init__(master)
self.pack()
self.master.geometry("600x500")
self.master.title("유트브 동영상 파일 및 MP3 다운로드 프로그램 ")
self.master.resizable(False, False)
# ---------------------------------------
# Favicon
# ---------------------------------------
#self.iconfile = "./favicon.ico"
#self.master.iconbitmap(default=self.iconfile)
self.create_widgets()
def create_widgets(self):
# ---------------------------------------
# font
# ---------------------------------------
self.font01 = font.Font(family="Helvetica", size=15, weight="normal")
self.font02 = font.Font(family='Helvetica', size=15, weight='bold')
self.font03 = font.Font(family='Helvetica', size=20, weight='bold' )
self.font04 = font.Font(family='Helvetica', size=11, weight='bold' )
self.font05 = font.Font(family='Helvetica', size=11, weight='bold' )
# ---------------------------------------
# Menu
# ---------------------------------------
self.menu_bar = Menu( self.master )
self.master.config( menu=self.menu_bar )
self.file_menu = Menu( self.menu_bar, tearoff=0 )
self.file_menu.add_command( label='종료', command=self._quit )
self.menu_bar.add_cascade( label='파일', menu=self.file_menu )
# Add another help menu
self.help_menu = Menu( self.menu_bar, tearoff=0 )
self.help_menu.add_command( label='About', command=self._msgBox )
self.menu_bar.add_cascade( label='Help', menu=self.help_menu )
# ---------------------------------------
# Main Label
# ---------------------------------------
self.lbl_main = ttk.Label(self.master, text = '유투브 동영상 및 MP3 다운로드 프로그램', font=self.font03)
self.lbl_main.place(relx = 0.10, rely = 0.09)
self.lbl_main1 = ttk.Label(self.master, text = '', font=self.font04)
self.lbl_main1.place(relx = 0.10, rely = 0.19)
# ---------------------------------------
# Frame : URL Input Form, Downloader Folder
# ---------------------------------------
self.frame_form = tk.Label(self.master)
self.frame_form.place(relx = 0.01 , rely = 0.25, height = 400 , width= 580 )
# ---------------------------------------
# URL Input Form
# ---------------------------------------
self.lbl_URL = ttk.Label(self.frame_form, text = 'URL')
self.lbl_URL.configure(font=self.font01)
self.lbl_URL.grid(column=0, row=0, padx = 10, pady= 10)
self.URL_name = tk.StringVar()
self.ent_URL = ttk.Entry(self.frame_form, textvariable = self.URL_name)
self.ent_URL.configure(width = 35, font= self.font01)
self.ent_URL.grid(column=1, row=0, padx = 10, pady= 10)
self.ent_URL.focus()
#st = StringVar()
self.Radiovar = tk.IntVar()
self.Radiovar.set(1)
self.Radio_button1 = tk.Radiobutton(self.frame_form, text='동영상(MP4)',variable=self.Radiovar,value=1, font = 'arial 15' , padx = 2)
self.Radio_button2 = tk.Radiobutton(self.frame_form, text='음 원(MP3)',variable=self.Radiovar,value=2, font = 'arial 15' , padx = 2)
self.Radio_button1.grid(row=7,column=1,ipadx=3,ipady=3, padx=2, pady=2 )
self.Radio_button2.grid(row=8,column=1,ipadx=3,ipady=3, padx=2, pady=2 )
# ---------------------------------------
# Download Folder
# ---------------------------------------
self.Folder_name = tk.StringVar()
self.lbl_folder = ttk.Label( self.frame_form, text='다운로드\n폴더경로' )
self.lbl_folder.configure( font=self.font01 )
self.lbl_folder.grid( column=0, row=1, padx=10, pady=10 )
self.ent_Folder = ttk.Entry(self.frame_form,textvariable = self.Folder_name)
self.ent_Folder.configure(width =35,font= self.font01)
self.ent_Folder.grid(column=1, row=1, padx=10, pady=10)
self.btn_Folder = tk.Button( self.frame_form, text = '선택')
self.btn_Folder.configure(font = self.font02)
self.btn_Folder.grid(column=2, row=1, padx=10, pady=10, sticky=tk.W + tk.E )
self.btn_Folder.configure( command= self._get_Folder_Path)
# ---------------------------------------
# Start Button
# ---------------------------------------
self.btn_Start = tk.Button(self.frame_form, text = '다운로드')
self.btn_Start.configure( font= self.font02 )
self.btn_Start.grid( column=1, row=2, padx=10, pady=10, sticky= tk.W + tk.E )
self.btn_Start.configure( command = self.click_me)
#
# ---------------------------------------
# Progress Bar
# ---------------------------------------
self.progress_bar = ttk.Progressbar(self.frame_form, orient='horizontal', length=286, mode = 'determinate')
self.progress_bar.grid(column=1, row=3, padx=10, pady=12,sticky=tk.W + tk.E)
# ---------------------------------------
# Create Callback Functions
# ---------------------------------------
#Python Treading to prevent GUI freezing.
def click_me(self):
self.create_thread()
def create_thread(self):
self.run_thread = Thread( target=self.method_in_a_thread )
self.run_thread.start()
print(self.run_thread)
def method_in_a_thread(self):
print('New Thread is Running.')
self.get_youtube( self.URL_name.get(), self.Folder_name.get(), self.Radiovar.get())
# Display a Message Box
def _msgBox(self):
msg.showinfo('프로그램 버전', 'Youtube Downloader 2022. 3')
# Youtube Download Function
def get_youtube(self, y_url, download_folder, check_lea):
print(check_lea)
yt = YouTube(y_url)
print(len(y_url))
if(check_lea == 1):
self.lbl_main1.configure(text="조회결과:"+yt.title, font=self.font04)
self.btn_Start.configure(text="확인중입니다")
#Youtube Instance
print("type: mp4")
print("Title: ",yt.title)
print("Number of views: ",yt.views)
print("Length of video: ",yt.length)
print("Rating of video: ",yt.rating)
yt.streams.filter(progressive=True ,subtype='mp4' ).get_highest_resolution().download( download_folder+"/mp4/" )
else:
self.lbl_main1.configure(text="조회결과:"+yt.title, font=self.font04)
self.btn_Start.configure(text="확인중입니다")
print("type: mp3")
yt.streams.filter(only_audio=True).all()
yt.streams.filter(only_audio=True).first().download(download_folder+"/mp3/")
print("success")
files = glob.glob(download_folder+"/mp3/*.mp4")
for x in files:
if not os.path.isdir(x):
filename = os.path.splitext(x)
try:
print("음원 success")
os.rename(x,filename[0] + '.mp3')
except:
pass
print("음원 pass")
#progress bar
self.progress_bar["maximum"] = 100
for i in range(101):
sleep(0.05)
self.progress_bar["value"]= i
self.progress_bar.update()
self.btn_Start.configure(text=str(i)+"% 다운로드중입니다")
self.lbl_main1.configure(text="다운로드 완료되었습니다", font=self.font04)
self.btn_Start.configure(text="다운로드")
messagebox.showinfo("다운로드완료","다운로드를 완료하였습니다.\n반드시 코덱을 확인해주세요!") #메시지 박스를 띄운다.
# Exit GUI cleanly
def _quit(self):
self.master.quit()
self.master.destroy()
exit()
# Get Folder Path
def _get_Folder_Path(self):
iDir = os.path.abspath(os.path.dirname(__file__))
folder_Path = filedialog.askdirectory(initialdir = iDir)
self.Folder_name.set(folder_Path)
def main():
root = tk.Tk()
app = Application(master=root)#Inherit
app.mainloop()
if __name__ == "__main__":
main()