mardi 14 février 2012

PHP upload de vidéos vers Youtube depuis votre application ou site Web


Introduction
Créer un gestionnaire de vidéos requiert de nombreuses compétences surtout sur la partie de traitement vidéo (encodage FLV, ...). Pour ne pas réinventer la roue, je me suis d'abord tourné vers une veille des outils existants ce qui m'a amené rapidement vers la référence grand public par excellence : Youtube by Google.
Les avantages : Youtube héberge et traite les vidéos sur ses infrastructures et vous donne les clés à travers l'API "Google Data PHP Client Library" pour réaliser votre propre gestionnaire de vidéos ; Vous pouvez développez votre propre Youtube avec Youtube !

L'objectif de cet article est simple : réaliser l'upload d'une vidéo vers Youtube via un simple formulaire en PHP. Ce tutoriel peut être réalisé en local.
Il est bien sûr nécessaire d'avoir un compte Youtube.

Google Data PHP Client Library
Documentation : http://code.google.com/intl/fr-FR/apis/gdata/articles/php_client_lib.html

L'API est complètement intégrée à Zend Framework via son module "Zend Gdata" utilisable en standalone ce qui en facilite largement la manipulation.
Télécharger la dernière release de Zend Gdata : http://framework.zend.com/download/gdata/ et l'extraire dans le dossier de votre choix. Ci-dessous mon arborescence de test avec un répertoire "youtube-upload" composé de l'API et d'un fichier youtube.php pour notre formulaire.
Pour éviter tout problème de chemin et avoir accès à l'API facilement, il est nécessaire de l'ajouter à l' "include_path" de votre php.ini
Pour vérifier votre configuration, exécuter le fichier "InstallationChecker.php" (exemple : http://localhost/tests/youtube-upload/ZendGdata-1.11.11/demos/Zend/Gdata/InstallationChecker.php)

Comme nous allons accéder à l'API en mode "écriture" (via upload), vous devez être identifié auprès de Google. Pour cela il faut d'abord obtenir une clé appelée ""developer key" (http://code.google.com/apis/youtube/dashboard/) en créant un nouveau produit (exemple : "Youtube test").

Car un code commenté vaut mieux que tout, ci-dessous le code de mon script de test "youtube.php" :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Youtube upload</title>
</head>
<body>
<?php
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

/**
 * Obtenir le droit d'upload vers un compte YouTube
 * L'objet créer sera utilisé pour l'instanciation d'un nouveau objet Youtube 
 */
$authenticationURL = 'https://www.google.com/accounts/ClientLogin';
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
    $username = 'ggggggggggg@gmail.com', // Google/Youtube login
    $password = 'votre-mot-de-passe', // Google/Youtube password
    $service = 'youtube',
    $client = null,
    $source = null,
    $loginToken = null,
    $loginCaptcha = null,
    $authenticationURL
);

/**
 * Créer un objet Youtube (Zend_Gdata_YouTube)
 * Créer un objet vidéo (classe Zend_Gdata_YouTube_VideoEntry)
 * Récupérer un "Token" qui est une clé d'autorisation temporaire retournée par Youtube (clé + url)
 * Construire le formulaire d'upload avec les informations du Token
 */
$developerKey = "votre-developer-key-sqdfqsdUIHIUGHlsqdomsqjomfjqsdfsq"; // votre "developer key"
$yt = new Zend_Gdata_YouTube($httpClient,null,null,$developerKey);

$myVideoEntry = new Zend_Gdata_YouTube_VideoEntry();
$myVideoEntry->setVideoTitle('Vidéo envoyée le '.date('d/m/Y H:i:s'));
$myVideoEntry->setVideoDescription('Vidéo du site ...');
$myVideoEntry->setVideoCategory('Autos'); // catégorie valide voir doc Youtube 
$myVideoEntry->SetVideoTags('test, php upload'); // mots clés

$tokenHandlerUrl = 'http://gdata.youtube.com/action/GetUploadToken';
$tokenArray = $yt->getFormUploadToken($myVideoEntry, $tokenHandlerUrl);
$tokenValue = $tokenArray['token'];
$postUrl = $tokenArray['url'];

// URL où rediriger après traitement de la vidéo par Youtube (= réponse Youtube) :
$nextUrl = 'http://localhost/tests/youtube-upload/youtube.php'; 
?>
<form action="<?php echo $postUrl; ?>?nexturl=<?php echo $nextUrl; ?>" method="post" enctype="multipart/form-data"> 
    <input name="file" type="file"/> 
    <input name="token" type="hidden" value="<?php echo $tokenValue; ?>"/>
    <input value="Envoyer la vidéo" type="submit" />
</form>
</body>
</html>

Affichage du formulaire :

La page de retour définie après envoie de la vidéo :
Le résultat en image (gestionnaire de vidéos YouTube de votre compte http://www.youtube.com/my_videos?feature=mhee) :







4 commentaires:

  1. Super tuto merci !
    J'aimerais savoir si il est possible d'ajouter des champ tel que le titre et la description de la video directement via le formulaire ?

    RépondreSupprimer
  2. Bonjour,
    le plus facile serait d'arriver sur cette page après avoir saisie le titre et la description sur une page précédente afin de construire l'objet $myVideoEntry dynamiquement. Mais sur le même formulaire c'est possible mais un peu plus compliqué, en ajax notamment.

    RépondreSupprimer
  3. Javou que je ne suis qu'au début en php, connais-tu un tuto qui le permetterais de contruire l'objet $myVideoEntry par l'utilisateur ?

    RépondreSupprimer
  4. la solution la plus simple serait de découper l'action en deux, c'est à dire proposer un formulaire sur le détail de la vidéo (titre description, catégorie, tags) ce qui vous permettra de "remplir" l'objet myVideoEntry dynamiquement avant de l'envoyer à Youtube.
    Ce formulaire (exemple info-video.php) aura comme action (destination) le script youtube.php qui sera ainsi capable de récupérer les valeurs saisies ($_GET['champ_titre'] ou $_POST['champ_titre'].
    Exemple : $myVideoEntry->setVideoTitle($_POST['champ_titre']);

    RépondreSupprimer