Я использую Youtube API v3 для поиска youtube.
https://developers.google.com/youtube/v3/docs/search
Как вы можете видеть ответ JSON не содержит продолжительности видео. Есть ли способ получить длительность видео? предпочтительно не вызывать API для каждого элемента в результате снова (если это единственный способ получить длительность).
После того, как вы сделаете поисковый вызов, вам нужно будет позвонить на видеоресурс API данных Youtube Data. Вы можете разместить до 50 идентификаторов видео в поиске, поэтому вам не придется вызывать его для каждого элемента.
https://developers.google.com/youtube/v3/docs/videos/list
Вы захотите установить part = contentDetails, потому что существует продолжительность.
Например, следующий вызов:
https://www.googleapis.com/youtube/v3/videos?id=9bZkp7q19f0&part=contentDetails&key={YOUR_API_KEY}
Дает этот результат:
{ "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" ] } } } ] }
Время форматируется как строка ISO 8601. PT означает Time Duration, 4M – 4 минуты, а 13S – 13 секунд.
Понял!
$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'];
Там он возвращает время для Youtube API V3. [ключ составлен путем;] Я использовал $vId
что я получил от возвращенного списка видео с канала, на котором показываю видео с …
Он работает .. 🙂 Google REALLY нужно включить продолжительность в фрагмент, чтобы вы могли получить все с помощью одного вызова вместо двух … sigh ……. он находится в списке «wontfix».
Я написал следующий класс, чтобы увеличить продолжительность видео YouTube, используя YouTube API v3. (Он также возвращает эскизы)
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; } }
Обратите внимание, что для использования API YouTube вам понадобится API_KEY:
Получение продолжительности в часах, минутах и секундах с использованием регулярного выражения (проверено на Python 3)
import re def parse_ISO8601(dur): test1 = rex("PT(.+?)H", dur) if test1: return int(test1.group(1))*3600 test2 = rex("PT(.+?)H(.+?)M",dur) if test2: h,m = [int(x) for x in test2.groups()] return 3600*h+60*m test3 = rex("PT(.+?)H(.+?)S",dur) if test3: h,s = [int(x) for x in test3.groups()] return 3600*h+s test4 = rex("PT(.+?)H(.+?)M(.+?)S",dur) if test4: h,m,s = [int(x) for x in test4.groups()] return 3600*h+60*h+s test5 = rex("PT(.+?)M", dur) if test5: return int(test5.group(1))*60 test6 = rex("PT(.+?)M(.+?)S",dur) if test6: m,s = [int(x) for x in test6.groups()] return 60*m+s test7 = rex("PT(.+?)S",dur) if test7: return int(test7.group(1)) print("CAN'T PARSE FUCKING GOOGLE FORMATTING:",dur) return False #I'm out ...
Этот код извлекает длительность видео Youtube с использованием Youtube API v3, передавая Video ID, и это сработало для меня.
<?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 (ie) HH:MM:SS } echo getDuration("zyeubYQxHyY"); // Video ID ?>
Вы можете получить свой собственный API API вашего домена на https://console.developers.google.com и создать учетные данные для своих собственных требований.
Продолжительность в секундах с использованием Python 2.7 и 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