Comment obtenir la durée des vidéos avec l'API YouTube version 3?

90

J'utilise l'API YouTube v3 pour rechercher sur YouTube.

https://developers.google.com/youtube/v3/docs/search

Comme vous pouvez le voir, la réponse JSON ne contient pas de durées vidéo. Existe-t-il un moyen d'obtenir la durée des vidéos?

De préférence, ne pas appeler à nouveau une API pour chaque élément du résultat (à moins que ce ne soit le seul moyen d'obtenir des durées).

Rukshan Marapana
la source
22
Google typique, prendre quelque chose qui fonctionnait très bien et le ruiner.
Synetech
1
Pourquoi cette question est-elle étiquetée à la fois avec PHP et Objective-C? Certaines réponses utilisent également Python.
Peter Mortensen

Réponses:

125

Vous devrez passer un appel à la ressource vidéo de l'API de données YouTube après avoir effectué l'appel de recherche. Vous pouvez mettre jusqu'à 50 ID vidéo dans une recherche, vous n'aurez donc pas à l'appeler pour chaque élément.

https://developers.google.com/youtube/v3/docs/videos/list

Vous voudrez définir part=contentDetails, car la durée est là.

Par exemple, l'appel suivant:

https://www.googleapis.com/youtube/v3/videos?id=9bZkp7q19f0&part=contentDetails&key={YOUR_API_KEY}

Donne ce résultat:

{
 "kind": "youtube#videoListResponse",
 "etag": "\"XlbeM5oNbUofJuiuGi6IkumnZR8/ny1S4th-ku477VARrY_U4tIqcTw\"",
 "items": [
  {

   "id": "9bZkp7q19f0",
   "kind": "youtube#video",
   "etag": "\"XlbeM5oNbUofJuiuGi6IkumnZR8/HN8ILnw-DBXyCcTsc7JG0z51BGg\"",
   "contentDetails": {
    "duration": "PT4M13S",
    "dimension": "2d",
    "definition": "hd",
    "caption": "false",
    "licensedContent": true,
    "regionRestriction": {
     "blocked": [
      "DE"
     ]
    }
   }
  }
 ]
}

L'heure est formatée sous la forme d'une chaîne ISO 8601. PT signifie durée, 4M correspond à 4 minutes et 13S correspond à 13 secondes.

Matt Koskela
la source
4
Quel est ce format d'heure? Est-ce une norme prise en charge par Objective C?
Rukshan Marapana
3
Commentaire tardif, mais peut-être que vous aimeriez jouer et garder un œil sur ce ticket en demandant que les durées soient incluses dans la réponse de recherche: code.google.com/p/gdata-issues/issues/detail?id=4294
Andrew Nguyen
3
@Andrew - il est au format ISO 8601. Je conviens que cela a l'air assez atroce, mais au moins il peut être facilement converti dans n'importe quelle langue - il suffit de rechercher le convertisseur ISO 8601.
Matt Koskela
2
Pour Python, une excellente bibliothèque pour convertir la durée est aniso8601 . Il renvoie un datetime.timedelta, qui peut être formaté en pratiquement n'importe quoi.
arnaudoff
4
Quelles vidéos durent des semaines sur YouTube?!?
Matt Koskela
14

J? ai compris!

$dur = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=$vId&key=dldfsd981asGhkxHxFf6JqyNrTqIeJ9sjMKFcX4");

$duration = json_decode($dur, true);
foreach ($duration['items'] as $vidTime) {
    $vTime= $vidTime['contentDetails']['duration'];
}

Là, il renvoie l'heure de l'API YouTube version 3 (la clé est d'ailleurs constituée;). j'ai utilisé$vId que je venais de sortir de la liste renvoyée des vidéos de la chaîne dont je montre les vidéos ...

Ça marche. Google a VRAIMENT besoin d'inclure la durée dans l'extrait de code afin que vous puissiez tout obtenir avec un seul appel au lieu de deux ... c'est sur leur liste "wontfix".

John
la source
Oui, et incluez la durée dans des formats lisibles par l'homme, tels que les secondes.
andreszs
2
Qu'attendez-vous? C'est Google, ils ne font rien de la bonne manière.
Synetech
Avez-vous trouvé un moyen d'obtenir la durée en secondes, il semble être possible de convertir le format PT **** en secondes.
Loenix
Vous ne manquez pas une clôture }?
Peter Mortensen
7

J'ai écrit le cours suivant pour obtenir la durée de la vidéo YouTube à l'aide de l'API YouTube v3 (elle renvoie également des vignettes):

class Youtube
{
    static $api_key = '<API_KEY>';
    static $api_base = 'https://www.googleapis.com/youtube/v3/videos';
    static $thumbnail_base = 'https://i.ytimg.com/vi/';

    // $vid - video id in youtube
    // returns - video info
    public static function getVideoInfo($vid)
    {
        $params = array(
            'part' => 'contentDetails',
            'id' => $vid,
            'key' => self::$api_key,
        );

        $api_url = Youtube::$api_base . '?' . http_build_query($params);
        $result = json_decode(@file_get_contents($api_url), true);

        if(empty($result['items'][0]['contentDetails']))
            return null;
        $vinfo = $result['items'][0]['contentDetails'];

        $interval = new DateInterval($vinfo['duration']);
        $vinfo['duration_sec'] = $interval->h * 3600 + $interval->i * 60 + $interval->s;

        $vinfo['thumbnail']['default']       = self::$thumbnail_base . $vid . '/default.jpg';
        $vinfo['thumbnail']['mqDefault']     = self::$thumbnail_base . $vid . '/mqdefault.jpg';
        $vinfo['thumbnail']['hqDefault']     = self::$thumbnail_base . $vid . '/hqdefault.jpg';
        $vinfo['thumbnail']['sdDefault']     = self::$thumbnail_base . $vid . '/sddefault.jpg';
        $vinfo['thumbnail']['maxresDefault'] = self::$thumbnail_base . $vid . '/maxresdefault.jpg';

        return $vinfo;
    }
}

Veuillez noter que vous aurez besoin d'API_KEY pour utiliser l'API YouTube:

  1. Créez un nouveau projet ici: https://console.developers.google.com/project
  2. Activez «API de données YouTube» sous «API et authentification» -> API
  3. Créez une nouvelle clé de serveur sous "API et authentification" -> Identifiants
Dima L.
la source
2

Ce code extrait la durée de la vidéo YouTube à l'aide de l'API YouTube v3 en transmettant un ID vidéo. Cela a fonctionné pour moi.

<?php
    function getDuration($videoID){
       $apikey = "YOUR-Youtube-API-KEY"; // Like this AIcvSyBsLA8znZn-i-aPLWFrsPOlWMkEyVaXAcv
       $dur = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=$videoID&key=$apikey");
       $VidDuration =json_decode($dur, true);
       foreach ($VidDuration['items'] as $vidTime)
       {
           $VidDuration= $vidTime['contentDetails']['duration'];
       }
       preg_match_all('/(\d+)/',$VidDuration,$parts);
       return $parts[0][0] . ":" .
              $parts[0][1] . ":".
              $parts[0][2]; // Return 1:11:46 (i.e.) HH:MM:SS
    }

    echo getDuration("zyeubYQxHyY"); // Video ID
?>

Vous pouvez obtenir la clé API YouTube de votre domaine sur https://console.developers.google.com et générer des informations d'identification pour vos propres besoins.

Vignesh Chinnaiyan
la source
2

Vous pouvez obtenir la durée à partir du champ 'contentDetails' dans la réponse json.

entrez la description de l'image ici

Maurya Allimuthu
la source
1

Durée en secondes avec Python 2.7 et l'API YouTube v3:

    try:        
        dur = entry['contentDetails']['duration']
        try:
            minutes = int(dur[2:4]) * 60
        except:
            minutes = 0
        try:
            hours = int(dur[:2]) * 60 * 60
        except:
            hours = 0

        secs = int(dur[5:7])
        print hours, minutes, secs
        video.duration = hours + minutes + secs
        print video.duration
    except Exception as e:
        print "Couldnt extract time: %s" % e
        pass
andrea-f
la source
0

Youtube Data 3 API, conversion de chaîne de durée en secondes en Python

Exemple:

convert_YouTube_duration_to_seconds ('P2DT1S')
172801

convert_YouTube_duration_to_seconds ('PT2H12M51S')
7971

def convert_YouTube_duration_to_seconds(duration):
   day_time = duration.split('T')
   day_duration = day_time[0].replace('P', '')
   day_list = day_duration.split('D')
   if len(day_list) == 2:
      day = int(day_list[0]) * 60 * 60 * 24
      day_list = day_list[1]
   else:
      day = 0
      day_list = day_list[0]
   hour_list = day_time[1].split('H')
   if len(hour_list) == 2:
      hour = int(hour_list[0]) * 60 * 60
      hour_list = hour_list[1]
   else:
      hour = 0
      hour_list = hour_list[0]
   minute_list = hour_list.split('M')
   if len(minute_list) == 2:
      minute = int(minute_list[0]) * 60
      minute_list = minute_list[1]
   else:
      minute = 0
      minute_list = minute_list[0]
   second_list = minute_list.split('S')
   if len(second_list) == 2:
      second = int(second_list[0])
   else:
      second = 0
   return day + hour + minute + second
Maurya Allimuthu
la source