Python is a multi-purpose programming language and is widely used for scripting small tasks. Let’s see how to make your own Youtube Playlist Downloader using Python. Though there are many software available in the market but making your own serving that purpose is quite a learning and impressive as well.
Modules needed:
- BeautifulSoup bs4
- PyQt5
- PyQtWebEngine
- sys module
- urllib module
- pytube module
How does it work?
From the given URL of a YouTube playlist, our program will perform web scraping and fetch all the YouTube video links and append it under a links array. Then using the pytube library we will download the corresponding YouTube videos from the link in the links array. The parameters for downloading the YouTube video (quality, mime_type, etc) can be specified in the streams constructor. The videos will be downloaded with the name of the original video.
Let’s see the code:
Python3
# Importing libraries import bs4 as bs import sys import urllib.request from PyQt5.QtWebEngineWidgets import QWebEnginePage from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import QUrl import pytube # library for downloading youtube videos class Page(QWebEnginePage): def __init__( self , url): self .app = QApplication(sys.argv) QWebEnginePage.__init__( self ) self .html = '' self .loadFinished.connect( self ._on_load_finished) self .load(QUrl(url)) self .app.exec_() def _on_load_finished( self ): self .html = self .toHtml( self . Callable ) print ( 'Load finished' ) def Callable ( self , html_str): self .html = html_str self .app.quit() links = [] def exact_link(link): vid_id = link.split( '=' ) # print(vid_id) str = "" for i in vid_id[ 0 : 2 ]: str + = i + "=" str_new = str [ 0 : len ( str ) - 1 ] index = str_new.find( "&" ) return new_link # Scraping and extracting the video # links from the given playlist url page = Page(url) count = 0 soup = bs.BeautifulSoup(page.html, 'html.parser' ) for link in soup.find_all( 'a' , id = 'thumbnail' ): # not using first link because it is # playlist link not particular video link if count = = 0 : count + = 1 continue else : try : # Prevents error for links with no href. vid_src = link[ 'href' ] # print(vid_src) # keeping the format of link to be # given to pytube otherwise in some cases new_link = exact_link(vid_src) # error might occur due to this # print(new_link) # appending the link to the links array links.append(new_link) except Exception as exp: pass # No function necessary for invalid <a> tags. # print(links) # downloading each video from # the link in the links array for link in links: yt = pytube.YouTube(link) # Downloaded video will be the best quality video stream = yt.streams. filter (progressive = True , file_extension = 'mp4' ).order_by( 'resolution' ).desc().first() try : stream.download() # printing the links downloaded print ( "Downloaded: " , link) except : print ( 'Some error in downloading: ' , link) |
Output: