Usare Google Data Protocol per integrare Youtube nella propria applicazione PHP
Google Data Protocol è un insieme di standard creati dal colosso di Mountain View mirati all’interscambio di dati fra applicazioni sul web. Fra le grandi innovazioni di questo protocollo possiamo annoverare:
- utilizzo di servizi di tipo REST per accedere ai dati;
- standardizzazione e completa apertura al pubblico dei formati XML;
- utilizzo del web semantico, per facilitare la classificazione, manipolazione e (essendo una creatura di Google) ricerca dei dati da parte di processi automatici, ovvero senza l’intervento umano.
Essendo essenzialmente un formato di interscambio, è completamente agnostico rispetto al linguaggio di programmazione utilizzato per accedervi; ciò ha portato alla creazione di moltissime librerie in diversi linguaggi: PHP, Java, Python, Ruby, eccetera. Noi però vedremo come sia davvero molto semplice interpretare “a mano” questi messaggi XML, utilizzando le funzionalità di base messe a disposizione da PHP.
Creare una pagina di ricerca
Vediamo un esempio che riesce a mettere in mostra molti dei dati a nostra dispozione, ovvero una pagina di ricerca dei video. Per prima cosa, diamo un’occhiata all’XML che ci viene restituito dalla query:
<?xml version='1.0' encoding='UTF-8'?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:yt="http://gdata.youtube.com/schemas/2007"> <id>http://gdata.youtube.com/feeds/api/videos</id> <updated>2011-11-27T11:28:23.460Z</updated> <category scheme="http://schemas.google.com/g/2005#kind" term="http://gdata.youtube.com/schemas/2007#video"/> <title type="text">YouTube Videos matching query: ciao</title> <logo>http://www.youtube.com/img/pic_youtubelogo_123x63.gif</logo> <link rel="alternate" type="text/html" href="http://www.youtube.com"/> <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos"/> <link rel="http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/batch"/> <link rel="self" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos?q=ciao&start-index=1&max-results=25"/> <link rel="next" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos?q=ciao&start-index=26&max-results=25"/> <author> <name>YouTube</name> <uri>http://www.youtube.com/</uri> </author> <generator version="2.1" uri="http://gdata.youtube.com">YouTube data API</generator> <openSearch:totalResults>183383</openSearch:totalResults> <openSearch:startIndex>1</openSearch:startIndex> <openSearch:itemsPerPage>25</openSearch:itemsPerPage> <entry> <id>http://gdata.youtube.com/feeds/api/videos/pnVbfO-jw_s</id> <published>2008-03-03T05:58:34.000Z</published> <updated>2011-11-26T06:50:14.000Z</updated> <category scheme="http://schemas.google.com/g/2005#kind" term="http://gdata.youtube.com/schemas/2007#video"/> <category scheme="http://gdata.youtube.com/schemas/2007/categories.cat" term="Film" label="Film e animazione"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Ciao"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Alessandro"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Calza"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Yen"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="Tan"/> <category scheme="http://gdata.youtube.com/schemas/2007/keywords.cat" term="cytan"/> <title type="text">CIAO Trailer</title> <content type="text">Visit ciaomovie.com for more details.</content> <link rel="alternate" type="text/html" href="http://www.youtube.com/watch?v=pnVbfO-jw_s&feature=youtube_gdata"/> <link rel="http://gdata.youtube.com/schemas/2007#video.responses" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/pnVbfO-jw_s/responses"/> <link rel="http://gdata.youtube.com/schemas/2007#video.related" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/pnVbfO-jw_s/related"/> <link rel="http://gdata.youtube.com/schemas/2007#mobile" type="text/html" href="http://m.youtube.com/details?v=pnVbfO-jw_s"/> <link rel="self" type="application/atom+xml" href="http://gdata.youtube.com/feeds/api/videos/pnVbfO-jw_s"/> <author> <name>cytan8</name> <uri>http://gdata.youtube.com/feeds/api/users/cytan8</uri> </author> <gd:comments> <gd:feedLink href="http://gdata.youtube.com/feeds/api/videos/pnVbfO-jw_s/comments" countHint="135"/> </gd:comments> <media:group> <media:category label="Film e animazione" scheme="http://gdata.youtube.com/schemas/2007/categories.cat">Film</media:category> <media:content url="http://www.youtube.com/v/pnVbfO-jw_s?version=3&f=videos&app=youtube_gdata" type="application/x-shockwave-flash" medium="video" isDefault="true" expression="full" duration="103" yt:format="5"/> <media:content url="rtsp://v4.cache1.c.youtube.com/CiILENy73wIaGQn7w6PvfFt1phMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="103" yt:format="1"/> <media:content url="rtsp://v4.cache6.c.youtube.com/CiILENy73wIaGQn7w6PvfFt1phMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="103" yt:format="6"/> <media:description type="plain">Visit ciaomovie.com for more details.</media:description> <media:keywords>Ciao, Alessandro, Calza, Yen, Tan, cytan</media:keywords> <media:player url="http://www.youtube.com/watch?v=pnVbfO-jw_s&feature=youtube_gdata_player"/> <media:thumbnail url="http://i.ytimg.com/vi/pnVbfO-jw_s/0.jpg" height="360" width="480" time="00:00:51.500"/> <media:thumbnail url="http://i.ytimg.com/vi/pnVbfO-jw_s/1.jpg" height="90" width="120" time="00:00:25.750"/> <media:thumbnail url="http://i.ytimg.com/vi/pnVbfO-jw_s/2.jpg" height="90" width="120" time="00:00:51.500"/> <media:thumbnail url="http://i.ytimg.com/vi/pnVbfO-jw_s/3.jpg" height="90" width="120" time="00:01:17.250"/> <media:title type="plain">CIAO Trailer</media:title> <yt:duration seconds="103"/> </media:group> <gd:rating average="4.8023257" max="5" min="1" numRaters="258" rel="http://schemas.google.com/g/2005#overall"/> <yt:statistics favoriteCount="472" viewCount="304821"/> </entry> [...] </feed>
Per ottenere questo feed dobbiamo semplicemente eseguire una richiesta
HTTP a questo indirizzo:
http://gdata.youtube.com/feeds/api/videos?q=ciao
Possiamo notare che c’è un elemento <entry> per ogni video trovato, non ci
resta quindi che prendere questi dati e formattarli nella maniera che più ci
piace! La documentazione è molto completa, la potete trovare sulla pagina dedicata su Google Code.
Ecco quindi il codice PHP per una pagina di ricerca video che non fa uso di librerie esterne:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>Youtube API</title> <style type="text/css"> #container { width: 960px; font-family: Helvetica; } div.entry { clear: both; width: 640; border-top: 1px solid #eee; } div.entry h4 { margin-bottom: 5px; } div.keywords { font-size: 0.8em; margin-bottom: 5px; } div.thumbnail { clear: left; float: left; width: 120px; height: 90px; } div.description { width: 740px; margin-left: 135px; } br.clearfix { clear: both; } </style> </head> <body> <div id="container"> <h1>Esempi Youtube API</h1> <h3>Ricerca video</h3> <?php $query = ""; if (isset($_GET['q'])) { $query = $_GET['q']; } ?> <form> <input name="q" value="<?php echo filter_var($query, FILTER_SANITIZE_SPECIAL_CHARS); ?>" /> <button type="submit">Cerca</button> </form> <? if ($query) { $xml = simplexml_load_file('http://gdata.youtube.com/feeds/api/videos?'. $_GET['q']); $namespaces = $xml->getNameSpaces(true); foreach($xml->entry as $entry) { $id = $entry->id; $media = $entry->children($namespaces['media']); $videoURL = ""; foreach($entry->link as $link) { if ($link['rel'] == 'alternate') { $videoURL = $link['href']; break; } } $title = $media->group->title; $description = $media->group->description; $keywords = $media->group->keywords; $thumb = $media->group->xpath("media:thumbnail[@width='120' and @height='90']"); ?> <div class="entry"> <h4><?php echo $title ?></h4> <div class="keywords">Keywords: <em><?php echo $keywords; ?></em></div> <div class="thumbnail"> <a href="<?php echo $videoURL; ?>"> <img src="<?php echo($thumb[0]['url']); ?>" width="120" height="90" /> </a> </div> <div class="description"> <?php echo $description; ?> </div> <br class="clearfix" /> </div> <?php } } // if ($query) ?> </div> </body> </html>
Ovviamente le personalizzazioni sono fondamentali, quindi il consiglio è come al solito di sperimentare!