Tämä teksti on julkaistu suppeammassa muodossa kirjassa Inside Linux - ylläpitäjän käsikirja, Koski, Kajala, 74 EUR (951-826-733-2) ilm. 10/2005 osana AWK-ohjelmoinnin perusteista kertovassa luvussa esimerkkinä AWK-ohjelmien käytännön sovellutuksista.

Mp3-tiedostojen lataaminen skriptin avulla music.download.com:sta

AWK:ta voidaan käyttää samaan tapaan kuin komentotulkkiakin ohjelman kehityksessä pikku hiljaa kokeillen ja parannellen. Tämä tapa on järkevä, kun halutaan automatisoida harvoin toistuvaa tehtävää. Ohjelma tehdään tarpeeseen ja sitä ei ehkä käytetä koskaan uudelleen myöhemmin. Tämä luku esittelee erään tarpeeseen tehdyn skriptin, jossa AWK on tärkeässä osassa.

Koska tässä luvussa on useita viitteitä Internetiin ja lähes sama sisältö on saatavilla osoitteessa http://www.raimokoski.com/mp3download.html, kannattaa ehkä käynnistää kone ja selain sekä lukea loppuosa sen kautta.

music.download.com:ssa on järkyttävän suuri määrä musiikkia mp3-tiedostoina ja niitä voi ladata ilmaiseksi ja täysin laillisesti. Artistit ovat lähes kaikki täysin tuntemattomia ja se lieneekin syynä siihen, että he ovat laittaneet musiikkiaan ilmaiseen jakoon. Suurin osa musiikista on kuitenkin ihan kuunneltavaa ja osa varsin hyvääkin.

Paatuneelle musiikin kuuntelijalle radiokanavat ovat muuttuneet viimeaikoina lähes kuuntelukelvottomiksi. Kappaleet valitaan melko suppealta soittolistalta ja sama kappale voi soida päivän mittaan useitakin kertoja. Kanavapujottelu auttaa hieman, mutta radioaalloilla Suomessa on varsin vähän kanavia, joten se tie on nopeasti kuljettu loppuun. Internetin kautta radioasemia löytyy valtavan paljon enemmän, mutta jos tarjolla on myös pelkkiä musiikkikappaleita helposti käsiteltävinä yksittäisinä tiedostoina, ei nettiradiokaan enää tunnu houkuttelevalta.

(Tämä osa ei ole kirjassa)
Suomessa on ainakin yksi musiikkiohjelmien toimittaja, jonka ohjelmissa ei soi toisto. Aikaisemmin Mikael Wiik teki YLE:n ruotsinkieliselle radiokanavalle ensin Smultronställetiä ja sittemmin Vegalle Wiikendiä. Tällä hetkellä hän tekee Terraariota Radio Helsingille, jossa on jo valitettavasti toistoa vanhoista ohjelmista ja klassista, jota aikaisemmissa ohjelmissa ei ollut. Radio Helsingin soittolistat valaisevat asiaa. Molemmat ohjelmat ovat nelituntisia, joten poislukien ohjelmien iän, listat ovat vertailukelpoisia. Planetaario on valittu sattumanvaraisesti.


Uugen (Planetaario) Radio Helsingissä soittamat artistit TOP-100:

1. BEATLES 377
2. HENDRIX JIMI 298
3. ROLLING STONES 279
4. LED ZEPPELIN 117
5. BECK JEFF 114
6. DYLAN BOB 108
7. THE WHO 103
8. PINK FLOYD 91
9. LENNON JOHN 85
10. BROWN JAMES 84

Mikaelin (Terraario) Radio Helsingissä soittamat artistit TOP-100:

1. BARRUECO MANUEL 14
2. PHILADELPHIA ORCHESTRA, ORMANDY EUGENE, BOWIE DAVID 13
3. VOLLENWEIDER ANDREAS 12
4. DAVIS MILES 10
5. ROLLING STONES 10
6. CLAPTON ERIC 8
7. SÖLLSCHER GÖRAN 8
8. APOLLO SAXOPHONE QUARTET 8
9. LOS LOBOS 7
10. BAKER CHET 6 

Ero on aikamoinen. Ylempi on selvästi pelkkää toistoa ja tylsää pidemmän päälle vaikka musiikki sinäänsä olisi hyvää. Parhaalta tai ainakin vaihtelevinta musiikkia sisältävältä kategorialta music.download.comissa vaikuttaa World - Worldbeat.
(Tämä osa ei ole kirjassa, loppu)

music.download.com:n sivustossa on ongelmana se, että mitään helppoa tapaa ladata useita kappaleita kerralla ei ole. Jokainen pitäisi käydä yksitellen lataamassa. Ongelmaa pahentaa se, että www-palvelin ilmeisesti rajoittaa yhteyksien määrää ja pahimmillaan pystyy lataamaan vain kaksi tiedostoa samanaikaisesti. Käytännössä tämä tarkoittaa, että lataamista pitää koko ajan valvoa. Skriptin avulla koko operaatio on mahdollista automatisoida täysin. Aivan niin pitkälle ei kuitenkaan ehkä kannata mennä, mutta jatkossa esittelemme tavan, jossa lataamisen käynnistys kestää korkeintaan muutaman minuutin ja varsinainen skriptin käynnistämä lataus jopa useita tunteja (molemmat riippuen pääosin nettiyhteytesi nopeudesta).

Kappaleet ovat kuitenkin luokiteltu eri tyylisuuntiin ja sivuston rakenne on säännönmukainen. Kunkin tyylisuunnan artistit voi listata useassa järjestyksessä, esim. latauskertojen määrän ja lisäyspäivämäärän mukaan. Osa artisteista on sivuston toimituksen suosittelemia, joten valitsemalla listauksen tyypiksi "Editor's picks" voi toivoa saavansa kategorian parhaat.

Otetaan esimerkiksi kategoria Rock & Pop, Singer/Songwriter ja listan tyypiksi All Artists. Ensimmäisen sivun osoite on http://music.download.com/3605-8742_32-0.html ja sillä listataan 15 ensimmäistä artistia lisäysjärjestyksessä. Seuraavat 15 ovat sivulla http://music.download.com/3605-8742-0-2.html, seuraavat http://music.download.com/3605-8742-0-3.html jne. Ensimmäisen sivun osoite ei noudata sääntöä, mutta seuraavissa viimeinen numero nousee alkaen kahdesta. Tässä esimerkissä artisteja oli kirjoitushetkellä 322 eli viimeisen sivun osoiteen loppuosa on 22 (322/15 = 21,47, joka pyöristettynä ylös on 22).

Jos kategorioita halutaan ladata enemmän, kannattaa luoda monitasoinen hakemistopuu. Esimerkkiämme varten riittää:


mkdir -p mp3/rock-pop/singer-songwriter

Html-sivuja varten luodaan toinen hakemisto ja haetaan sinne kaikki kategorian pääsivut:

cd mp3/rock-pop
mkdir mainpages
cd mainpages
wget http://music.download.com/3605-8742_32-0.html
for i in `seq 2 22` ; do wget http://music.download.com/3605-8742-0-$i.html ; done

Tässä vaiheessa meitä kiinnostaa, minkä tyyppinen osoite artistien sivuille johtaa. Kategorian ensimmäisenä listassa on: http://music.download.com/jacobelliot/3600-8742_32-100686272.html?tag=listing_song_artist (osoitteen näkee helposti www-selaimella viemällä hiiren "pääsivulla" linkin kohdalle). Kysymysmerkistä ja sen jälkeisestä osasta ei tarvitse välittää, osoite toimii täysin ilman niitä. Sama koskee jo edellä haettuja "pääsivuja".

Sivulla on linkkejä erittäin paljon, mutta artistien sivujen linkit erottaa muista merkkijono "tag=listing_song_artist". Kokeillaan sitä ensin komentorivillä:


# awk '/tag=listing_song_artist/{print}' mainpages/3605-8742_32-0.html
<h4><a href="/jacobelliot/3600-8742_32-100686272.html?tag=listing_song_artist">Jacob Elliot</a></h4>

Sama linkki on tulosteessa kahteen kertaan ja yllä on vain ensimmäinen tulosterivi. Jos tulostus ohjataan ohjelmalle "wc -l", se kertoo rivejä olevan 30 eli jokainen etsimämme linkki kahteen kertaan. Toisto voidaan karsia uniq-ohjelmalla. Toinen mielenkiintoinen seikka on se, että kaipaamamme merkkijono on lainausmerkkien sisällä, joten lainausmerkki voitaisiin määritellä kenttäerottimeksi lauseella BEGIN{FS="\""}. Merkkijonoa "?tag=listing_song_artist" emme tarvitse, joten se voidaan poistaa ja tulosteeseen pitää lisätä http://music.download.com, jotta osoite olisi absoluuttinen eikä suhteellinen. Alla on awk:n paranneltu "ohjelma", mutta sen tuloste on myös sijoitettu wget-ohjelman parametrilistaksi, toisto on karsittu ja luotu ja siirrytty artistisivuille omaan hakemistoon:

mkdir artistpages
cd artistpages
wget `awk 'BEGIN{FS="\""}/tag=listing_song_artist/{gsub("?tag=listing_song_artist","")
      print "http://music.download.com"$2}' \ 
../mainpages/*  | uniq` 

Kaikki parannukset tai lisäykset voidaan tehdä kokeilemalla ja yksi kerrallaan. Tavoite oli saada wget-ohjelmalle sopiva parametrilista, joten ensin muutetaan awk-ohjelmaa askel kerrallaan, ajetaan se kokeeksi ja siirrytään seuraavaan vaiheeseen edelleen testaten. Lopuksi annettaan wgetin hakea halutut sivut.

Esimerkkitapauksessamme artisteja oli 322 eli wget hakee yhtä monta sivua ja se vie hieman aikaa. Artistien sivuilta haluamme poimia linkit mp3-tiedostoihin. Valitsemamme kategorian ensimmäinen artistisivu oli http://music.download.com/jacobelliot/3600-8742_32-100686272.html ja siitä löytyy seuraava linkki yhteen mp3-tiedostoon (rivi katkottu):


http://dw.com.com/redir?&destUrl=http%3A%2F%2Fmusic-files.download.com \
%2Fmp3%2F100686274%2F100698301%2FJacob_Elliot-Laili.mp3&edId=3&siteId= \ 
32&oId=3600-8742_32-100686272&ontId=8742&lop=link&tag=link<ype= \
dl_192k&astId=2&pid=100686274&mfgId=100686272&merId=100686272

Tämän osoitteen tulkinta on hieman vaikeaa. Varsinainen tiedosto on palvelimella music-files.download.com ja alussa oleva merkkijono "http://dw.com.com/redir?&destUrl=" on täysin turha. Myös lopussa on turhaa. Osoitteessa on redir-ohjelma, jolle varsinainen URL-osoite pitää lähettää MIME-koodattuna ja meidän pitää purkaa tämä koodaus. Tarvittavat muunnokset ovat: %3A = : ja %2F = /. Linkit mp3-tiedostoihin voidaan tunnistaa muista merkkijonolla "http://dw.com.com/redir?&destUrl". Jälleen kenttäerottimen muuttaminen näyttää auttavan ja sen arvoksi asetetaan "&". Toinen tuttu on linkkien toisto ja tällä kertaa varmistetaan niiden poisto sort-ohjelmalla (uniq poistaa vain perättäiset toistot, ei epäjärjestyksessä olevia). Linkkilista ohjataan tiedostoon ja koko komeus on alla:

awk '/http:\/\/dw.com.com\/redir\?\&destUrl/ {print}' \ 
artistpages/* | \
awk 'BEGIN{FS="&"}
     {gsub("http...dw.com.com.redir..destUrl.","")
     gsub("%3A",":")
     gsub("%2F","/")
     gsub("<a href=\"","")
     gsub(" ","")
     print $1}' - | sort | uniq > dllist

Nyt meillä on siis lopulta mp3-tiedostojen osoitelista. On aika antaa wgetin laulaa..

cd singer-songwriter     
for i in `cat ../dllist`  ; do wget -nc $i ; done     

Lähes kaikki edellä esitetyt vaiheet voidaan tiivistää yhteen skriptiin. Parannuksena edelliseen on erilliset alihakemistot ja tiedostot kullekin kategorialle, jotta usean kategorian tiedostoja voidaan ladata samanaikaisesti. Sen takia skripti vaatii parametriksi kategorian tai alihakemiston nimeä. Alkutoimet tehdään kuitenkin käsin. Tällä kertaa otamme esimerkiksi kategorian Folk - Traditional Folk ja alkusivuksi http://mp3.com.com/3605-8356_32-0.html. "Pääsivuja" on tällä kertaa vain kaksi, joten alustustoimet ovat seuraavat (huomaa muutokset hakemistojen nimissä):

mkdir -p folk/traditional_folk
cd folk/
mkdir mainpages.traditional_folk
cd mainpages.traditional_folk
wget http://mp3.com.com/3605-8356_32-0.html http://mp3.com.com/3605-8356-0-2.html
cd ..
dlcat.sh traditional_folk

Skripti dlcat.sh tarkistaa, onko parametrina annettu alihakemisto olemassa, mutta muuten se on hyvin yksinkertainen eikä sisällä mahdollisiin virhetilanteisiin varautumista.
Päivitys 31.1.2006
Download.comissa mp3-tiedostojen linkkien formaatti on muuttunut hieman. Uuden formaatin kanssa toimiva skripti: dlcat2.sh

Tarjolla olevan musiikin määrästä saa hieman käsitystä alla olevasta du:n listauksesta. Kaikkien kategorioiden kaikkia tiedostoja ei ole ladattu.


[root@rk3 mp3]# du
3874976 ./blues
878652  ./jazz/acid
1454084 ./jazz/free
2872668 ./jazz/fusion
836040  ./jazz/soul_jazz-groove
453096  ./jazz/latin_jazz-world_fusion
374016  ./jazz/cool
432476  ./jazz/hard_bop
170180  ./jazz/New_Orleans-classic_jazz
7471216 ./jazz
138028  ./reggae
71668   ./world/celtic
100964  ./world/africa
166444  ./world/south_asia
339080  ./world
5237092 ./rock-pop/prog-art_rock
2149984 ./rock-pop/roots
5181504 ./rock-pop/singer-songwriter
876876  ./rock-pop/adult_contemporary
13445720        ./rock-pop
492316  ./folk/traditional_folk
492332  ./folk
25761356        .
[root@rk3 mp3]# echo $[25761356*8/192/3600]
298
[root@rk3 mp3]# echo $[25761356*8/192/3600/8]
37
[root@rk3 mp3]# find . -name \*.mp3 | wc
   4335    4335  234277
   
Eli 4335 kappaletta, 298 tuntia ja 37 8-tuntista kuuntelupäivää..