상세 컨텐츠

본문 제목

파이썬으로 유튜브 동영상 및 MP3 다운로드 GUI

본문

반응형
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()
반응형

관련글 더보기