Interagire con le Youtube Api in PHP
Le API di YouTube consentono di integrare le funzionalità e i contenuti video di YouTube sia in applicazioni web che in applicazioni desktop o per dispositivi mobile. Abbiamo due livelli di accesso alla piattaforma Yoututbe: uno ci consente di effettuare upload di video e tante altre funzioni che prevedono il processo di autenticazione, che quindi implica il possesso di un'account Youtube. Mentre l'altro livello ci consente solo ed esclusivamente la lettura delle informazioni che riguardano i video, le ricerche, i commenti ect.. Bene, in questo articolo vedremo una piccola libreria di classi che ci consente di interagire con la piattaforma Youtube solo a livello di lettura, cioè senza autenticazione, che ci permette di :
- Avere accesso a tutte le informazioni che riguardano un video: rating, titolo, descrizione, thumbnails etc..
- Effettuare ricerche in base a parole chiavi, autore etc..
- Avere accesso ai commenti associati ad un video
- YoutubeDataApi: contiene i diversi metodi per effettuare le richieste alla piattaforma
- Video: un'oggetto che incapsula le principali informazioni che riguardano un video
- Comment: un commento relativo ad un video
- Search: per impostare un criterio di ricerca
Info Video
Prima di inizare a vedere i metodi bisogna sapere che ogni video youtube è identificato da una stringa alfanumerica del tipo:
rsjFQMMU5Vgche trovate sempre presente in ogni url di un video Youtube:
http://www.youtube.com/watch?v=rsjFQMMU5VgPer tutti i metodi che vedremo è possibile specificare sia l'url o l'id. Adesso vediamo come reperire tutte le informazioni che riguardano un video:
include("youtube.php"); ... $url = "http://www.youtube.com/watch?v=rsjFQMMU5Vg"; $video = YoutubeDataApi::getVideoResponse($url); echo $video->getTitle(); echo $video->getDescription(); ...Il metodo statico YoutubeDataApi::getVideoResponse() ritorna un'oggetto Video che contiene i metodi per accedere alle diverse informazioni. Ad esempio per visualizzare i diversi thumbnails che sono associati al video bisogna utilizzare il metodo getThumbnails() che ritorna un array cosi composto:
$images = $video->getThumbnails(); .... print_r($images); .... .... Array ( [0] => Array ( [url] => http://i.ytimg.com/vi/rsjFQMMU5Vg/2.jpg [width] => 120 [height] => 90 ) [1] => Array ( [url] => http://i.ytimg.com/vi/rsjFQMMU5Vg/1.jpg [width] => 120 [height] => 90 ) [2] => Array ( [url] => http://i.ytimg.com/vi/rsjFQMMU5Vg/3.jpg [width] => 120 [height] => 90 ) [3] => Array ( [url] => http://i.ytimg.com/vi/rsjFQMMU5Vg/0.jpg [width] => 320 [height] => 240 ) ) ... echo "<img src='".$images[0]['url]."' />";Ecco un esempio completo di implementazione:
<?php include("youtube.php"); $video = YoutubeDataApi::getVideoResponse("http://www.youtube.com/watch?v=rsjFQMMU5Vg"); $imgs = $video->getThumbnails(); ?> <html> <head> <meta http-equiv="Content-Type" content="utf-8"/> <title>Youtube Api Demo</title> <style type="text/css"> td, th { padding:3px; border: 1px #ccc solid; } table { border-collapse: collapse; width:50%; font-family:verdana; font-size:11px; } </style> </head> <body> <table> <tr> <td rowspan="9"> <img alt="<?php echo $video->getTitle() ?>" src="<?php echo $imgs[3]['url'] ?>"> </td> </tr> <tr><td><b>Titolo </b><?php echo $video->getTitle() ?></td></tr> <tr><td><b>Descrizione </b><?php echo $video->getDescription() ?></td></tr> <tr><td><b>Autore </b><?php echo $video->getAuthor() ?></td></tr> <tr><td><b>Commenti </b><?php echo $video->getCountComments() ?></td></tr> <tr><td><b>Data </b><?php echo $video->getPublished() ?></td></tr> <tr><td><b>Update </b><?php echo $video->getUpdated() ?></td></tr> <tr><td><b>Id </b><?php echo $video->getVideoId() ?></td></tr> <tr><td><b>Url </b><a href="<?php echo $video->getUrl() ?>"> <?php echo $video->getUrl() ?></a ></td></tr> <tr> <td> <img alt="<?php echo $video->getTitle() ?>" src="<?php echo $imgs[2]['url'] ?>"> <img alt="<?php echo $video->getTitle() ?>" src="<?php echo $imgs[1]['url'] ?>"> <img alt="<?php echo $video->getTitle() ?>" src="<?php echo $imgs[0]['url'] ?>"> </td> <td></td> </tr> </table> </body> </html>
I metodi della classe Video purtroppo non ricoprono tutte le informazioni del video, ma che comuqnue sono presenti nell'oggetto sottoforma di array che incapsula l'intera risposta JSON. Quindi basta invocare il metodo getArrayJson() per avere accesso all'array. Consiglio di stampare l'array tramite il metodo print_r() per comprenderne l'intera struttura:
echo "<pre>"; print_r($video->getArrayJson()); echo "</pre>";
I commenti
Per i commenti bisogna richiamare il metodo YoutubeDataApi::getComments() che riceve come parametro in ingresso l'id o l'url del video. Il metodo ritorna un'array di oggetti di tipo Comment dove ciascuno contiene le informazioni di ogni singolo commento:$url = "http://www.youtube.com/watch?v=rsjFQMMU5Vg"; $comments = YoutubeDataApi::getComments($url); foreach ($comments as $comment) { echo "<ul>"; echo "<li>".$comment->getTitleComment()."</li>"; echo "<li>".$comment->getComment()."</li>"; echo "<li>".$comment->getUser()."</li>"; echo "</ul>"; }
Ricerca Video
La ricerca è abbastanza semplice da effettuare. Basta creare un'istanza della classe Search e passarla come parametro al metodo YoutubeDataApi::search() che ritorna un'array di oggetti Video come risposta in base alla query che abbiamo impostato. Per la ricerca possiamo impostare oltre alla query anche l'autore, l'ordine dei risultati, il numero massimo di risultati e l'indice di partenza:
$search = new Search(); $search->setQuery("youtube api"); $search->setAuthor("..."); $search->setOrderBy("published"); $search->setMaxResults("..."); $search->setStartIndex("..."); $result = YoutubeDataApi::search($search); foreach($result as $vid) { ... echo $video->getTitle(); }Per il metodo setOrderBy() consultate la Reference Guide dove sono elencati i diversi parametri che si possono specificare. Con poche semplici operazioni quindi possiamo implementare un motore di ricerca di video Yotube come nell'esempio qui sotto:
<?php include("youtube.php"); $query = ""; if(isset($_GET['q'])) $query = $_GET['q']; $search = new Search(); $search->setQuery($query); $videos = YoutubeDataApi::search($search); function truncate($str, $len = 150) { if(strlen($str)>=$len) return substr($str, 0,$len)."..."; } ?> <html> <head> <meta http-equiv="Content-Type" content="utf-8"/> <title>Youtube Api Demo</title> <style type="text/css"> a {text-decoration:none} td, th { padding:3px; border: 1px #ccc solid; } table { border-collapse: collapse; width:50%; font-family:verdana; font-size:11px; } td.box { padding-top:10px;} p.title { color:blue; font-weight:bold; } p.description {} p.author { color:green; } </style> </head> <body> <table> <tr> <td class="box" colspan="2" align="center"> <form action="" method="GET"> <input type="text" name="q" size="30" value="<?php if(isset($_GET['q'])) echo $_GET['q'] ?>"> <input type="submit" value="Cerca"> </form> </td> </tr> <?php foreach ($videos as $video) { $imgs = $video->getThumbnails(); ?> <tr><td> <a target="_blank" href="<?php echo $video->getUrl() ?>"> <img border="0" alt="<?php echo $video->getTitle() ?>" src="<?php echo $imgs[0]['url'] ?>"> </a> </td> <td valign="top"> <p class="title"> <a target="_blank" href="<?php echo $video->getUrl() ?>"> <?php echo $video->getTitle() ?></a></p> <p class="description"> <em><?php echo truncate($video->getDescription()) ?></em></p> <p class="author"><?php echo $video->getAuthor() ?></p> </td> </tr> <?php } ?> </table> </body> </html>
Per maggiori approfondimenti sull'argomento potete consultare la Developer's Guide di Google Labs.