Conception de la class YoutubeFeed
La class PHP regroupe la communication entre notre script et l'API de Youtube. La liste de vidéo est obtenue en 2 étapes:- transmettre les paramètres de la recherche à l'API,
- analyser le fichier retour, au format Json dans notre cas.
Pour faciliter son utilisation, la class intègre les fonctions:
- setOrderBy(): fixer l'ordre de tri des vidéos,
- getFeed(): retourner un tableau associatif du flux de recherche.
- sampleView(): afficher la liste de videos dans une page HTML.
<?php
/**
* Youtube.com API, rechercher et afficher des videos
*
* @author Fobec 11/2012
* @copyright http://www.fobec.com/php5/1119/afficher-videos-partir-youtube-com.html
*/
class YoutubeFeed {
const URL_API="http://gdata.youtube.com/feeds/api/videos?max-results=10&v=2&alt=json&orderby=";
const ORDER_NEWEST='published';
const ORDER_POPULAR='viewCount';
const ORDER_RATING='rating';
const ORDER_RELEVANCY='relevance';
private $orderby='published';
private $nfeed=array();
/**
* Executer une requete vers l'API Youtube V2
* Réponse au format json
* @param string $keywords
*/
public function query($keywords) {
$url=self::URL_API.$this->orderby.'&q='.urlencode($keywords);
$feed=@file_get_contents($url);
if ($feed==false) {
throw new Exception("Youtube API unavailable !!!");
}
$this->nfeed = json_decode($feed, TRUE);
}
/**
* Fixer l'ordre de tri
* @param string $order
*/
public function setOrderBy($order) {
$this->orderby=$order;
}
/**
* Retourner le tableau des videos
* @return array
*/
public function getFeed() {
return $this->nfeed;
}
/**
* Exemple d'affichage des videos
*/
public function sampleView() {
$buf='';
foreach ($this->nfeed['feed']['entry'] as $entry) {
$item=self::HTML_ITEM;
//tumb
$item=str_replace('{URL_THUMB}', $entry['media$group']['media$thumbnail'][0]['url'],
$item);
//link
$link='<a href="'.$entry['link'][0]['href'].'">'.$entry['title']['$t'].'</a>';
$item=str_replace('{URL_YOUTUBE}', $link, $item);
//descr
$s=trim(substr($entry['media$group']['media$description']['$t'],0,100));
$item=str_replace('{DESCR}', $s, $item);
//publié par
$author=$entry['author'][0]['name']['$t'];
$item=str_replace('{AUTHOR}', $author, $item);
//date
$dt=strtotime($entry['updated']['$t']);
$item=str_replace('{DATE}', date("d/m/Y H:m:s",$dt), $item);
$buf.=$item;
}
$page=self::HTML_PAGE;
$page=str_replace('{ROWS}', $buf, $page);
echo $page;
}
/** code HTML d'une video */
const HTML_ITEM='<div><table><tr>
<td rowspan="3">
<img src="{URL_THUMB}"></td>
<td>{URL_YOUTUBE}</td>
</tr>
<tr>
<td><span>{DESCR}</span></td>
</tr>
<tr>
<td><span>Ajouté par</span> {AUTHOR} <span>le</span> {DATE}</td>
</tr></table></div>';
/** code HTML de la page **/
const HTML_PAGE='<!DOCTYPE HTML>
<html lang="fr-FR">
<head>
<meta charset="UTF-8">
<title>Afficher des videos à partir de Youtube.com - Fobec.com</title>
<style type="text/css">
table{border:0px;width:500px}
img{border:0px;height:90px;width:120px;padding-right:20px}
a{color:#005C9C;text-decoration:none;font-weight:bold}
a:hover{color:#005C9C;text-decoration:underline;font-weight:bold}
span{font-size:0.8em;color:#666666}
div{padding:10px;border-bottom:1px solid #c0c0c0;width:520px}
</style>
</head>
<body>
{ROWS}
</body>
</html>';
}
?>
Exemple de recherche et d'affichage des videos
Le script ci-dessous affiche les vidéos youtube pour les mots clés 'marché noel' et filtré suivant la pertinence de la recherche.<?php
$YoutubeFeed=new YoutubeFeed();
try {
$YoutubeFeed->setOrderBy(YoutubeFeed::ORDER_RELEVANCY);
$YoutubeFeed->query('marche noel');
$YoutubeFeed->sampleView();
} catch (Exception $e) {
echo $e->getMessage();
}
?>
L'affichage choisi est minimaliste, à savoir: