V posledních dnech se nám nějak pokazil youtube a stahování obsahu pomocí youtube-dl je velmi pomalé. V tomto krátkém návodu si ukážeme, jak to opravit.

Skriptík youtube-dl asi netřeba dlouze představovat, umožňuje stahovat data z různých zdrojů (nejen tedy z youtube, to je jen klamání názvem).

Umí toho hodně, používám jej na stahování celých playlistů (např. přednášek), umí přeskočit již stažené soubory apod.

Jenže v posledních dnech se to nějak pokazilo a stahování (a to se týká zejména audio streamu) je nesnesitelně pomalé.

Oprava je relativně snadná, youtube-dl umí používat download akcelerátor. Já používám axel.

axel lze použít i samostatně:

axel -n 8 -a url

kde:

  • -n je počet stahovacích threadů (nastavte na co nejmenší hodnotu při které je ještě dosažena požadovaná rychlost)
  • -a je přepínač stylu progress baru
  • url je adresa stahovaného souboru

Použití v youtube-dl je potom následující:

youtube-dl --external-downloader axel --external-downloader-args "-n 8 -a" url

Je výhodnější si upravit konfiguraci youtube-dl v souboru ~/.config/youtube-dl/config, uvádím zde kompletní znění, které používám:

-i
-w
-c
-f bestvideo[ext=mp4]+bestaudio[ext=m4a]
--merge-output-format mp4
-o'%(uploader)s-%(title)s-%(id)s.%(ext)s'
--external-downloader axel --external-downloader-args "-n 8 -a"

kde:

  • -i ignoruje chyby, například nedostupné soubory v playlistu přeskročí a stahuje další
  • -w nepřepisuje již stažené soubory, výhodné, pokud chceme opakovaně stahovat nějaký kanál, stáhne jen novinky
  • -c pokusí se navázat na přerušené stahování, tohle nefunguje s akcelerátorem
  • -f formát stahovaných dat, v tomto nastavení se stáhne nejlepší možné audio i video a následně se sloučí - pokud se neuvede, youtube-dl stahuje format best, tak jak jej poskytne server. Což není vždy to pravé a lze se dočkat překvapení typu 360p apod., přičemž je dostupný i HD a to i kvalitou, nikoliv jen rozlišením.
  • --merge-output-format viz. předchozí bod, určuje kontejner do kterého se mají streamy sloučit
  • -o určuje pojmenování vysledného souboru. Je dobré to nastavit, protože youtube-dl občas mění výchozí pojmenování souborů, takže se občas stahuje již stažené (viz. parametr -w).
  • a poslední řádek určuje nastavení externího download akcelerátoru.

Poznámka k formátu

Definice formátu bestvideo[ext=mp4]+bestaudio[ext=m4a] stahuje nejlepší video a audio streamy v kontejneru mp4 (resp. m4a). Pokud se to neuvede, tak youtube-dl stáhne nejlepší stream v libovolném kodeku, který nemusí jít sloučit do kontejneru mp4 (který preferuji, je to aktuální standard), ale může být nutné použít kontejner mkv.

Doplnění k axel

YouTube zdá se být čím dál rozbitější, a poslední dobou začalo blbnout stahování zejména audio streamu i s axelem. Zdá se, že YouTube záměrně některá spojení neukončuje, ale neposílá do nich data. To lze vyřešit přidáním parametru --timeout na nízkou hodnotu, např. 10 (sekund).

Lepší stahování playlistů

Dosud uvedená konfigurace se spoléhá na to, že všechna videa z daného playlistu máme v jednom adresáři (a přeskakují se již stažené soubory stejného jména). Pokud ovšem chceme stahovat nějaký kanál nebo playlist opakovaně a nechat stáhnout pouze nová videa a stará si třeba ručně protřídit nebo mazat, může se nám hodit parametr --download-archive /cesta/k/souboru.

Do tohoto souboru si potom youtube-dl uloží id stahovaných médií a při opakovaném stažení daného kanálu je přeskočí.

Kompletní znění konfiguráku se všemy popsanými úpravami potom může vypadat následovně:

-i
-w
-c
-f bestvideo[ext=mp4]+bestaudio[ext=m4a]
--merge-output-format mp4
-o'%(uploader)s-%(title)s-%(id)s.%(ext)s'
--download-archive /home/user/.config/youtube-dl/download
--external-downloader axel --external-downloader-args "-n 8 -a -k -q -T 10"