Interagire con le Youtube Api in PHP

di  Antonio Coschignano, marted́ 18 gennaio 2011

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
Tutto questo processo viene implementato in PHP attraverso una serie di classi che semplificano sia le richieste che la lettura dei dati, trasformando i le risposte XML, JSON etc.. in una rappresentazione ad oggetti. Le classi sono:
  • 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
La classe YoutubeDataApi implementa alcuni metodi statici che effettuano le chiamate alla piattaforma youtube ritornando come risposte oggetti PHP. Ma vediamo nel dettaglio con opportuni esempi tutte le operazioni che possiamo effettuare.

Info Video

Prima di inizare a vedere i metodi bisogna sapere che ogni video youtube è identificato da una stringa alfanumerica del tipo:

rsjFQMMU5Vg
che trovate sempre presente in ogni url di un video Youtube:
http://www.youtube.com/watch?v=rsjFQMMU5Vg
Per 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>

Esempio PHP Youtube Api - 1

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>

Esempio PHP Youtube Api Search

Per maggiori approfondimenti sull'argomento potete consultare la Developer's Guide di Google Labs.

Scarica la libreria Youtube Data API in formato zip

Altri link che potrebbero interessarti
  • » Utilizzare Google Analytics API con PHP
  • » Uno script Backlink Checker in PHP
  • » Script PHP per generare QR Codes
  • » Script Alexa Traffic Rank in PHP
  • » MySql Http Tunneling
  • » Google Webmaster Tools Api in PHP