9 commenti my script, php

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.

DOWNLOAD

 

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):

  1. 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.);
  2. 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:

  1. il primo di questi fissa il numero di video da voler estrarre il cui valore massimo è 50  (pari a  di 25 default);
  2. il secondo stabilisce la posizione a partire dalla quale desideriamo selezionare (di default pari a 1);
  3. 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

avatar Maurizio

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.

avatar Alex

Alex

27 March 2013 ore 18:18

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?

avatar oly1982

oly1982

27 March 2013 ore 09:49

@Alex: si è possibile, ma non centra nulla con l'oggetto di questo articolo. Occorre creare un sistema di login.

avatar Alex

Alex

26 March 2013 ore 19:09

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!

avatar Emanuele

Emanuele

19 September 2012 ore 23:18

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?

avatar Andrea

Andrea

22 December 2011 ore 15:49

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

avatar Vincenzo

Vincenzo

25 August 2011 ore 11:47

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 :)

avatar oly1982

oly1982

24 August 2011 ore 23:40

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.

avatar Vincenzo

Vincenzo

24 August 2011 ore 22:51

Ciao scusami se ti disturbo, ma a me dopo un po di volte mi restituisce questo errore: <pre>Impossible open api. Come risolvo?