【问题标题】:How do I get video durations with YouTube API version 3?如何使用 YouTube API 版本 3 获取视频时长?
【发布时间】:2013-03-13 20:50:48
【问题描述】:

我正在使用 YouTube API v3 搜索 YouTube。

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

如您所见,响应 JSON 不包含视频时长。有没有办法获取视频时长?

最好不要再次为结果中的每个元素调用 API(除非这是获取持续时间的唯一方法)。

【问题讨论】:

  • 典型的谷歌,拿走一些效果很好的东西然后毁了它。
  • 为什么这个问题同时用 PHP 和 Objective-C 标记?有些答案也使用 Python。

标签: youtube-api youtube-data-api


【解决方案1】:

在进行搜索调用后,您必须调用 YouTube 数据 API 的视频资源。您最多可以在搜索中添加 50 个视频 ID,因此您不必为每个元素调用它。

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秒。

【讨论】:

  • 这个时间格式是什么?它是 Objective C 支持的标准吗?
  • 迟到的评论,但也许您想加注星标并密切关注这张票,要求将持续时间包含在搜索响应中:code.google.com/p/gdata-issues/issues/detail?id=4294
  • @Andrew - 它是 ISO 8601 格式。我同意它看起来很糟糕,但至少它可以轻松转换为任何语言 - 只需查找 ISO 8601 转换器。
  • 对于 Python,一个很好的转换持续时间的库是aniso8601。它返回一个datetime.timedelta,基本上可以格式化为任何格式。
  • YouTube 上有哪些长达数周的视频?!?
【解决方案2】:

我明白了!

$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 真的需要在 sn-p 中包含持续时间,这样您就可以通过一次调用而不是两次调用来获得所有信息……它在他们的“wontfix”列表中。

【讨论】:

  • 是的,包括秒等人类可读格式的持续时间。
  • 你期待什么?是谷歌,他们没有做任何正确的事情。
  • 你有没有找到以秒为单位获取持续时间的方法,从 PT**** 格式转换为秒似乎很困难。
  • 你是不是错过了结束}
【解决方案3】:

我编写了以下类来使用 YouTube API v3 获取 YouTube 视频时长(它也返回缩略图):

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_KEY 才能使用 YouTube API:

  1. 在这里创建一个新项目:https://console.developers.google.com/project
  2. 在“APIs & auth”下启用“YouTube Data API” -> APIs
  3. 在“APIs & auth”下创建一个新的服务器密钥 -> Credentials

【讨论】:

    【解决方案4】:

    使用 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
    

    【讨论】:

      【解决方案5】:

      此代码使用 YouTube API v3 通过传递视频 ID 来提取 YouTube 视频时长。它对我有用。

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

      您可以在 https://console.developers.google.com 上获取您域自己的 YouTube API 密钥,并根据自己的要求生成凭据。

      【讨论】:

        【解决方案6】:

        Youtube 数据 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
        

        【讨论】:

        • /P(?:(?&lt;days&gt;\d*)D)?T(?:(?&lt;hours&gt;\d*)H)?(?:(?&lt;minutes&gt;\d*)M)?(?:(?&lt;seconds&gt;\d*)S)/.exec('P2DT1S'); ?
        【解决方案7】:

        您可以从 json 响应中的“contentDetails”字段获取持续时间。

        【讨论】:

          猜你喜欢
          • 2018-06-28
          • 2015-09-06
          • 1970-01-01
          • 2011-11-14
          • 2015-12-07
          • 2016-02-15
          • 2015-11-11
          • 1970-01-01
          • 2015-11-30
          相关资源
          最近更新 更多