Wstęp
Dziś miałem taki problem, że trzeba było pobrać tylko ścieżki audio (najlepiej w mp3) z kilkuset filmów umieszczonych na playliście w serwisie Youtube.
Można to wykonać ręcznie:
– klikamy prawym na filmie
– wybieramy pozycję „Kopiuj adres linku”
– link wklejamy do jednego w wielu „pobieraczy” YT np. serwisu tuberipper.com
– klikamy w Download czy jak to sie tam nazywa i kolejno w .mp3 wybierając format (albo coś innego co chcemy pobrać)
– po chwili mamy ścieżkę audio na dysku
Fajne, ale chciałbym to zautomatyzować. Da się fajnie pod Linux z wiersza poleceń. Rozwiązaniem jest program yt-dlp. Może jednak on wymagać instalacji i jednorazowego uruchomienia chrome lub innej przeglądarki celem utworzenia profilu dla ciasteczek. Będzie też potrzebny ffmpeg do dekodowania audio/video oraz Python 3 i kilka bibliotek. Poniżej jak to wszystko poskładać.
Konfiguracja dla Linux z oknami
– aktualizacja pakietów
#apt update ; apt upgrade
– instalacja python3, pip: sprawdź dla swojego systemu jak to się instaluje
– instalacja ffmpeg
#apt install ffmpeg
– instalacja yt-dlp
# sudo pip3 install –upgrade yt-dlp
To wymaga nowej wersji Python i jeśli masz starszy musisz dokonać aktualizacji. Sprawdź dla swojego systemu jak to zrobić. U mnie pojawił się problem (choć sam program działa):
Zatem można aktualizować Python. Program można także instalować dla konkretnego Pythona:
#python3.11 -m pip install –upgrade yt-dlp
Teraz instalujemy chrome lub firefox, także popatrz jak dla twojego systemu to wykonać. Trzeba uruchomić Chrome aby utworzył katalog domowy i wejść na dowolną stronę. To wystarczy, Chrome można zamknąć. Chrome można pobrać tak
#wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
i zainstalować jak niżej:
#sudo dpkg -i google-chrome-stable_current_amd64.deb
Można też instalować tego pobieracza w inny sposób
# sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
# sudo chmod a+rx /usr/local/bin/yt-dlp
Pobranie playlisty z YouTube
Wymagany ffmpeg do konwersji audio!
Teraz czas na pobranie playlisty (zamiast chrome można wpisać firefox jeśli jest zainstalowany):
# yt-dlp –cookies-from-browser chrome -x –audio-format mp3 –playlist-start 1 –playlist-stop 100 https://adres-playlisty
Jeżeli będzie problem z uruchomieniem programu możesz go startować z katalogu: ~/.local/bin/
# ~/.local/bin/yt-dlp –cookies-from-browser chrome -x –audio-format mp3 –playlist-start 1 –playlist-stop 100 https://adres-playlisty
Jeśli playlista jest długa można określić, ile danych pobieramy:
# yt-dlp –cookies-from-browser chrome -x –audio-format mp3 –playlist-start 1 –playlist-stop 100 https://adres-playlisty
Można także podać programowi „ręcznie” plik cookie witryny (trzeba go wcześniej pozyskać z komputera gdzie już istnieje):
# yt-dlp –cookies ścieżka-do-pliku-cookie -x –audio-format mp3 https://nasza-playlista
Pobranie tylko ścieżki audio (128k) z jednego filmu
# yt-dlp -x –audio-format mp3 –audio-quality 5 –no-keep-video –no-playlist „https://youtu.be/7AzhPG9k_CE”
Pobieranie surowej ścieżki audio (bez konwersji)
# yt-dlp -f „bestaudio[abr<=128]” „https://youtu.be/7AzhPG9k_CE”
Przykład skryptu Python
https://github.com/IgorBrzezek/yt-audio-extractor
Przykład skryptu Linux Bash
Skrypt pobiera kolejno filmy do wyciągnięcia z nich strumienia audio w formacie mp3 128k.
#!/bin/bash # ============================================ # yt-dl128.sh # Pobiera ścieżkę audio z YouTube jako MP3 # Obsługuje: # --mp3 → szybki tryb (bez konwersji, jak najszybciej) # --128 → konwersja do MP3 128 kb/s # --list <plik.txt> → pobieranie wielu filmów # Loguje postęp do ~/ytdl-download.log # ============================================ OUTPUT_DIR="$HOME" LOG_FILE="$OUTPUT_DIR/ytdl-download.log" # Kolory GREEN="\e[32m" RED="\e[31m" YELLOW="\e[33m" BLUE="\e[34m" RESET="\e[0m" # Tworzy katalog i log mkdir -p "$OUTPUT_DIR" touch "$LOG_FILE" # Funkcja logowania log() { local MESSAGE="$1" echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $MESSAGE" >> "$LOG_FILE" } # -------------------------------------------- # Funkcje pobierania # -------------------------------------------- download_fast_mp3() { local URL="$1" echo -e "${BLUE} Szybkie pobieranie MP3:${RESET} $URL" log "FAST_MP3: $URL" yt-dlp -x --audio-format mp3 \ --no-keep-video --no-playlist \ -o "$OUTPUT_DIR/%(title)s.%(ext)s" \ "$URL" local STATUS=$? if [ $STATUS -eq 0 ]; then echo -e "${GREEN} Sukces:${RESET} pobrano $URL" log "SUCCESS_FAST: $URL" else echo -e "${RED} Błąd podczas pobierania:${RESET} $URL" log "ERROR_FAST: $URL" fi echo "-----------------------------------" } download_mp3_128() { local URL="$1" echo -e "${BLUE} Pobieranie i konwersja do MP3 128k:${RESET} $URL" log "MP3_128: $URL" yt-dlp -x --audio-format mp3 \ --postprocessor-args "-b:a 128k" \ --no-keep-video --no-playlist \ -o "$OUTPUT_DIR/%(title)s.%(ext)s" \ "$URL" local STATUS=$? if [ $STATUS -eq 0 ]; then echo -e "${GREEN} Sukces:${RESET} pobrano $URL" log "SUCCESS_128: $URL" else echo -e "${RED} Błąd podczas pobierania:${RESET} $URL" log "ERROR_128: $URL" fi echo "-----------------------------------" } # -------------------------------------------- # Obsługa argumentów # -------------------------------------------- show_help() { echo -e "${YELLOW}Użycie:${RESET}" echo " $0 --mp3 <link_do_youtube>" echo " $0 --128 <link_do_youtube>" echo " $0 --mp3 --list <plik_z_linkami.txt>" echo " $0 --128 --list <plik_z_linkami.txt>" exit 1 } if [ $# -lt 2 ]; then show_help fi MODE="" LIST_FILE="" URL="" # Parsowanie argumentów while [[ $# -gt 0 ]]; do case "$1" in --mp3) MODE="mp3" shift ;; --128) MODE="128" shift ;; --list) LIST_FILE="$2" shift 2 ;; *) URL="$1" shift ;; esac done if [ -z "$MODE" ]; then echo -e "${RED} Nie podano trybu (--mp3 lub --128)!${RESET}" show_help fi if [ -n "$LIST_FILE" ]; then # Tryb listy if [ ! -f "$LIST_FILE" ]; then echo -e "${RED} Plik '${LIST_FILE}' nie istnieje!${RESET}" exit 1 fi echo -e "${YELLOW} Wczytywanie listy:${RESET} $LIST_FILE" echo -e "${YELLOW} Logowanie do:${RESET} $LOG_FILE" echo "-----------------------------------" log "===== START BATCH ($MODE) from $LIST_FILE =====" while IFS= read -r LINE || [ -n "$LINE" ]; do if [[ -z "$LINE" || "$LINE"]()]()
…