¿Cómo obtengo la duración de los videos con la versión 3 de la API de YouTube?


93

Estoy usando la API de YouTube v3 para buscar en YouTube.

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

Como puede ver, la respuesta JSON no contiene duraciones de video. ¿Hay alguna forma de obtener la duración de los videos?

Preferiblemente, no volver a llamar a una API para cada elemento en el resultado (a menos que esa sea la única forma de obtener duraciones).


24
Típico de Google, tomar algo que funcionó bien y arruinarlo.
Synetech

1
¿Por qué esta pregunta está etiquetada con PHP y Objective-C? Algunas respuestas también usan Python.
Peter Mortensen

Respuestas:


128

Tendrá que realizar una llamada al recurso de video de la API de datos de YouTube después de realizar la llamada de búsqueda. Puede poner hasta 50 ID de video en una búsqueda, por lo que no tendrá que llamarlo para cada elemento.

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

Querrá establecer part=contentDetails, porque la duración está ahí.

Por ejemplo, la siguiente llamada:

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

Da este resultado:

{
 "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"
     ]
    }
   }
  }
 ]
}

La hora tiene el formato de una cadena ISO 8601. PT significa Duración del tiempo, 4M es 4 minutos y 13S es 13 segundos.


4
¿Qué es este formato de hora? ¿Es un estándar compatible con Objective C?
Rukshan Marapana

3
Comentario tardío, pero tal vez le gustaría destacar y vigilar este boleto para solicitar que se incluyan duraciones en la respuesta de búsqueda: code.google.com/p/gdata-issues/issues/detail?id=4294
Andrew Nguyen

3
@Andrew: tiene formato ISO 8601. Estoy de acuerdo en que se ve bastante atroz, pero al menos se puede convertir fácilmente en cualquier idioma, solo busque el convertidor ISO 8601.
Matt Koskela

2
Para Python, una gran biblioteca para convertir la duración es aniso8601 . Devuelve un datetime.timedelta, que puede formatearse básicamente a cualquier cosa.
arnaudoff

4
¿Qué videos duran semanas en YouTube?
Matt Koskela

14

¡Lo tengo!

$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'];
}

Allí devuelve la hora para la versión 3 de la API de YouTube (la clave está hecha por cierto;). Usé $vIdque había salido de la lista devuelta de los videos del canal del que estoy mostrando los videos ...

Funciona. Google REALMENTE necesita incluir la duración en el fragmento para que pueda obtenerlo todo con una llamada en lugar de dos ... está en su lista de "no arreglos".


Sí, e incluya la duración en formatos legibles por humanos, como segundos.
andreszs

2
¿Qué esperas? Es Google, no hacen nada de la manera correcta.
Synetech

¿Encontró una manera de obtener la duración en segundos? Parece ser difícil convertir el formato PT **** a segundos.
Loenix

¿No te estás perdiendo un cierre }?
Peter Mortensen

7

Escribí la siguiente clase para obtener la duración del video de YouTube usando la API de YouTube v3 (también devuelve miniaturas):

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;
    }
}

Tenga en cuenta que necesitará API_KEY para utilizar la API de YouTube:

  1. Cree un nuevo proyecto aquí: https://console.developers.google.com/project
  2. Habilite "API de datos de YouTube" en "API y autenticación" -> API
  3. Cree una nueva clave de servidor en "API y autenticación" -> Credenciales

2

Este código extrae la duración del video de YouTube utilizando la API de YouTube v3 al pasar una identificación de video. Funcionó para mí.

<?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
?>

Puede obtener la clave API de YouTube de su dominio en https://console.developers.google.com y generar credenciales para sus propios requisitos.



1

Duración en segundos con Python 2.7 y la API de 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

0

API de datos de Youtube 3, conversión de cadena de duración a segundos en Python

Ejemplo:

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.