16 Jun 2011 9 commenti
Youtube mette a disposizione dei programmatori una vastissima gamma di feed grazie ai quali sarà possibile interfacciarsi con la piattaforma e leggere i dati presenti sfruttando le API di YouTube.
La classe YoutubeApiReader che ho realizzato ci servirà per leggere i feed dai canali YouTube nel modo più agevole possibile. Ovviamente la classe potrebbe essere ulteriormente estesa (e perfezionata) così da adattarla alle nostre specifiche esigenze.
Istanza della classe
Il costruttore della classe richiede come parametro obbligatorio il nome del canale (l'username utilizzato). Nell'esempio che segue ho impostato il canale ufficiale di google su YouTube:
require_once('lib/YoutubeApiReader.class.php'); /************************************************ ISTANZA DELLA CLASSE INDICANDO IL NOME DEL CANALE ************************************************/ $YT = New YoutubeApiReader('google');
Dopodichè avremo a disposizione due metodi (public):
- read_api_chanell(): che ci darà come return un oggetto con una serie proprietà in cui sono presenti i principali dati del nostro canale (ad esempio numero di iscritti, numero di visualizzazioni del canale, etc. etc.);
- read_api_video(): che ci darà come return un array di oggetti ognuno dei quali conterrà i dati che caratterizzano un singolo video da noi caricato (numero di visualizzazioni, durata, numero di commenti, etc. etc.).
Le informazioni sul canale
Per ottenre i dati del canale Youtube (indicato nel costruttore) utilizzeremo il metodo read_api_chanell() il cui return sarà un oggetto con le segueti proprietà:
- title: il titolo attribuito al canale;
- thumbnail: l'URL dell'immagine avatar;
- published: la data di iscrizione;
- lastWebAccess: la data dell'ultimo accesso;
- viewCount: numero di visualizzazioni del canale;
- totalUploadViews: numero totale delle visualizzazioni dei video del canale;
- uploadsCount: numero di video caricati;
- subscriberCount: numero di iscritti al canale;
- subscriptionsCount: numero di iscrizioni effettuate dal canale;
- favouritesCount: numero di video che compongono i favoriti.
Avremo quindi:
/************** READ CHANELL DATA ***************/ $chanell = $YT->read_api_chanell(); echo '<br />Title: '. $chanell->title; echo '<br />Thumbnail: <img src="'. $chanell->thumbnail .'" />'; echo '<br />Published: '. $chanell->published; echo '<br />Last web access: '. $chanell->lastWebAccess; echo '<br />View Count: '. $chanell->viewCount; echo '<br />Total Upload Views: '. $chanell->totalUploadViews; echo '<br />Uploads Count: '. $chanell->uploadsCount; echo '<br />Subscriber Count: '. $chanell->subscriberCount; echo '<br />Subscriptions Count: '. $chanell->subscriptionsCount; echo '<br />Favourites Count: '. $chanell->favouritesCount;
Se qualcuno desidera ottenere ulteriori info sul canale YouTube mi lasci un commento specificando la propria esigenza.
I video del canale
Per ottenere le informazioni sui singoli video caricati sul canale utilizzeremo il metodo read_api_video() il cui return sarà un array costituito di oggetti che contengono le seguenti proprietà:
- author: l'username che ha caricato il video (in questo caso corrisponde con l'username impostato nel costruttore ma in caso di ulteriori implementazioni della classe ci tornerà utile);
- id: codice alafanumerico che identifica un video;
- watch: l'URL alla pagina YouTube per visualizzare il video;
- title: titolo attirbuito al video;
- published: data di pubblicazione del video;
- description: descrizione del video;
- duration: durata in secondi del video;
- thumbnail: un array contenente gli URL di 4 immagini di anteprima del video;
- viewCount: numero di visualizzazioni del video;
- commentsCount: numero di commenti del video.
Avremo altresì a disposizione il metodo get_embed() per ottenere l'embed per la visualizzazione del video. Tale metodo accetterà due parametri opzionali per fissare il width e l'height del video.
/************************ READ VIDEO CHANNELL DATA ************************/ foreach($YT->read_api_video() as $video){ echo '<br />Author: '. $video->author; echo '<br />ID video: '. $video->id; echo '<br />URL watch: <a href="'. $video->watch .'" target="_blank">' .$video->watch. '</a>'; echo '<br />Title video: '. $video->title; echo '<br />Published: '. $video->published; //SEE EXAMPLES FOR FORMATTING DATA echo '<br />Description: '. $video->description; echo '<br />Duration (seconds): ' .$video->duration; foreach($video->thumbnail as $thumbnail){ echo '<br />Thumbnail: <img src="' .$thumbnail. '" />'; } echo '<br />Wiev count: '. $video->viewCount; echo '<br />Comments count: '.$video->commentsCount; echo '<br />Embed: ' . $video->get_embed(); echo '<hr />'; }
Il metodo read_api_video() può essere utilizzato sfruttando i tre parametri opzionali:
- il primo di questi fissa il numero di video da voler estrarre il cui valore massimo è 50 (pari a di 25 default);
- il secondo stabilisce la posizione a partire dalla quale desideriamo selezionare (di default pari a 1);
- il terzo parametro stabilisce l'ordine di estrazione e potrà assumere come valori "relevance", "published" (valore di default), "viewCount" o "rating" (basato sui mi piace/non mi piace ricevuti dal video); 'relevance' assume scarsa utilità in questo tipo di utilizzo delle API ma ci ritornerà utile in caso di ampliamenti della classe per effettuare ricerche.
Facciamo alcuni esempi:
// l'ultimo video pubblicato (solo 1) print_r($YT->read_api_video(1)); // gli ultimi 5 video pubblicati print_r($YT->read_api_video(5)); // il video più visto print_r($YT->read_api_video(1,1,'viewCount')); // i 5 video più visti print_r($YT->read_api_video(5,1,'viewCount')); // i 5 video più visti a partire dal terzo print_r($YT->read_api_video(5,3,'viewCount'));
I primi due parametri utilizzati in combinato possono tornarci utili per realizzare l'impaginazione dei video.
Per chi conosce la clausole LIMIT e ORDER BY di MySql il meccanismo è pressochè lo stesso.
Il formato delle date
Le date (presenti in published o lastWebAccess) sono formattate nel formato UTC e per essere convertite è possibile ricorrere a str_to_time() in combinato con date(). Ad esempio:
echo '<br />Formatted data: ' . date('j F Y', strtotime($chanell->lastWebAccess)); echo '<br />Last access (date difference): ' . ceil( (time() - strtotime($chanell->lastWebAccess)) / 86400 ) .' days ago';
Requisiti
E' richiesto php 5, e il parametro del php.ini allow_url_fopen abilitato.
La classe sfrutta l'estensione SimpleXML ed in particolare SimpleXMLElement.
Per ottenere il sorgente dell'XML viene impiegata file_get_contents().
Quest'ultima a seconda delle impostazioni e dei permessi del proprio server potrebbe essere disabilitata (su Altervista ad esempio) ma modificando la classe, ed in particolare il metodo load_file() in essa presente, si potrebbe utilizzate alternativamente fsockopen o cURL.
Conclusioni
Ho scoperto recentemente le API di YouTube e ne sono rimasto particolarmente colpito. Danno la possibilità di risalire a qualsiasi dato e manipolarli grazie ad una ampia serie di parametri (la presente classe ne utilizza solo qualcuno che ho ritenuto più utile); inoltre tali API permetto di eseguire ricerche all'interno del portale.
Non sono semplicissime da leggere dato che utilizzano namespace particolari.
Per qualsiasi dubbio o per problemi di implementazione non esistate a lasciarmi un commento e sarò lieto di potervi aiutare.

Olimpio Romanella
Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.
Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.
9 Commenti presenti
Ah no? Mi hanno detto che questa cosa si basa sulle API fornite da YouTube: una per prelevare i miei iscritti; un' altra per ottenere il nome di chi è collegato su youtube. E' giusto?
@Alex: si è possibile, ma non centra nulla con l'oggetto di questo articolo. Occorre creare un sistema di login.
Ciao, premetto che non so quasi nulla di PHP, magari soltanto qualcosa di HTML... volevo chiedere se esistesse un metodo per far visualizzare una determinata pagina solo ai miei iscritti.
Es. Chi non è iscritto non potrà visualizzare www.sito.com
E' possibile? Se sì, mi potreste gentilmente spiegare come fare perfavore? Grazie mille in anticipo!
Ciao, ottimo lavoro, però c'è qualche problemino a farlo girare sotto https.
Chrome purtroppo non legge il contenuto, nonostante abbia un certificato valido, molto probabilmente perchè lo script ha all'interno link che rimandano ad http.
Questo lo rende inutilizzabile ad esempio sulle tab di facebook che richiedono obbligatoriamente https.
Qualche idea su come risolvere il problema?
Ciao,
vorrei chiederti un consiglio.
Devo inserire nel mio sito un carousel dinamico (che scorra quinti) composto da 4/5 thumbnail dei video caricati sul mio canale youtube.
L'utente sceglie la miniatura e vede il video con il player di youtube in modalità lightbox...
Non sono riuscito a crearlo...puoi darmi una mano?
Grazie 1000,
Andrea
Adesso sto guardando per risolvere questo problema poiché è abbastanza fastidioso il fatto che dopo un po di tentativi le api mi ritornino un quell'errore e quindi mi " blocchino " l'esecuzione di un altra applicazione che carica le api. Comunque preferibilmente non vorrei utilizzare la libreria cURL per problemi di compatibilità.
Comunque a occhio e croce il problema non sembra del tuo youtube api reader anche perché ho ricontrollato il codice e ho effettuato vari debug senza nessun errore. Il problema credo che sia da attribuirsi alle api di youtube che dopo un tot di richieste, le mettano in "attesa", credo che sia così, adesso vado a leggermi le reference ufficiali delle api. Tu ne sai qualcosa ?
Comunque grazie mille :) e ottimo sito :)
In base a quanto mi dici non saprei dirti esattamente la causa.
Di certo è il problema risiede nel metodo load_file() ai righi 18-30 del file YoutubeApiReader.class.php dove si utilizza la funzione con file_get_contents().
Il fatto che generalmente ti funziona e in alcuni casi invece no però mi disorienta. Bisognerebbe capire per quale ragione file_get_contents() fallisce.
Se sai smanettare con php puoi provare a modificare il metodo load_file() all'interno della classe YoutubeApiReader e anzichè utilizzare file_get_contents impiegare la libreria CURL.
Ciao scusami se ti disturbo, ma a me dopo un po di volte mi restituisce questo errore: <pre>Impossible open api. Come risolvo?
Maurizio
21 May 2013 ore 00:11
Ciao, ho implementato nel mio sito tutto il sistema di API relative al login utente tramite account Google/Google+... vorrei chiederti se per gli utenti loggati, di cui conosco l'id utente dell'account Google mediante le chiamate alle API G+ di profilo, è possibile sapere con le API di YouTube se un certo utente è iscritto al mio canale YouTube... in altre parole esiste una funzione apposita delle API YouTube che passando l'id dell'utente loggato mi dice se è iscritto al canale associato al mio sito? Grazie per l'aiuto.