Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer les données d'une vidéo (titre, id...)

Recherche plugins, scripts, classes

Sujet résolu
    24 mars 2013 à 20:48:59

    Bonjour,

    Pour un projet personnel, je recherche un moyen pratique de récupérer les informations d'une vidéo à partir de son URL.
    J'aimerai, que n'importe quel utilisateur peut ajouter facilement une vidéo que je stocke en base de données. J'ai donc besoin du titre, description, de l’hébergeur vidéo, de l'identifiant (pour éviter les doublons), durée...

    J'ai déjà fait à l'époque un script fonctionnel qui utilise cette fonction http://www.phpsources.org/scripts607-PHP.htm qui date de 2010, ça marche bien à part qu'il y a quelques bugs et que ça supporte que 3 hébergeurs.

    J'ai trouvé quelques plug-ins tels http://code.google.com/p/jquery-oembed/ ou https://github.com/embedly/embedly-jquery qui supportent beaucoup plus d’hébergeurs, mais je ne trouve pas le moyen de simplement récupérer les données dont j'ai besoin.

    Donc je me dis qu'une solution doit exister quelque part, et vu que je suis en train de refondre tout le site que j'avais fait à l'époque, je souhaite ne pas passer à côté d'un système plus efficace que cette vielle fonction que je dois mettre manuellement à jours quand les API se mettent à jour du côté des hébergeurs.

    Si quelqu'un à déjà fait une trouvaille et souhaite me la partage, se serait avec un grand plaisir :D
    Merci de m'avoir lu

    -
    Edité par G7design 24 mars 2013 à 21:17:41

    • Partager sur Facebook
    • Partager sur Twitter
      25 mars 2013 à 11:36:39

      Bon, vu que j'étais pressé j'ai refait une fonction en utilisant des partis de script en les mettant à jour par rapport aux apis disponibles.
      Par contre je ne recherche que pour les providers YouTube, Dailymotion et vimeo.
      Je le mets a dispo : (d’après mes premiers tests il fonctionne)

      FUNCTIONS :

      function getTitle($url)
      {
          $result = false;
         
          $contents = getUrlContents($url);
      
          if (isset($contents) && is_string($contents))
          {
              $title = null;
              $metaTags = null;
             
              preg_match('/<title>([^>]*)<\/title>/si', $contents, $match );
      
              if (isset($match) && is_array($match) && count($match) > 0)
              {
                  $title = strip_tags($match[1]);
              } else {
      	        $title=false;
              }
          }
         
          return $title;
      }
      
      function getUrlContents($url, $maximumRedirections = null, $currentRedirection = 0)
      {
          $result = false;
         
          $contents = @file_get_contents($url);
         
          // Check if we need to go somewhere else
         
          if (isset($contents) && is_string($contents))
          {
              preg_match_all('/<[\s]*meta[\s]*http-equiv="?REFRESH"?' . '[\s]*content="?[0-9]*;[\s]*URL[\s]*=[\s]*([^>"]*)"?' . '[\s]*[\/]?[\s]*>/si', $contents, $match);
             
              if (isset($match) && is_array($match) && count($match) == 2 && count($match[1]) == 1)
              {
                  if (!isset($maximumRedirections) || $currentRedirection < $maximumRedirections)
                  {
                      return getUrlContents($match[1][0], $maximumRedirections, ++$currentRedirection);
                  }
                 
                  $result = false;
              }
              else
              {
                  $result = $contents;
              }
          }
         
          return $contents;
      }
      
      function get_donnees_video($url){
      	$stud_detect = false;
      	$embed_stubs = array(
      		array(
      			'providers' => 'YouTube',
      			'website' => 'http://www.youtube.com',
      			'url-match' => 'http(?:s|(?:[^"]*?))://(?:video\.google\.(?:com|com\.au|co\.uk|de|es|fr|it|nl|pl|ca|cn)/(?:[^"]*?))?(?:(?:www|au|br|ca|es|fr|de|hk|ie|in|il|it|jp|kr|mx|nl|nz|pl|ru|tw|uk)\.)?youtube\.com(?:[^"]*?)?(?:&|&amp;|/|\?|;|\%3F|\%2F)(?:video_id=|v(?:/|=|\%3D|\%2F))([0-9a-z-_]{11})',
      			'tab_images' => array(
      								'http://i.ytimg.com/vi/[MEDIA_ID]/0.jpg',
      								'http://i.ytimg.com/vi/[MEDIA_ID]/1.jpg',
      								'http://i.ytimg.com/vi/[MEDIA_ID]/2.jpg',
      								'http://i.ytimg.com/vi/[MEDIA_ID]/3.jpg'
      							),
      			'iframe-player' => 'http://www.youtube.com/embed/[MEDIA_ID]',
      		),
      		array(
      			'providers' => 'Dailymotion',
      			'website' => 'http(?:s|(?:[^"]*?))://www.dailymotion.com',
      			'url-match' => 'http://(?:www\.)?dailymotion\.(?:com|alice\.it)/(?:(?:[^"]*?)?video|swf)/([a-z0-9]{1,18})',
      			'tab_images' => array(
      								'http://www.dailymotion.com/thumbnail/650x400/video/[MEDIA_ID]'
      							),
      			'iframe-player' => 'http://www.dailymotion.com/embed/video/[MEDIA_ID]',
      		),
      		array(
      			'providers' => 'Vimeo',
      			'website' => 'http(?:s|(?:[^"]*?))://www.vimeo.com',
      			'url-match' => 'http://(?:www\.)?vimeo\.com/([0-9]{1,12})',
      			'image-src' => false,
      			'iframe-player' => 'http://player.vimeo.com/video/[MEDIA_ID]',
      		)
      	);
      	foreach ($embed_stubs as $stub) { 
      		if ( preg_match('~'.$stub['url-match'].'~imu', $url, $match) ) {
      			$media_link = $match[0];
      			$media_id = $match[1];
      			$stud_detect = true;
      			break;
      		}
      	}
      	if($stud_detect && $media_id){
      		$tab_return['providers'] = $stub['providers'];
      		$tab_return['media_id'] = $media_id;
      		$tab_return['media_link'] = $media_link;
      		$tab_return['iframe-player'] = str_ireplace('[MEDIA_ID]',$media_id,$stub['iframe-player']);
      		foreach((array)$stub['tab_images'] AS $KEY => $value){
      			$tab_return['tab_images'][] = str_ireplace('[MEDIA_ID]',$media_id,$value);
      		}
      		switch($tab_return['providers']){
      			case 'YouTube' :
      				$xml = file_get_contents("http://gdata.youtube.com/feeds/api/videos/".$tab_return['media_id']);
      		        preg_match('#<title(.*?)>(.*)<\/title>#is',$xml,$resultTitre);
      		        $tab_return['titre'] = utf8_decode($resultTitre[count($resultTitre)-1]);
      		        preg_match('#<content(.*?)>(.*)<\/content>#is',$xml,$resultDescription);
      		        $tab_return['description'] = utf8_decode($resultDescription[count($resultDescription)-1]);
      		        preg_match("#<yt:duration seconds='([0-9]+)'\/>#",$xml,$resultDuration);
      		        $tab_return['duration'] = $resultDuration[count($resultDuration)-1];
      			break;
      			case 'Dailymotion' :
      				$tab_return['titre'] = utf8_decode(str_replace("- Vidéo Dailymotion","",getTitle($tab_return['media_link'])));
      				$tags = get_meta_tags("http://www.dailymotion.com/video/".$tab_return['media_id']);
      		        $tab_return['description'] = utf8_decode($tags["description"]);
      			break;
      			case 'Vimeo' :
      				$xml = file_get_contents("http://vimeo.com/api/oembed.xml?url=".$tab_return['media_link']);
      		        preg_match('#<title(.*?)>(.*)<\/title>#is',$xml,$resultTitre);
      		        $tab_return['titre'] = utf8_decode($resultTitre[count($resultTitre)-1]);
      		        preg_match('#<description(.*?)>(.*)<\/description>#is',$xml,$resultDescription);
      		        $tab_return['description'] = utf8_decode($resultDescription[count($resultDescription)-1]);
      		        preg_match('#<thumbnail_url(.*?)>(.*)<\/thumbnail_url>#is',$xml,$resultTumb);
      		        $tab_return['tab_images'][] = $resultTumb[count($resultTumb)-1];
      		        preg_match('#<duration(.*?)>([0-9]+)<\/duration>#is',$xml,$resultDuration);
      		        $tab_return['duration'] = $resultDuration[count($resultDuration)-1];
      			break;
      		}
      		return $tab_return;
      	} else {
      		return false;
      	}
      	
      }

      Il y a donc 3 fonctions (attention de mettre un petit php.ini dans le dossier où est exécuté le script)

      PHP.INI

      allow_url_fopen = ON

      UTILISATION :

      <?
        $tab_video = get_donnees_video("http://www.youtube.com/watch?v=N-qNhpDdMmc");
      ?>

      Ce qui retourne ce tableau :

      Array
      (
          [providers] => YouTube
          [media_id] => N-qNhpDdMmc
          [media_link] => http://www.youtube.com/watch?v=N-qNhpDdMmc
          [iframe-player] => http://www.youtube.com/embed/N-qNhpDdMmc
          [tab_images] => Array
              (
                  [0] => http://i.ytimg.com/vi/N-qNhpDdMmc/0.jpg
                  [1] => http://i.ytimg.com/vi/N-qNhpDdMmc/1.jpg
                  [2] => http://i.ytimg.com/vi/N-qNhpDdMmc/2.jpg
                  [3] => http://i.ytimg.com/vi/N-qNhpDdMmc/3.jpg
              )
      
          [titre] => G7DESIGN (Présentation 2011)
          [description] => Présentation des activités 2011 de G7DESIGN.
      Site internet, Identité visuelle, PAO, Montage vidéo, Programmation et Multis écrans.
          [duration] => 65
      )

      Info :


      Si aucune vidéo n'est détectée, la fonction retourne "false"

      Providers = Nom de l'hébergeur (YouTube, Dailymotion ou Vimeo)

      media_id = identifiant unique de la vidéo par rapport au provider

      media_link = lien vers la vidéo (en ayant enlevé les paramètres get)

      iframe-player = lien vers l'iframe de la vidéo

      tab_images = tableau des images, pour l'instant seul YouTube propose plusieurs vignettes, pour viméo et dailymotion seul la première est disponible

      titre = titre vidéo

      description = description vidéo

      duration = durée de la vidéo en seconde (indisponible pour les vidéos dailymotion)

      Crédit

      J'ai fais ce script pour le projet BargeTeam.com | Communauté de riders

      -
      Edité par G7design 25 mars 2013 à 11:47:14

      • Partager sur Facebook
      • Partager sur Twitter
        2 août 2015 à 10:29:46

        Génial, j'espère que ça fonctionne toujours en 2015 :)
        • Partager sur Facebook
        • Partager sur Twitter

        Récupérer les données d'une vidéo (titre, id...)

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown