Przejdź do głównej zawartości

Ściągaj Playlisty z YouTube bez reklam za darmo - za pomocą prostego skryptu

· 4 min aby przeczytać
Bartek Jabłoński

Ostatnio zrezygnowałem z Spotify Premium i słuchanie muzyki oraz podcastów w samolocie stało się trudniejsze. Do tej pory ściągałem mp3 i mp4 za pomocą narzędzi online typu:

Niestety narzędzia tego typu pozwalają na ściąganie pojedynczych filmów i zarzucają nas masą inwazyjnych reklam. Aby ominąć te problemy, napiszemy skrypt w języku python, który po podaniu linku do playlisty lub filmu ściągnie nam mp3 lub mp4.

Do napisania skryptu użyjemy bibliotekę pytube.

Cały skrypt możecie znaleźć w repozytorium gitlab: https://gitlab.com/bart_as93/youtube-downloader

1. Konfiguracja wstępna

Pobierz repozytorium na lokalną maszynę:

git clone https://gitlab.com/bart_as93/youtube-downloader.git
cd youtube-downloader

Sprawdź wersje pythona

python --version

W moim przypadku Python 3.11.4

Następnie instalujemy zależności

pip install -r requirements.txt

Następnie uruchamiamy skrypt np.:

python .\downloader.py -u https://www.youtube.com/playlist?list=PLRomwVsNGznFggOY71VFRH_Wi8IOXj3hb -d music -f mp4

Skrypt przyjmuje 4 argumenty:

  • -f - jeden z formatów: mp3 albo mp4
  • -d - docelowy folder w którym mają znajdować się ściągnięte pliki
  • i jedno z pożniszych:
    • -u - Url do wideo na platformie YouTube
    • -pu - Url do playlisty na platformie Youtube

Pobieranie YouTube video w formacie mp4

Aby ściągnąć film YouTube trzeba użyć flagi -u <link_do_filmu> oraz flagę -f mp4

python .\downloader.py -u https://www.youtube.com/watch?v=a59gmGkq_pw -d movies -f mp4

Pobieranie YouTube video w formacie mp3

Aby ściągnąć audio z YouTube trzeba użyć flagi -u <link_do_filmu> oraz flagę -f mp3

python .\downloader.py -u https://www.youtube.com/watch?v=a59gmGkq_pw -d music -f mp3

Pobieranie playlisty YouTube w formacie mp4

Aby ściągnąć filmy z Playlisty YouTube trzeba użyć flagi -pu <link_do_playlisty> oraz flagę -f mp4

python .\downloader.py -pu https://www.youtube.com/playlist?list=PLRomwVsNGznFggOY71VFRH_Wi8IOXj3hb -d music-f mp4

Pobieranie YouTube Playlist w formacie mp3

Aby ściągnąć audio z Playlisty YouTube trzeba użyć flagi -pu <link_do_playlisty> oraz flagę -f mp3

python .\downloader.py -pu https://www.youtube.com/playlist?list=PLRomwVsNGznFggOY71VFRH_Wi8IOXj3hb -d movies -f mp3

Omówienie kodu (komentarze):

import argparse
import os
from pytube import Playlist
from pytube import YouTube

# Program obsługuje 2 formaty mp3 i mp4. W sekcji else przy innym formacie program jest wyłączany
def downloadByVideo(vid):
print('downloading : {} - {} with url : {}'.format(video.author, video.title, video.watch_url))
global type
vidFileName = vid.author + " - " + vid.title + "." + format
if format == 'mp3':
type = 'audio'
# Na obiekcie video odwołujemy się do streams, filtrujemy tylko audio i wywołujemy metodę download z opcjami opisującymi docelowy katalog w którym zostanie zapisany plik oraz nazwę pliku
vid.streams. \
filter(only_audio=True).desc().first(). \
download(output_path=DOWNLOAD_DIR, filename=vidFileName)
elif format == 'mp4':
type = 'video'
# Na obiekcie video odwołujemy się do streams, filtrujemy tylko video, sortujemy od największego resolution i wywołujemy metodę download z opcjami opisującymi docelowy katalog w którym zostanie zapisany plik oraz nazwę pliku
vid.streams. \
filter(type=type, progressive=True, file_extension=format). \
order_by('resolution'). \
desc(). \
first(). \
download(output_path=DOWNLOAD_DIR, filename=vidFileName)
else:
print(f"Not supported format type: {format}")
exit()

# Obsługa parametrów command line i sprawdzenie wymaganych pól
parser = argparse.ArgumentParser()

parser.add_argument("-u", "--Url", help="Youtube video url")
parser.add_argument("-pu", "--PlayListUrl", help="Playlist url")
parser.add_argument("-f", "--Format", help="Format of downloaded files - mp3 or mp4")
parser.add_argument("-d", "--Destination", help="Destination folder of downloaded files")

format="mp3"

args = parser.parse_args()

if not args.Url and not args.PlayListUrl:
print("Please provide youtube playlist url via -pu or --PlayListUrl argument param or Youtube video url via -u or --Url")
exit()
if not args.Destination:
print("Please provide destination folder name via -d or --Destination argument param")
exit()
if not args.Format:
print("Format (-f or --Format not provided - default set to mp3")
else:
format=args.Format

DOWNLOAD_DIR = os.getcwd() + "\\out\\" + args.Destination

# Sprawdzamy czy wprowadzony został url do Playlisty (-pu) czy url do filmu (-u) i na podstawie url ściągany jest film lub playlista
if(args.PlayListUrl):
playlist = Playlist(args.PlayListUrl)
print (f"Downloading {len(playlist.videos)} files from playlist with url: {args.Url}, with format: {args.Format}, to dir: {DOWNLOAD_DIR}")

for video in playlist.videos:
downloadByVideo(video)

if (args.Url):
video = YouTube(args.Url)
downloadByVideo(video)