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:staAWK: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) 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 6Ero 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-songwriterHtml-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 ; doneTä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=100686272Tä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 > dllistNyt meillä on siis lopulta mp3-tiedostojen osoitelista. On aika antaa wgetin laulaa.. cd singer-songwriter for i in `cat ../dllist` ; do wget -nc $i ; doneLä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_folkSkripti 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 234277Eli 4335 kappaletta, 298 tuntia ja 37 8-tuntista kuuntelupäivää.. |