In questo articolo andremo a vedere come sarà possibile, tramite l'utilizzo di alcune librerie di python, scaricare un intera playlist da YouTube solamente fornendo l'url di essa.

Requisiti

Per avere lo script funzionante dovremmo installare i seguenti moduli:

Iniziamo subito ad installarli tramite pip. Perciò apriamo il terminale ed eseguiamo i seguenti comandi come amministatore:

pip install pytube
pip install bs4
pip install requests

Pytube

Pytube è una libreria che ci permette di scaricare, dandogli in pasto l'url relativo, qualsiasi video presente su youtube scrivendo tre righe di codice:

from pytube import YouTube

yt = YouTube(url_video_youtube)  #istanzo l'oggetto della classe YouTube
stream = yt.streams.first()  #scelgo formato e qualità del video (mp4 720p in questo caso).
stream.download()  #scarico il video.

Tuttavia se volessi scaricare una playlist intera dovrei andare a cercarmi l'url di ogni video presente in essa, il che è molto frustrante soprattutto nel caso sia molto grande. L'idea perciò è quella di utilizzare BeautifulSoup, un modulo che ci permette di ottenere dati da qualsiasi sorgente html o xml, per estrarre da questa questa playlist per esempio tutti gli url dei video contenuti in essa e successivamente mandarli in pasto a pytube.

Iniziamo!

Andiamo ad importare i pacchetti appena scaricati:

from pytube import YouTube
from bs4 import BeautifulSoup
import requests
import os

Ottenere tutti gli url video da una playlist di YouTube

Creiamo una funzione che, come spiegato precedentemente, prende in ingresso come parametro l'url di una playlist presente su youtube e restituisce come valori una lista di tutti gli url dei video che riesce a trovare all'interno di quella pagina.

def ottieni_url_video(url):
    """
    ritorna una lista di tutti gli url video presenti nella playlist
    """
    urls = []
    sourceCode = requests.get(url).text
    soup = BeautifulSoup(sourceCode, 'html.parser')
    dominio = 'https://www.youtube.com'
    for link in soup.find_all("a", {"dir": "ltr"}):
        href = link.get('href')
        if href.startswith('/watch?'):
            video = dominio + href
            urls.append(video)
    return urls

Scaricare ogni video trovato

Ottimo, siamo a buon punto, ora scriviamo la funzione per scaricare un singolo video:

def scarica_video(url_video_youtube):
    """
    scarica il video youtube relativo all'url nel percorso indicato
    """
    try:
        yt = YouTube(str(url_video_youtube))
        print("Scaricando: {} ...".format(yt.title))
        stream = yt.streams.first() #scarica video in mp4 720p
        stream.download()
        return True
    except:
        return False

Chiedere all'utente la playlist da scaricare

Ora che abbiamo le due funzioni che ci servono non ci basta che chiedere all'utente la playlist da scaricare:

def main():
    playlist_url = input('Playlist url -> ')
    video = ottieni_url_video(str(playlist_url))
    video_count = 0
    for video_url in video:
        if scarica_video(video_url):
            video_count += 1
            print("Scaricato!")
        else:
            print("Errore nel download del video!")
    print("Scaricati: {} video!".format(video_count))


if __name__ == '__main__':
    main()

Eseguiamo lo script:


Playlist url -> https://www.youtube.com/playlist?list=PLuE0SeD01put0OZ1Pq2ZZB7h_vDeGORRq
Scaricando: NO COPYRIGHT VIDEO / CINEMATIS ...
Scaricato!
Scaricando: NO COPYRIGHT VIDEO / CINEMATIS ...
Scaricato!
Scaricando: NO COPYRIGHT VIDEO / CINEMATIS | free to use ...
Scaricato!
Scaricando: NO COPYRIGHT VIDEO / CINEMATIS  | free to use ...
Scaricato!
Scaricando: NO COPYRIGHT VIDEO / CINEMATIS ...
Scaricato!
Scaricando: NO COPYRIGHT VIDEO / CINEMATIS | free to use any were you want ...
Scaricato!
Scaricati: 6 video!
>>> 

Condividi sui Social