Как узнать продолжительность видео с помощью YouTube API версии 3?

Я использую YouTube API v3 для поиска на YouTube.

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

Как видите, ответ JSON не содержит длительности видео. Есть ли способ узнать продолжительность видео?

Желательно больше не вызывать API для каждого элемента результата (если только это не единственный способ получить длительность).


person Rukshan Marapana    schedule 24.03.2013    source источник
comment
Типичный Google: берет то, что работает нормально, и портит его.   -  person Synetech    schedule 30.05.2015
comment
Почему этот вопрос помечен как PHP, так и Objective-C? В некоторых ответах также используется Python.   -  person Peter Mortensen    schedule 19.09.2018


Ответы (7)


Вам нужно будет выполнить вызов видеоресурса API данных YouTube после выполнения поискового вызова. Вы можете ввести до 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 означает продолжительность времени, 4M - 4 минуты, а 13S - 13 секунд.

person Matt Koskela    schedule 25.03.2013
comment
Что это за формат времени? Это стандарт, который поддерживает Objective C? - person Rukshan Marapana; 30.03.2013
comment
Поздний комментарий, но, возможно, вы хотели бы отметить и следить за тем, чтобы продолжительность запроса билета была включена в ответ поиска: code.google.com/p/gdata-issues/issues/detail?id=4294 - person Andrew Nguyen; 06.03.2014
comment
@Andrew - это формат ISO 8601. Я согласен с тем, что это выглядит довольно ужасно, но, по крайней мере, его можно легко преобразовать на любом языке - просто найдите конвертер ISO 8601. - person Matt Koskela; 07.05.2015
comment
Для Python отличной библиотекой для преобразования продолжительности является aniso8601. Он возвращает datetime.timedelta, который можно отформатировать практически во что угодно. - person arnaudoff; 31.05.2015
comment
ISO 8601 может показаться хорошим, потому что он стандарт, но извините, что не сообщаю новость, это не так. Очевидно, Youtube использует нестандартную версию 8601, которая включает недели между днями и месяцами, что вносит еще один проблемный момент в формат. Изменяющаяся продолжительность месяцев (как в днях, так и в неделях) означает, что фактическую длину видео невозможно даже рассчитать с полной уверенностью. - person sim642; 01.06.2015
comment
Какие видео неделями на YouTube?!? - person Matt Koskela; 01.06.2015
comment
Здравствуйте, указатель выше верен, и он может получить продолжительность для одного элемента по идентификатору видео. Как я могу получить продолжительность для нескольких видео в одном запросе? - person Stavros Koureas; 02.05.2016
comment
@ s19k15: вы можете передать список идентификаторов, разделенных запятыми, в вызове API, о котором я упоминал - person Matt Koskela; 07.05.2016
comment
@Matt Koskela Мне нужно выполнить oAuth для этого запроса или я могу просто использовать свой client_id в качестве ключа. SoundCloud APi позволяет делать это при чтении информации о треке. Я надеялся, что YouTube сделает то же самое. Я получаю сообщение об ошибке аутентификации, когда использую свой client_id в качестве значения ключевой переменной URL? - person Charles Robertson; 09.08.2016
comment
@Matt Koskela Doh. Прости, Мэтт. Я только что узнал, что ключ API и идентификатор клиента - это две очень разные вещи. Ключ API делает мою жизнь намного проще. Теперь я собираюсь исследовать все различные запросы, которые я могу сделать с помощью этого ключа. Спасибо, что указали мне правильное направление. Это настоящий момент разорвавшейся бомбы. Похоже, я безуспешно пытался oAuth для всего ... - person Charles Robertson; 09.08.2016
comment
используйте iso8601-duration для анализа iso8601, если вы используете node - person Feng Liu; 24.07.2018

Я понял!

$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 версии 3 (ключ кстати придуман;). Я использовал $vId, который я получил из возвращенного списка видео с канала, с которого я показываю видео ...

Оно работает. Google ДЕЙСТВИТЕЛЬНО должен включать продолжительность в сниппет, чтобы вы могли получить все это одним вызовом вместо двух ... это в их списке «wontfix».

person John    schedule 29.03.2015
comment
Да, и укажите продолжительность в удобочитаемых форматах, например в секундах. - person andreszs; 09.05.2015
comment
Что вы ожидаете? Это Google, они ничего не делают правильно. - person Synetech; 30.05.2015
comment
Вы нашли способ получить продолжительность в секундах? Кажется, это ahrd преобразовать из формата PT **** в секунды. - person Loenix; 08.10.2016
comment
Разве вы не упустили закрывающий }? - person Peter Mortensen; 19.09.2018

Я написал следующий класс, чтобы получить продолжительность видео 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:

  1. Создайте новый проект здесь: https://console.developers.google.com/project
  2. Включите "API данных YouTube" в разделе "API и аутентификация" -> API.
  3. Создайте новый ключ сервера в разделе «API и аутентификация» -> Учетные данные.
person Dima L.    schedule 10.06.2015

Этот код извлекает продолжительность видео YouTube с помощью YouTube API v3, передавая идентификатор видео. У меня это сработало.

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

Вы можете получить собственный ключ API YouTube для своего домена на https://console.developers.google.com и сгенерируйте учетные данные для ваших собственных требований.

person Vignesh Chinnaiyan    schedule 13.07.2016

Вы можете получить продолжительность из поля contentDetails в ответе json.

введите здесь описание изображения

person Maurya Allimuthu    schedule 19.09.2019

Продолжительность в секундах с использованием Python 2.7 и YouTube API 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
person andrea-f    schedule 11.06.2015

Youtube data 3 API, преобразование строки продолжительности в секунды в Python

Пример:

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
person Maurya Allimuthu    schedule 19.09.2019