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).
php
objective-c
rest
youtube-api
youtube-data-api
Rukshan Marapana
fuente
fuente
Respuestas:
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.
fuente
datetime.timedelta
, que puede formatearse básicamente a cualquier cosa.¡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é
$vId
que 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".
fuente
}
?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:
fuente
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.
fuente
Puede obtener la duración del campo 'contentDetails' en la respuesta json.
fuente
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
fuente
API de datos de Youtube 3, conversión de cadena de duración a segundos en Python
Ejemplo:
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
fuente