Reputation: 365
I am looking to download a YouTube playlist using the PyTube library. Currently, I am able to download a single video at a time. I cannot download more than one video at once.
Currently, my implimentation is
import pytube
link = input('Please enter a url link\n')
yt = pytube.YouTube(link)
stream = yt.streams.first()
finished = stream.download()
print('Download is complete')
This results in the following output
>> Download is complete
And the YouTube file is downloaded. When I try this with a playlist link (An example) only the first video is downloaded. There is no error outputted.
I would like to be able to download an entire playlist without re-prompting the user.
Upvotes: 17
Views: 66226
Reputation: 23
This works for me. Just takes the URLs in the playlist and downloads them one by one:
from pytube import Playlist
playlist = Playlist('URL')
print('Number of videos in playlist: %s' % len(playlist.video_urls))
for video_url in playlist.video_urls:
print(video_url)
urls.append(video_url)
for url in urls:
my_video = YouTube(url)
print("*****************DOWNLOAD VID*************")
print(my_video.title)
my_video = my_video.streams.get_highest_resolution()
path = "PATH"
my_video.download(path)
print("VIDEO DOWNLOAD DONNNNE")
Upvotes: 0
Reputation: 1
import re
from pytube import Playlist
YOUTUBE_STREAM_AUDIO = '140' # modify the value to download a different stream
#DOWNLOAD_DIR = 'C:\\Users\\lima0\\Music\\DowloadMusicas\\MusicasLuciene'
DOWNLOAD_DIR = input("Caminho de Dowload seperado por 'duas barras invertidas': ") #\\
#playlist = Playlist('https://youtube.com/playlist?list=PLiOOw5gv01WIsEwTLKIDZBx-Fk4gGT35i&si=lBuYbwQ1KTWR2daf')
playlist = Playlist(input("Link da Playlist: "))
# this fixes the empty playlist.videos list
playlist._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*)")
print("Número de Videos: ",len(playlist.video_urls))
n = len(playlist.video_urls)
for url in playlist.video_urls:
print(url)
# physically downloading the audio track
for i, video in enumerate(playlist.videos, start=1):
#print('Baixando: {} url : {}'.format(video.title, video.watch_url))
print('Baixando {}/{}: {} url : {}'.format(i, n, video.title, video.watch_url))
audioStream = video.streams.get_by_itag(YOUTUBE_STREAM_AUDIO)
audioStream.download(output_path=DOWNLOAD_DIR)
print("Dowload Completo!")
Upvotes: 0
Reputation: 72
from pytube import Playlist # Replace with the URL of the YouTube playlist you want to download playlist_url = 'https://www.youtube.com/playlist?list=PL9cRVgocl8YYk_zFXqjaRUei7AUt4hDkp' def download_playlist(url): playlist = Playlist(url) for video in playlist.videos: video.streams.get_highest_resolution().download() if __name__ == '__main__': download_playlist(playlist_url)
Upvotes: 0
Reputation: 1
First of all update the pytube
module using following code
python -m pip install --upgrade pytube
Here is my code which keeps track of the videos downloaded in case connection break.
from pytube import Playlist
import os
import re
def download(playlist):
progress = None
PATH = f'./{title}'
with open(PATH+'/dependList.txt','r') as f:
progress = int(f.read())
videos = playlist.videos
for i,video in enumerate(videos):
if i >= progress:
v = video.streams.filter(progressive=True,file_extension='mp4').order_by('resolution').desc().first()
v.download(PATH+'/')
with open(PATH+'/dependList.txt','w') as f:
f.write(f'{i+1}')
print(f'Downloaded {i+1} video')
link = input('Enter link:')
pl = Playlist(link)
total_videos = len(pl.videos)
print(f'Total Videos:{total_videos}')
title = ' '.join(re.findall("[a-zA-Z]+", pl.title))
print(title)
if os.path.exists(title):
length_file = len(os.listdir(title)) - 1
if length_file!=total_videos:
download(pl)
print("DONE")
else:
print('Already Exist')
else:
os.makedirs(f'./{title}')
with open(f'./{title}/dependList.txt','w') as f:
f.write('0')
download(pl)
print('DONE')
Upvotes: 0
Reputation: 1
this may not work, the code below works for every case
from pytube import Playlist
from pytube import YouTube
from pytube import Playlist
playlist = Playlist('https://www.youtube.com/watch?v=UPFKAG9rYOE&list=PLknwEmKsW8OtK_n48UOuYGxJPbSFrICxm')
print('Number of videos in playlist: %s' % len(playlist.video_urls))
for video_url in playlist.video_urls:
print(video_url)
video=YouTube(video_url)
try:
#video.streams.first().download()
video.streams.filter(res="720p").first().download()
except:
continue
Upvotes: 0
Reputation: 117
from pytube import YouTube
from pytube import Playlist
SAVE_PATH = "E:/YouTube" #to_do
#link of the video to be downloaded
links= "https://youtube.com/playlist?list=PLblh5JKOoLUL3IJ4- yor0HzkqDQ3JmJkc"
playlist = Playlist(links)
PlayListLinks = playlist.video_urls
N = len(PlayListLinks)
#print('Number of videos in playlist: %s' % len(PlayListLinks))
print(f"This link found to be a Playlist Link with number of videos equal to {N} ")
print(f"\n Lets Download all {N} videos")
for i,link in enumerate(PlayListLinks):
yt = YouTube(link)
d_video = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()
d_video.download(SAVE_PATH)
print(i+1, ' Video is Downloaded.')
You can check this repository to download playlists and individual videos and keep them in different directories.
https://github.com/pushpendra050/Pytube-for-Playlist-download
Upvotes: 3
Reputation: 19
this work for me in windows 11 or 10.5 Original code: Jean-Pierre Schnyder
import re
from pytube import Playlist
DOWNLOAD_DIR = input ("Download dir")
playlist = input ("Link:")
playlist._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*)")
print(len(playlist.video_urls))
for url in playlist.video_urls:
print(url)
for video in playlist.videos:
audioStream = video.streams.get_highest_resolution()
audioStream.download(output_path=DOWNLOAD_DIR)
Upvotes: 1
Reputation: 281
This works flawlessly to download complete playlist
check pytube github to install
pip install pytube
Now, go to this folder and open cipher.py
D:\ProgramData\Anaconda3\Lib\site-packages\pytube\
replace at line 273
function_patterns = [
r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&\s*.*\|\|\s*(.*)\(',
r'\([a-z]\s*=\s*([a-zA-Z0-9$]{3})(\[\d+\])?\([a-z]\)',
]
main.py
from pytube import Playlist
playlist = Playlist('https://www.youtube.com/playlist?list=PLwdnzlV3ogoXUifhvYB65lLJCZ74o_fAk')
playlist._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*)")
print(len(playlist.video_urls))
for url in playlist.video_urls:
print(url)
for video in playlist.videos:
video.streams.get_highest_resolution().download()
Upvotes: 1
Reputation: 355
import pytube
from pytube import Playlist
playlist = Playlist('plylist link')
num = 0
for v in playlist.videos:
print(v.watch_url)
one = pytube.YouTube(v.watch_url)
one_v = one.streams.get_highest_resolution()
name = f"{0}" + one_v.default_filename
one_v.download()
num = num + 1
Upvotes: 1
Reputation: 1047
Though it seems like a solved problem, but here is one of my solutions which may help you to download the playlist specifically as video of 1080P 30 FPS
or 720P 30 FPS
(if 1080P not available).
from pytube import Playlist
playlist = Playlist('https://www.youtube.com/playlist?list=PLeo1K3hjS3uvCeTYTeyfe0-rN5r8zn9rw')
print('Number of videos in playlist: %s' % len(playlist.video_urls))
# Loop through all videos in the playlist and download them
for video in playlist.videos:
try:
print(video.streams.filter(file_extension='mp4'))
stream = video.streams.get_by_itag(137) # 137 = 1080P30
stream.download()
except AttributeError:
stream = video.streams.get_by_itag(22) # 22, 136 = 720P30; if 22 still don't work, try 136
stream.download()
except:
print("Something went wrong.")
Upvotes: 0
Reputation: 61
this code allows you to download a playlist to your assigned folder
import re
from pytube import Playlist
playlist = Playlist('https://www.youtube.com/playlist?list=Pd5k1hvD2apA0DwI3XMiSDqp')
DOWNLOAD_DIR = 'D:\Video'
playlist._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*)")
print(len(playlist.video_urls))
for url in playlist.video_urls:
print(url)
for video in playlist.videos:
print('downloading : {} with url : {}'.format(video.title, video.watch_url))
video.streams.\
filter(type='video', progressive=True, file_extension='mp4').\
order_by('resolution').\
desc().\
first().\
download(DOWNLOAD_DIR)
Upvotes: 6
Reputation: 6080
if one needs to download the highest quality video of each item in a playlist
playlist = Playlist('https://www.youtube.com/watch?v=VZclsCzhzt4&list=PLk-w4cD8sJ6N6ffzp5A4PQaD76RvdpHLP')
for video in playlist.videos:
print('downloading : {} with url : {}'.format(video.title, video.watch_url))
video.streams.\
filter(type='video', progressive=True, file_extension='mp4').\
order_by('resolution').\
desc().\
first().\
download(cur_dir)
Upvotes: 7
Reputation: 1944
The solutions above no longer work. Here's a code which downloads the sound stream of the videos referenced in a Youtube playlist. Pytube3 is used, not pytube. Note that the playlist must be public for the download to succeed. Also, if you want to download the full video instead of the sound track only, you have to modify the value of the Youtube tag constant. The empty Playlist.videos list fix was taken from this Stackoverflow post:PyTube3 Playlist returns empty list
import re
from pytube import Playlist
YOUTUBE_STREAM_AUDIO = '140' # modify the value to download a different stream
DOWNLOAD_DIR = 'D:\\Users\\Jean-Pierre\\Downloads'
playlist = Playlist('https://www.youtube.com/playlist?list=PLzwWSJNcZTMSW-v1x6MhHFKkwrGaEgQ-L')
# this fixes the empty playlist.videos list
playlist._video_regex = re.compile(r"\"url\":\"(/watch\?v=[\w-]*)")
print(len(playlist.video_urls))
for url in playlist.video_urls:
print(url)
# physically downloading the audio track
for video in playlist.videos:
audioStream = video.streams.get_by_itag(YOUTUBE_STREAM_AUDIO)
audioStream.download(output_path=DOWNLOAD_DIR)
Upvotes: 22
Reputation: 329
from pytube import Playlist
playlist = Playlist('https://www.youtube.com/playlist?list=PL6gx4Cwl9DGCkg2uj3PxUWhMDuTw3VKjM')
print('Number of videos in playlist: %s' % len(playlist.video_urls))
for video_url in playlist.video_urls:
print(video_url)
playlist.download_all()
https://www.youtube.com/watch?v=HjuHHI60s44 https://www.youtube.com/watch?v=Z40N7b9NHTE https://www.youtube.com/watch?v=FvziRqkLrEU https://www.youtube.com/watch?v=XN2-87haa8k https://www.youtube.com/watch?v=VgI4UKyL0Lc https://www.youtube.com/watch?v=BvPIgm2SMG8 https://www.youtube.com/watch?v=DpdmUmglPBA https://www.youtube.com/watch?v=BmVmJi5dR9c https://www.youtube.com/watch?v=pYNuKXjcriM https://www.youtube.com/watch?v=EWONqLqSxYc https://www.youtube.com/watch?v=EKmLXiA4zaQ https://www.youtube.com/watch?v=-DHCm9AlXvo https://www.youtube.com/watch?v=7cRaGaIZQlo https://www.youtube.com/watch?v=ZkcEB96iMFk https://www.youtube.com/watch?v=5Fcf-8LPvws https://www.youtube.com/watch?v=xWLgdSgsBFo https://www.youtube.com/watch?v=QcKYFEgfV-I https://www.youtube.com/watch?v=BtSQIxDPnLc https://www.youtube.com/watch?v=O5kh_-6e4kk https://www.youtube.com/watch?v=RuWVDz-48-o https://www.youtube.com/watch?v=-yjc5Y7Wbmw https://www.youtube.com/watch?v=C5T59WsrNCU https://www.youtube.com/watch?v=MWldNGdX9zE
I'm using pytube3 9.6.4, not pytube.
Now Playlist.video_urls
works well.
And Playlist.populate_video_urls()
function was deprecated.
Upvotes: 5
Reputation: 648
You can import Playlist
to achieve this. There is no reference to Playlist in the redoc, though there is a section in the GitHub repo found here. The source of the script is in the repo here.
from pytube import Playlist
playlist = Playlist('https://www.youtube.com/watch?v=58PpYacL-VQ&list=UUd6MoB9NC6uYN2grvUNT-Zg')
print('Number of videos in playlist: %s' % len(playlist.video_urls))
playlist.download_all()
NOTE: I've found the supporting method Playlist.video_urls
does not work. The videos are still downloaded however, as evidenced here
Upvotes: 18