[Python] 유튜브 동영상 다운로드 프로그램 만들기

     

    안녕하세요?

    파이썬으로 유튜브 동영상 다운로드 프로그램을 만들어 보겠습니다.

    아래와 같이 생겼습니다.

     

    유튜브 영상 주소를 입력하고 클릭 버튼을 누르면 최대 720p의 화질로 영상이 다운됩니다.

     

    더 높은 화질의 경우에는 유튜브에서 영상과 음성을 따로 가지고 있다가 합쳐서 보내주는 시스템이라, 영상과 음성을 각각 받아야 해서 조금 번거롭습니다. 720p 이상의 고화질/고음질의 영상/음성 파일을 받는 것은 나중에 별도 게시물에서 다루겠습니다.

     

     

    1. 준비물

     - pytube (유튜브 영상 다운로드)

     - PyQt5 (GUI 프로그램 만들기)

     

    설치 하기

    pip install pytube
    pip install PyQt5

     

     

     

    2. 유튜브 다운로드 기능 쓰기

    코드

    from pytube import YouTube
    
    def download_video(url):
        YouTube(url).streams.get_highest_resolution().download()
    
    download_video("https://www.youtube.com/watch?v=cj_8wUhYk_o")

     

    실행하면 아래와 같이 아이유의 밤편지 티저 영상이 다운로드 됩니다.

    pytube에 더욱 다양한 기능들이 여기서는 단순히 주소를 입력하여 영상을 다운 받는 기능만 사용하겠습니다.

    기능을 간단히 함수로 만들었으니 이제 PyQt로 UI를 만들고 연결하면 됩니다.

     

     

     

    3. GUI로 만들기

     

    1) UI 만들기

    import sys
    from PyQt5.QtWidgets import *
    from pytube import YouTube
    
    
    def download_video(url):
        YouTube(url).streams.get_highest_resolution().download()
    
    
    class Window(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("Youtube Downloader")
            self.setGeometry(100, 100, 350, 80)
            self.UI()
    
        def UI(self):
            self.urlLineEdit=QLineEdit(self)
            self.urlLineEdit.resize(300,20)
            self.urlLineEdit.move(10,10)
            self.urlLineEdit.setPlaceholderText("Enter youtube url")
    
            clickBtn=QPushButton("Click", self)
            clickBtn.move(20, 40)
            clickBtn.clicked.connect(self.click)
            self.show()
    
        def click(self):
            pass
    
    
    def main():
        App = QApplication(sys.argv)
        window=Window()
        sys.exit(App.exec_())
    
    if __name__ == '__main__':
        main()

     

    실행하면 아래와 같은 창이 실행됩니다.

    클릭 버튼을 클릭해도 아무 반응이 없습니다.

     

    대부분의 코드가 직관적이라 별도 설명은 필요가 없을 것 같고 아래 부분만 살펴보면 됩니다.

            clickBtn.clicked.connect(self.click)

    'clickBtn'을 누르면 self.click이 실행이 됩니다.

    self.click 함수는 아직 아무 내용이 없으므로 버튼을 클릭해도 반응이 없습니다. 

     

    이제 클릭을 누르면 LineEdit에 입력된 URL을 읽어와서, 맨 처음에 만들었던 download_video 함수에 집어넣고 실행하는 기능을 구현을 해야 합니다.

     

     

    2) 클릭 버튼에 다운로드 함수 연결하기

        def click(self):
            url = self.urlLineEdit.text()
            download_video(url)

    클릭을 위와 같이 수정하고 실행하면, 제대로 된 url이 입력되었을 경우 동영상을 다운로드 합니다.

    테스트를 위해서는 짧은 길이의 영상을 사용할 것을 추천합니다.

     

    이제 작동은 되는데, 잘 된건지 안 된건지 알수가 없으니 알림을 띄우는 기능을 추가하겠습니다.

     

     

     

    3) 성공 혹은 에러 발생시 알림 창 띄우기

     

    클릭 함수 밑에 아래와 같이 알림 창을 띄우는 함수를 선언합니다. 

        def messageBox(self, text):
            QMessageBox.information(self,"Youtube Downloader", text)

    QMessageBox의 두번째 인수가 알림 창의 타이틀이고, 세번째 인수가 내용입니다.

     

     

    클릭 함수를 아래와 같이 수정합니다.

        def click(self):
            url = self.urlLineEdit.text()
            try:
                download_video(url)
                self.messageBox("Finished")
            except:
                self.messageBox("Something wrong")

    영상 다운로드를 try 안으로 집어넣고,

     - 실행이 완료되면 'Finished' 알림

     - 예외 발생시 'Something wrong' 알림 하도록 했습니다.

     

     

    정상 실행시
    에러 발생시

     

     

     

    4. 전체 코드

    여기까지 전체 코드는 아래와 같습니다.

     

    main.py

    import sys
    from PyQt5.QtWidgets import *
    from pytube import YouTube
    
    
    def download_video(url):
        YouTube(url).streams.get_highest_resolution().download()
    
    
    class Window(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("Youtube Downloader")
            self.setGeometry(100, 100, 350, 80)
            self.UI()
    
        def UI(self):
            self.urlLineEdit=QLineEdit(self)
            self.urlLineEdit.resize(300, 20)
            self.urlLineEdit.move(10, 10)
            self.urlLineEdit.setPlaceholderText("Enter youtube url")
    
            clickBtn = QPushButton("Click", self)
            clickBtn.move(20, 40)
            clickBtn.clicked.connect(self.click)
            self.show()
    
        def click(self):
            url = self.urlLineEdit.text()
            try:
                download_video(url)
                self.messageBox("Finished")
            except:
                self.messageBox("Something wrong")
    
        def messageBox(self, text):
            QMessageBox.information(self, "Youtube Downloader", text)
    
    
    def main():
        App = QApplication(sys.argv)
        window = Window()
        sys.exit(App.exec_())
    
    
    if __name__ == '__main__':
        main()

     

     

     

    5. 기타 - exe 파일 만들기

    원래는 exe 파일까지 만드려고 했으나, Anaconda 가상환경과 PyQt의 특성 상 용량이 너무 커지는 문제가 있네요

     

    크기가 35메가

     

    만약 해보고 싶은 분들이 계시다면

     

    1) 우선 가상환경을 만들어서 위의 프로그램에 필요한 pytueb와 pyqt를 설치하시구요

    2) 실행파일을 만들기 위한 pyinstaller 를 설치합니다.

    pip install pyinstaller

     

    3) 가상환경에서 pyistaller로 실행파일을 만듭니다.

    pyinstaller -F -w main.py

     

     

    4) 완료가 되면 dist폴더에 exe 파일이 생성되어 있습니다.

     

     

    6. 끝

    댓글

    Designed by JB FACTORY