Jak stáhnout mnoho alb z Jamenda wgetem

Na serveru Jamendo.com je spoustu skvělé muziky, to se ví. S nákupem nové hračky Stanton SCS3 jsem se rozhodl, že si nějakou stáhnu ve velkém, abych mohl zkusit připravit nějaký set ve stylu deep house čistě z muziky licencované pod Creative Commons. Ale jak na to?

První idea byla poslouchat skladby v Rhytmboxu a poté je stahovat. Tento program nabízí možnost stáhnutí alba z Jamenda, nicméně jsem bohužel neuspěl. A to proto, že Rhythmbox stahuje pouze torrent soubory, které jsou v současné době neseedované. Situace je o něco lepší u méně kvalitního formátu MP3, ale 300kbps OGGy prostě nikdo neseeduje. Tudy cesta nepovede.

Druhá možnost byla ta nejjednodušší -- prostě alba "ručně" naklikat a stahovat v prohlížeči. Stáhl jsem takto tři a poté mě to přestalo bavit. Ani tudy cesta nevede. Co teď?

Jako třetí variantu jsem promýšlel použití specializovaného programu. I když je jich k dispozici hned několik, ani jeden mi nevyhovoval a nedělal to, co jsem chtěl. Totiž stahování alb v OGG formátu přímo přes HTTP.

Jelikož jsem včera musel dokončit v práci jeden úkol a vypil (na můj vkus) příliš mnoho kávy, ve dvě ráno, když jsem nemohl spát, jsem realizoval finální řešení. Vlastní skriptík, který udělá to, co chci.

Takže zopakuji svůj cíl - stáhnout všechna alba ve stylu House. Jamendo každý pracovní den vytváří XML dump své databáze tak, aby mohl být načítán přes internet do přehrávačů a jiných aplikací (např. Rhythmbox). Obsahuje veškeré potřebné informace jako jsou jména autorů, skladeb a alb. Jelikož jsem vygooglil, že odkaz na stažení alba je ve známém formátu, do skládanky mi stačilo pouze id alba. To v daném XML je. Skvělé.

Nejprve trošku odhalím, že jsem sestavil jediný příkaz, který provede stažení, rozbalení, extrakci dat a naformátování všech odkazů pro progra wget. Celý příkaz bude uveden na konci článku, nyní projdu jednotlivé části (ty jsou samy o sobě nefunkční!).

Takže krok první - stáhnutí XML dumpu, který je zazipovaný, jeho rozbalení.

wget -c -O - http://img.jamendo.com/data/dbdump_artistalbumtrack.xml.gz | gunzip | ...

Následuje extrakce podstatných dat - tedy identifikátorů těch alb, které jsou ve stylu house. Jamendo používá kromě taggování také standardní ID3 žánry. Na internetu jsem si našel, že house má číslo 35. Stejně tak si můžete najít svůj oblíbený žánr, který byste chtěli stahovat a poslouchat lokálně.

... | xgrep -x "/JamendoData/Artists/artist/Albums/album[id3genre='35']/id" | ...

K tomuto příkazu jedna poznámka. Jedná se o XPath dotaz, což je jazyk pro adresaci částí XML dokumentů. Funguje to podobně, jako SQL jazyk u relačních databází. Háček byl v tom, že standardní linuxový příkaz "xpath" (Perl::XPath) nefungoval příliš dobře, protože rozbalený dump je sto mega velký. Prostě jsem se nedočkal výsledku.

Proto jsem musel nainstalovat z repozitáře mé distribuce prográmek xgrep, který umí také pracovat s XPath výrazy, ale je podstatně rychlejší. Na mém počítači zabrala tato část filtru pár desítek sekund.

Program xgrep filtruje tak, že nalezené XML elementy píše na jednotlivé řádky za sebe, mezi ně vkládá XML komentáře s informací o čísle řádku, ze kterého byl výběr proveden. Tyto komentáře jsem ve výstupu nechtěl, proto jsem tedy povolal ke zbrani program grep, a to hned ve dvou instancích. První provádí filtraci komentářů, ta druhá vyhází ze řádků nepotřebné elementy "id" a zůstane tak pouze číslo alba (na každém řádku). Jsme už blízko výsledku.

... | grep "" | grep -e [0-9]* -o | ...

Jelikož adresa pro stažení je ve tvaru http://www.jamendo.com/get/album/ číslo_alba /album/archiverestricted/redirect/34662/?are=ogg3, tak jsem použil program sed, abych na začátek i konec každého řádku přidal text. Přiznávám, že jde o nešikovné řešení a budu rád, když se v komentářích podělíte o elegantnější. Já nejsem s awkem moc kamarád a jako zarytý vimař dost seduji. Slušná věta.

... | sed 's/[0-9]*/http:\/\/www.jamendo.com\/get\/album\/id\/album\/archiverestricted\/redirect\/\0\/?are=ogg3/g' | ...

Jak je vidět, musel jsem "eskejpovat". Pozor, je to celé jeden dlouhý řádek. No a výsledek? Ten uložíme do souboru.

... > list4download.txt

Hotovo. Takže v celé své kráse je to takhle. Pozor! Jeden řádek.

wget -c -O - http://img.jamendo.com/data/dbdump_artistalbumtrack.xml.gz | gunzip | xgrep -x "/JamendoData/Artists/artist/Albums/album[id3genre='35']/id" | grep "" | grep -e [0-9]* -o | sed 's/[0-9]*/http:\/\/www.jamendo.com\/get\/album\/id\/album\/archiverestricted\/redirect\/\0\/?are=ogg3/g' > list4download.txt

Nádherné na tom je, že se všechno zpracovává paralelně. Postupně jak se stahuje velký (10 MB) zkomprimovaný XML soubor dochází k jeho postupné dekompresi a načítání xgrepem a dalšími programy. Je to vlastně bez čekání, čeká se pouze na to, než se soubor stáhne.

To ale není všechno. Máme sice seznam odkazů a já jsem si jist, že víte, co s ním. Je tu druhý háček - Jamendo omezuje stahovače. Tedy ty, co nadměrně zatěžují jejich servery. Pokud byste nyní spustili wget a začli hned stahovat, po několika albech by server začal vracet chybu 404 (Not Found), což pro většinu stahovacích programů (včetně wgetu) znamená stopku. Pro takový program prostě stahovaný soubor neexistuje, takže v seznamu pokračuje dále. Server odpoví stejným způsobem na ostatní soubory a wget do pár sekund skončí s tím, že stahování je hotovo. Aby ne - dané soubory na serveru totiž "nejsou".

Proto se musí na Jamendo šetrně. Doporučuji tři věci: čekání mezi stahováním souborů (parametr -w a --random-wait), omezení rychlosti stahování (přepínač -limit-rate=xxx) a maskování wgetu jako standardní prohlížeč (-U a další).

Proto nabízím příkaz, který zaručeně s Jamendem funguje.

wget --user-agent="Opera/9.70 (Linux i686 ; U; en) Presto/2.2.0" --header="Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" --header="Accept-Language: en-us,en;q=0.5" --header="Accept-Encoding: gzip,deflate" --header="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" --header="Keep-Alive: 300" -c -t0 -N -w 45 --random-wait --limit-rate=800k -i list4download.txt

Pokud stahování spouštíte na serveru, doporučuji použití programů screen nebo nohup, abyste se mohli odhlásit a stahování pokračovalo i nadále. V tomto příkazu je maskování jako Opera, navazování spadlých připojení do nekonečna, nestahování již stažených a hotových souborů, čekání mezi stahováním od 30 do 90 sekund (náhodně, zhruba) a omezení rychlosti na 800 kB.
31 July 2010 | skript | bash | jamendo
twitter.com linkedin.com
google.com/+ facebook.com
flickr.com youtube.com