¿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).

Rukshan Marapana
fuente
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.

Matt Koskela
fuente
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".

Juan
fuente
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
Dima L.
fuente
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.

Vignesh Chinnaiyan
fuente
2

Puede obtener la duración del campo 'contentDetails' en la respuesta json.

ingrese la descripción de la imagen aquí

Maurya Allimuthu
fuente
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
andrea-f
fuente
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
Maurya Allimuthu
fuente