xom`s pinion - Tom Hnatovsky Blog

Last.fm AJAXový RSS agregátor

12. září 2006 Web design 10 komentářů

Last.fm

I v Česku se rozmohla móda nechávat si indexovat vámi právě poslouchané skladby na serveru Last.fm, který dokáže poskytovat zajímavé statistiky a nabízet možnosti tvorby virtuálního přátelství s lidmi, kteří sdílejí váš hudební vkus. I já jsem se zhruba před měsícem rozhodl, že se podělím o svůj hudební (ne)vkus a když jsem tvořil nový design tohoto webu, tak jsem jej obohatil o desítku nejaktuálnějších skladeb z Last.fm.

Člověk se může spokojit s kusem kódu, který generuje statistiku v podobě obrázku (styl obrázku lze editovat), ale já jsem chtěl něco jiného, něco co bude dokonalou součástí designu, proto jsem se jal využít možnosti Last.fm RSS kanálu. Nebyl by problém podobnou statistiku načítat pomocí PHP a kešovat, optimální platnost keše mi přijde tak čtvrthodinka. Jenže někdy se musí data obnovit a to se stane po přístupu návštěvníka webu – systém zjistí, že nemá platný seznam písní, zahrabe na Last.fm, hrabe, hrabe – server může být v ten moment nedostupný, potencionální čtenář odchází, protože se mu stránka nenačte. Proto jsem přistoupil k problému z druhé strany – využil jsem JavaScriptu a dolování informací o hudbě až po načtení stránky – moderní je tomu říkat AJAX.. ;o) Jde o to, že se volá funkce např. getLastFmTracks() pomocí události onLoad a následně dojde k dotazu serveru na seznam, pokud je v keši načte se ihned, pokud je keš neplatná, tak se načte z Last.fm, výsledek se předá JavaScriptu, který pomocí innerHTML funkce přidá do stránky informace, jak prosté.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>LastFM Test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body onload="getLastFmTracks('lastFM', 'xomax');"> <!-- Box, do ktereho budeme vkladat --> <ul id="lastFM"> <li>Sem načteme statistiku</li> </ul> </body> </html>

JavaScript

Událostí OnLoad na elementu body voláme funkci getLastFmTracks s dvěma parametry, kterými definuje stránkový element, do kterého budeme vkládat výsledek, a uživatele, jehož statistika nás zajímá.

/* Definice promennych */ var i; var x; var artist; var name; var url; var date; /* Funkce zjistujici hudebni vkus */ function getLastFmTracks (block, user) { /* Pracuje prohlizec s W3 DOM kodem? */ if (document.getElementById) { /* Aktivace komunikacniho rozhrani */ var last = "http://pinion.xom-tom.com/skript/last.fm/lastFM.php?user="+user; x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); x.open("GET", last, true); x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8"); x.onreadystatechange = function () { /* Vyzadany dokument je nacteny (readyState == 4) a dotaz byl vykonan v poradku (status == 200) */ if (x.readyState == 4 && x.status == 200) { /* Ziskame data dle tagu z XML vypisu, abychom vedeli kolik pisnicek se v nem skryva */ var artist1 = x.responseXML.getElementsByTagName("artist"); var name1 = x.responseXML.getElementsByTagName("name"); var url1 = x.responseXML.getElementsByTagName("url"); var date1 = x.responseXML.getElementsByTagName("date"); var output = ""; var n = 1; /* Projizdime XML vypis dokud v nem neco je */ for (i=0; i < name1.length; i++) { artist = (artist1.length == "0" ? "" : artist1[i].firstChild.nodeValue); name = (name1.length == "0" ? "" : name1[i].firstChild.nodeValue); url = (url1.length == "0" ? "" : url1[i].firstChild.nodeValue); date = (date1.length == "0" ? "" : date1[i].firstChild.nodeValue); output += '<li><a href="' + url + '" title="Detail o interpretovi ' + artist + ' | Hrál mi ' + date + '">' + n + ' | ' + artist + ' – ' + name + '</a></li>\n'; n++; } var el = document.getElementById(block); el.innerHTML = output; } } x.send(null); } }

PHPko

JavaScript volá PHP stránku, na které se provádí následující skript. Pokud nechcete informace kešovat, můžete rovnou volat XML výstup z Last.fm. Kešování provádím podobně jako DGX ukládá Gravatary, prakticky jsem použil jeho kód, pouze upravil k potřebám mého hostingu (zákaz fopen na místa mimo localhost).

header("Content-Type: text/xml"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, no-store, must-revalidate"); $user = $_GET["user"]; $expire = 60*10; // 10 minut $file = 'lastFM'.$user.'.xml'; // soubor kese $url = 'http://ws.audioscrobbler.com/1.0/user/'.$user.'/recenttracks.xml'; // URL RSS last.fm $cached = is_file($file); // existuje soubor s kesi? $expired = $cached && (time() - filemtime($file) > $expire); // je soubor stary? $return = ''; // Nacteme si novy obsah kese.. if (!$cached || $expired) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_TIMEOUT, 100); curl_setopt($ch, CURLOPT_GET, 1); $return = curl_exec($ch); curl_close($ch); // Zapiseme do kese, kdyz je co.. if ($return != '') { fwrite(fopen($file, 'wb'), $return); } } $return = file_get_contents($file); echo $return;

Co s tím?

Zdrojové soubory s popsaným kódem jsem vám sbalil, ať si je můžete stáhnout. Implementace na stránkách je snadná – stačí nakopírovat obsah <script> do <head> nebo umístit do externího souboru, který budete načítat. V JavaScriptové části to chce ještě změnit cestu k PHP souboru (dle toho, kam ho nakopírujete.) <body> obohatit o definici onload="getLastFmTracks(cilovy_element, 'vas_nick_na_last_fm');" a nakonec nastavit práva zápisu na adresář, kam se budou ukládat keše..

Tradá a teď sdílíte s celým světem svou náladu, která se leskne z výběru vašich písní..

Vaše komentáře

GRavatar

Andrew 17.9.06 17:57

Mám takovou paranoidní teorii. Nikdo neví, co přesně ten jejich klient posílá, takže může třeba poslat název souboru, crc32,… a protože po netu (DC/Torrent/…) obíhá omezená množství RIPů jednotlivých alb, jde takhle relativně snadno poznat, kdo je pirát (a to dokonce s jeho vlastní pomocí). No a Last.fm provozuje RIAA a je vymalováno. Tohle by byl od RIAA vážně geniální tah :)

GRavatar

xom 17.9.06 18:59

|1| - reakce na Andrew: Přoč by ne, když se nad tím člověk zamyslí, akorát je problém s českými zákony, kdy je legální si hudbu pořídit ze zdroje, kterému důvěřuješ, že je v pořádku, ale sám nesmíš hudbu poskytovat dál. Myslím, že by se ilegalita dokazovala těžko, pokud by člověk v počítači neměl DC či Torrent klienty.

Ještě se večer mrknu na licenční ujednání v LastFM klientovi, který je istalován v systému, protože by teoreticky mohlo popsané dolování dat a jejich následné „zneužití“ být v rozporu se zákony.

GRavatar

Andrew 17.9.06 19:49

Nojo, jasně, na ČR a Evropu RIAA taky dlabe, ale v USA, tam by měli žně. A když jsou schopný zažalovat člověka, kterej nikdy neměl počítač nebo dokonce „člověka“, kterej už je nějakej pátek mrtvej, tak by si s nějakym dokazováním nedělali těžkou hlavu :)

GRavatar

Andrew 17.9.06 19:50

Hele, proč mi to moje uvozovky o-escapeovalo a tobě tvoje ne? :)

GRavatar

xom 17.9.06 20:01

|4| - reakce na Andrew: Páč jsem to upravil v db, ale u tebe jsem si toho nevšim a teď to ještě escapuje, páč jsem línej zapínat editor ;o)

GRavatar

xom 17.9.06 23:02

|5| - reakce na xom: Ta a mělo by to být v „cajku“ ;o)

GRavatar

xom 17.9.06 23:22

V licenčním ujednání programu Last.fm je pouze uvedeno poučení o možnostech licence GNU GPL, ale samotných zárukách programu nic.. Na samotných stránkách, kde je možnost produkt stáhnout je pouze uvedeno následující:

Last.fm is open source software and contains no spyware / adware. (We hate that stuff as much as you do.)

GRavatar

Andrew 17.9.06 23:47

Ono to je open-source? Jestli jo, tak to žádnou takovou levotu dělat nebude a bude to fakt odesílat jenom to jméno interpreta a skladbu, jak o tom píšou na webu. Škoda, taková pěkná teorie to byla :)

GRavatar

zimmi 26.9.06 15:03

Zdravím, mohl bych se poptat ohledně toho exportu seznamu skladeb? Ne a ne to fungovat, cesty jsem přepsal, nahrál na web, ale seznam se mi neobjeví. Víc to popsat neumím, když tak se podívej (link nechávám)

GRavatar

xom 26.9.06 15:27

|9| - reakce na zimmi: Vypadá to na problém s právy přístupu ke keši..

Přidejte i vy svůj komentář

Pole komentáře: zmenšit / zvětšit

Jméno:

Email: (Gravatar ID)

Web:

Barva trávy (otázka proti robotům):

© 2004-2012 Tom Hnatovsky - Všechna práva vyhrazena