I. Introduction▲
La vidéo est devenue en quelques années une composante majeure d'Internet et s'impose comme un élément incontournable pour enrichir le contenu d'un site web. Les webmestres qui souhaitent utiliser ce média sont souvent confrontés à des soucis d'hébergement car les fichiers vidéos pesant de quelques Mo à plusieurs Go, le manque d'espace disque devient vite problématique. Heureusement sont apparus des sites d'hébergement de vidéos comme YouTube ou Dailymotion (pour ne citer que les principaux) qui offre au grand public un service gratuit de partage et de diffusion de vidéos.
YouTube va encore plus loin puisqu'il propose depuis peu une API et ouvre ainsi son service de partage de vidéos aux développeurs désireux d'utiliser cette plateforme pour enrichir le contenu de leur site internet. Recherche par mots-clés, classement des meilleurs vidéos, upload de fichiers, nous allons voir que de nombreuses applications sont possibles. La plus intéressante est certainement l'envoi de fichiers vidéos depuis son site web directement sur la plateforme YouTube, et ce en toute transparence pour les internautes.
II. Pré-requis▲
- de connaître les langages PHP et HTML
- d'avoir suivi le tutoriel sur l'upload de fichiers en PHPTutoriel sur l'upload de fichiers en PHP
- d'avoir quelques notions sur le Framework Zend
- de disposer d'un serveur (local ou distant) avec une version PHP >= 5.1.4
Public visé : développeurs PHP de niveau intermédiaire ou avancé.
III. Installation▲
L'utilisation de l'API YouTube requiert 3 étapes préalables : l'installation de Zend_GData, l'ouverture d'un compte YouTube et enfin la création d'une clé développeur.
III-A. Installation de Zend_GData▲
L'API YouTube fait partie des nombreuses APIs proposées par Google et regroupées sous le sigle GData (pour Google Data). Son utilisation avec des applications PHP passe par le Framework Zend, et notamment la librairie Zend_GData, qui contient des classes spécifiques simplifiant son intégration à un projet PHP. Il faudra donc installer une version de Zend_GData, si possible >= 1.7.2.
- Commencer par télécharger la dernière version de Zend_GData disponible à l'adresse : http://framework.zend.com/download/webservices/
- Décompresser l'archive. Vous y trouverez un dossier "library" qui contient un sous-dossier "Zend".
- Placer ce répertoire Zend à la racine de votre site, ou dans votre répertoire qui contient les librairies PHP. Vous noterez que ce dossier contient un sous-répertoire GData.
- La librairie Zend_GData, et par conséquent l'accès à l'API YouTube sont installés.
III-B. Inscription à YouTube▲
- Aller sur le site www.youtube.com et créer un nouveau compte via le lien Inscription (si vous n'en possédez pas déjà un).
- Conserver vos identifiants de connexion (login et mot de passe).
III-C. Création d'une clé développeur▲
Les vidéos publiques de YouTube sont en accès libre et vous pouvez d'ors et déjà effectuer des recherches grâce à la librairie Zend_GData. Cependant, les opérations avancées comme l'upload, la modification et la suppression de vidéos requirent une identification. Cette authentification passe par une "clé développeur" qui vous sera demandée pour communiquer avec la plateforme YouTube.
- Rendez-vous sur la page : http://code.google.com/apis/youtube/dashboard/
- Cliquer sur le lien "Create new developer key" et compléter le formulaire.
- Vous obtiendrez alors 3 identifiants : une clé développeur (Developer Key), un identifiant client (Client ID) et un identifiant pour votre application (Product ID).
- Conserver ces 3 informations sous la main.
IV. Première utilisation▲
Vous avez installé correctement le Framework Zend, ouvert un compte YouTube et créer vos identifiants de connexion ? Voyons maintenant alors si tout fonctionne correctement. Pour cela, nous nous proposons d'effectuer une recherche de vidéos sur le mot clé "sport".
<?php
require_once 'Zend/Gdata/YouTube.php'
;
// on charge la librairie YouTube
// fonction permettant d'afficher les informations sur une vidéo
function
printVideoEntry($videoEntry
)
{
echo 'Titre : '
.
$videoEntry
->
getVideoTitle() .
"<br />
\n
"
;
echo 'Description: '
.
$videoEntry
->
getVideoDescription() .
"<br />
\n
"
;
echo 'Tags: '
.
implode(", "
,
$videoEntry
->
getVideoTags()) .
"<br />
\n
"
;
echo 'URL du player Flash: <a href="'
.
$videoEntry
->
getFlashPlayerUrl() .
'">'
.
$videoEntry
->
getFlashPlayerUrl() .
"</a>
\n
"
;
}
// fonction permettant d'afficher les vidéos provenant d'un flux
function
printVideoFeed($videoFeed
)
{
$count
=
1
;
foreach
($videoFeed
as
$videoEntry
) {
echo "<p>Vidéo n°"
.
$count
.
"<br />
\n
"
;
printVideoEntry($videoEntry
);
echo "</p>
\n
"
;
$count
++;
}
}
// on lance la recherche sur le mot-clé "sport"
$yt
=
new
Zend_Gdata_YouTube();
// on crée une nouvelle instance YouTube
$yt
->
setMajorProtocolVersion(2
);
$query
=
$yt
->
newVideoQuery();
$query
->
setOrderBy('viewCount'
);
// on souhaite classer les vidéos par le nombre de lecture
$query
->
setTime('this_week'
);
// on souhaite afficher seulement les vidéos de la semaine passée
$query
->
setVideoQuery('sport'
);
// on définit le mot-clé
// on récupère un flux XML avec la liste des vidéos
$videoFeed
=
$yt
->
getVideoFeed($query
->
getQueryUrl(2
));
// on affiche les vidéos
printVideoFeed($videoFeed
);
?>
Vous aurez remarqué que chaque vidéo est considérée comme un objet PHP appelé $VideoEntry qui contient diverses informations (titre, description, catégorie, durée, etc.). Vous pouvez retrouver la liste complète des informations associées à une vidéo sur le guide développeur : PHP - YouTube Apis and Tools. La recherche d'une vidéo renvoie en réalité un flux de plusieurs vidéos, flux qui peut alors être parcouru comme un simple tableau d'objets $VideoEntry.
Voyons maintenant comment utiliser les autres fonctionnalités de YouTube, et notamment l'envoi de fichiers vidéo.
V. L'envoi de vidéos▲
Grâce à l'API YouTube, il n'est désormais plus nécessaire de vous connecter à votre espace YouTube pour envoyer de nouvelles vidéos. En effet, l'API YouTube autorise l'envoi, la modification et même la suppression de vidéos depuis une application tierce (comme un blog ou un site web). Bien entendu, vous ne pourrez supprimer n'importe quelle vidéo, mais vous pourrez gérer toutes les vidéos de votre compte, et ce en toute simplicité.
- Authentification grâce à votre login/passe YouTube et votre clé développeur
- Envoi d'informations sur la vidéo : titre, description, tags, catégorie. Ces 4 informations sont requises.
- L'API YouTube retourne alors un identifiant unique (token)
- Envoi de la vidéo associée au token par le biais d'un formulaire HTML
- Traitement de la vidéo et retour d'erreurs si nécessaire
V-A. L'authentification▲
Plusieurs authentifications sont proposées par l'API YouTube mais par simplicité nous allons utiliser l'identification http. Elle permet de s'identifier à son compte par un simple script PHP, et ce sans passage par le site YouTube.
<?php
require_once 'Zend/Gdata/YouTube.php'
;
require_once 'Zend/Gdata/ClientLogin.php'
;
// configuration et identifiants
$authenticationURL
=
'https://www.google.com/youtube/accounts/ClientLogin'
;
$developerKey
=
''
;
// Clé développeur
$applicationId
=
'ytapi-XXXXXXXXXX'
;
// Identifiant de l'application
$clientId
=
'ytapi-YYYYYYYYYYY'
;
// Identifiant Client
$username
=
"login"
;
// Login de votre compte YouTube
$password
=
"pass"
;
// Mot de passe de votre compte YouTube
// authentification via la méthode HTTP
$httpClient
=
Zend_Gdata_ClientLogin::
getHttpClient(
$username
,
$password
,
'youtube'
,
null
,
'MonSiteWeb'
,
null
,
null
,
$authenticationURL
);
$yt
=
new
Zend_Gdata_YouTube($httpClient
,
$applicationId
,
$clientId
,
$developerKey
);
?>
V-B. Envoi d'informations sur la vidéo▲
Une fois identifié, vous pouvez désormais préparer l'envoi de la vidéo en donnant des informations comme le titre, la description, la catégorie et des mots-clés (tags). Notez qu'il est possible de définir des tags spécifiques appelés Developer Tags (tags développeur) qui peuvent être utilisé pour identifier la vidéo plus rapidement.
<?php
// création d'un nouvel objet video
$myVideoEntry
=
new
Zend_Gdata_YouTube_VideoEntry();
// on donne des informations sur notre vidéo
$myVideoEntry
->
setVideoTitle('Titre de ma video'
);
$myVideoEntry
->
setVideoDescription('Description de ma video'
);
$myVideoEntry
->
setVideoCategory('Sports'
);
// La catégorie doit correspondre à une catégorie YouTube
$myVideoEntry
->
SetVideoTags('motclé1, motclé2'
);
$myVideoEntry
->
SetVideoDeveloperTags(array
('mydevtag'
,
'anotherdevtag'
));
?>
V-C. Récupération du token▲
Une fois authentifié, nous allons informer la plateforme YouTube que nous souhaitons envoyer une vidéo. L'API nous renvoie un identifiant unique, ou token, qui sera nécessaire pour créer le formulaire d'upload.
<?php
// Récupération du token
$tokenHandlerUrl
=
'http://gdata.youtube.com/action/GetUploadToken'
;
$tokenArray
=
$yt
->
getFormUploadToken($myVideoEntry
,
$tokenHandlerUrl
);
$tokenValue
=
$tokenArray
[
'token'
];
$postUrl
=
$tokenArray
[
'url'
];
?>
V-D. Envoi de la vidéo▲
Nous avons un token valide, nous pouvons désormais créer le formulaire permettant de choisir le fichier vidéo à uploader :
<?php
// Page sur laquelle sera renvoyé l'utilisateur après la validation
// du formulaire (URL de retour)
$nextUrl
=
'http://www.monsiteweb.com/upload_video_ok.php'
;
// Affichage du formulaire
$form
=
'<form action="'
.
htmlspecialchars($postUrl
,
ENT_QUOTES) .
'?nexturl='
.
urlencode($nextUrl
) .
' method="post" enctype="multipart/formdata">
Fichier vidéo : <input name="file" type="file"/>
<input name="token" type="hidden" value="'
.
$tokenValue
.
'"/>
<input value="Envoyer la vidéo" type="submit" />
</form>'
;
echo $form
;
?>
V-E. Retour d'erreur et affichage de la vidéo▲
Lorsque l'utilisateur valide le formulaire d'upload, le fichier choisi est alors envoyé sur votre compte YouTube et va être analysé. En parallèle, YouTube renvoie des informations sur votre page $nextURL que vous avez précédemment définie.
L'URL de retour se présente sous la forme : http://www.monsiteweb.com/upload_video_ok.php?status=200&id=JPF-DXF7hzc
status détermine si la vidéo a pu être envoyée correctement. id correspond à l'identifiant YouTube de la vidéo.
<?php
if
(isset($_GET
[
'status'
]
) AND
$_GET
[
'status'
]==
200
) {
$videoId
=
$_GET
[
'id'
];
$location
=
'http://gdata.youtube.com/feeds/api/users/'
.
$username
.
'/uploads/'
.
$videoId
;
$message
=
''
;
require_once 'Zend/Gdata/YouTube.php'
;
$yt
=
new
Zend_Gdata_YouTube();
$myVideoEntry
=
$yt
->
getVideoEntry(null
,
$location
);
$videoControl
=
$myVideoEntry
->
getControl();
$videoState
=
$myVideoEntry
->
getVideoState();
if
($videoControl
==
null
) {
$message
=
"Votre vidéo a été enregistrée avec succès"
;
}
elseif
($videoState
) {
$videoStateName
=
$videoState
->
getName();
switch
($videoStateName
) {
case
'rejected'
:
if
($videoState
->
getText()==
'Duplicate video'
) {
$message
=
"Cette vidéo a déjà été envoyée. Merci de choisir
un autre fichier."
;
}
else
{
$message
=
"Votre vidéo n'a pas été acceptée car elle ne
respecte pas les conditions d'utilisation de YouTube.
Peut-être est-elle trop longue ou ne respecte pas certains
droits d'auteur."
;
}
break
;
case
'failed'
:
if
($videoState
->
getText()==
'Unable to convert video file'
) {
$message
=
"Echec lors de l'envoi : Impossible de convertir
le fichier vidéo. Vérifier qu'il s'agit bien d'un fichier
vidéo."
;
}
else
{
$message
=
"Votre vidéo n'a pas été acceptée car elle ne
respecte pas les conditions d'utilisation de YouTube.
Peut-être est-elle trop longue ou ne respecte pas certains
droits d'auteur."
;
}
break
;
case
'processing'
:
$message
=
"Votre vidéo a bien été envoyée. Elle
est désormais en cours de traitement et sera
publiée d'ici quelques heures."
;
break
;
default
:
$message
=
"Votre vidéo a bien été envoyée. Elle est
désormais en cours de traitement et sera publiée d'ici
quelques heures."
;
}
}
else
{
$message
=
"Votre vidéo a bien été envoyée. Elle est désormais en cours
de traitement et sera publiée d'ici quelques heures."
;
}
}
else
{
switch
($upload_code
) {
case
'DUPLICATE'
:
$message
=
"Cette vidéo a déjà été envoyée. Merci de choisir un
autre fichier."
;
break
;
case
'FILE_MISSING'
:
$message
=
"Veuillez sélectionner un fichier vidéo"
;
break
;
default
:
$message
=
"Une erreur s'est produite lors de l'upload du fichier.
Merci de contacter le webmaster si ce problème persiste"
;
}
}
echo $message
;
?>
Vous remarquez que la gestion des erreurs suite à l'envoi d'un fichier n'est pas encore optimale et les informations renvoyées par l'API restent assez vagues. Par ailleurs, il est important de prendre en compte le fait que YouTube met un certain temps à traiter un nouveau fichier vidéo. Ce traitement peut durer plusieurs heures pendant lesquelles la plateforme va :
- s'assurer que le fichier envoyé est bien une vidéo (et non une image ou un document texte),
- vérifier que la vidéo n'a pas de copyright connu
- calculer la durée totale et d'autres informations descriptives
- créer des images vignettes de différentes tailles
Aussi, il sera nécessaire de vérifier quelques heures plus tard si la vidéo envoyée a été acceptée ou non.
<?php
// code a lancer par exemple lors de l'affichage de la video
$videoId
=
$_GET
[
'id'
];
$location
=
'http://gdata.youtube.com/feeds/api/users/'
.
$username
.
'/uploads/'
.
$videoId
;
require_once 'Zend/Gdata/YouTube.php'
;
$yt
=
new
Zend_Gdata_YouTube();
$videoEntry
=
$yt
->
getVideoEntry(null
,
$location
);
$videoControl
=
$videoEntry
->
getControl();
if
($videoControl
==
null
) {
// on affiche la vidéo dans un lecteur flash
echo '<object width="480" height="385">
<param name="movie" value="'
.
$videoEntry
->
getFlashPlayerUrl().
'"></param>
<param name="allowFullScreen" value="true"></param>
param name="allowscriptaccess" value="always"></param>
<embed src="'
.
$videoEntry
->
getFlashPlayerUrl().
'"
type="application/x-shockwave-flash" allowscriptaccess="always"
allowfullscreen="true" width="480" height="385"></embed>
</object>'
;
}
else
{
echo "La vidéo n'est pas encore disponible"
;
}
}
?>
Nous avons découvert les principes de bases pour rechercher et envoyer une vidéo grâce à l'API YouTube. Cette dernière propose également de nombreuses autres fonctionnalités qui pourront vous être utiles selon vos besoins : suppression de vidéos, ajout de commentaires, création de playlists, etc.
VI. Conclusion▲
Nous avons vu que l'API YouTube simplifie grandement la gestion de vidéos d'un site web et permet de résoudre les problèmes d'espace disque. Les idées d'applications sont nombreuses : affichage d'une liste de vidéos sur un thème spécifique, simplification de la gestion d'un blog, espace de partage de vidéos pour les membres d'une communauté, etc. Hormis le PHP, sachez que d'autres librairies existent et permettent d'utiliser cette API avec des applications Java, JavaScript et .Net. Sachez enfin que depuis janvier 2009, Dailymotion propose à son tour son API, mais elle se limite pour l'instant à de simples recherches par critères et ne propose pas encore de système d'envoi de fichiers vidéo.
VII. Références▲
- Guide du développeur proposé par Google : http://code.google.com/apis/youtube/2.0/developers_guide_php.html
- Tutoriel sur l'upload de fichiers en PHP : https://antoine-herault.developpez.com/tutoriels/php/upload/