Last.fm AJAXový RSS agregátor
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í..
z kategorie Web design, přidej na Linkuj.cz, publikováno 12.09.2006 06:08
Nápověda sytaxe komentářů
Reakci na předchozí komentář můžete učinit napsáním např. [2] či stisknutím odkazu reakce u dotyčného komentáře.
Základní formátování textu - zvýrazněné písmo je v Texy! definováno následovně *pro kurzívu* a **pro tučný řez**.
Odkazy se převádějí automaticky, ale dá se upravit slovní spojení, které bude na dotyčnou adresu ukazovat - např. "xomův fotoblog":[http://www.xom-tom.com/].
Další možnosti syntaxe
Komentáře formátuje Texy! Podrobná dokumentace syntaxe je ka nalezení na oficiálních stránkách.

RSS blogu
Seznam.cz RSS čtečka
Google.com RSS čtečka
Komentáře k článku (10×)
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 :)
|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.
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 :)
Hele, proč mi to moje uvozovky o-escapeovalo a tobě tvoje ne? :)
|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)
|5| - reakce na xom: Ta a mělo by to být v „cajku“ ;o)
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í:
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 :)
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)
|9| - reakce na zimmi: Vypadá to na problém s právy přístupu ke keši..