【问题标题】:Youtube API - Get duration of videos from a playlistYoutube API - 从播放列表中获取视频的时长
【发布时间】:2018-09-05 10:01:48
【问题描述】:

我需要获取 Youtube 播放列表中所有视频的时长。 我知道在搜索所有视频时 API 不会显示每个视频的持续时间,但如果查询是针对特定视频进行的,它会显示它。

我尝试通过PHP从播放列表中收集所有ID,然后分析每个ID以从视频中获取数据,但是脚本太慢了,虽然应该强调它运行良好,有什么办法可以优化它?...

    function youtube_automusic($listas, $api_key, $resultados){
        $nresultados = $resultados;
        $lista_reproduccion_random = $listas;
        $lista_reproduccion = $lista_reproduccion_random[array_rand($lista_reproduccion_random)];
        $url_playlist = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&fields=items(snippet(resourceId(videoId)))&type=video&videoCategoryId=10&maxResults=".$nresultados."&playlistId=".$lista_reproduccion."&key=".$api_key;
        $data = dlPage($url_playlist);
        $data_decode = json_decode($data, true);

        $number_song = 1;
        $respuesta = array();
        foreach ($data_decode as $items){
            foreach ($items as $item){
                $lista_ids =$item['snippet']['resourceId']['videoId'];
                $url_video = "https://www.googleapis.com/youtube/v3/videos?id=".$lista_ids."&part=snippet,contentDetails&fields=items(etag,id,snippet(publishedAt,title,thumbnails(default(url)),tags),contentDetails(duration))&key=".$api_key;
                $data_video = dlPage($url_video);
                $data_video_decode = json_decode($data_video, true);
                foreach ($data_video_decode as $items_videos){
                    foreach ($items_videos as $item_video){
                        $data_final = array(
                            'etag' => $item_video['etag'],
                            'idvideo' => $item_video['id'],
                            'titulovideo' => $item_video['snippet']['title'],
                            'thumbnail' => $item_video['snippet']['thumbnails']['default']['url'],
                            'duracion' => $item_video['contentDetails']['duration'],
                            'videoplay' => $number_song++
                        );
                        array_push($respuesta, $data_final);
                    }
                }   
            }
        }
        return json_encode($respuesta);         
    }

【问题讨论】:

  • 我建议您查看 Google PHP 客户端库。
  • 你的dlPage()是什么样的?
  • 它是一个使用 simple_html_dom 的函数

标签: php optimization foreach google-api youtube-api


【解决方案1】:

我刚刚进行了测试here

请求:

GET https://www.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails&id=Ks-_Mh1QhMc&fields=items(etag%2Cid%2Csnippet(publishedAt%2Ctitle%2Cthumbnails(default(url))%2Ctags)%2CcontentDetails(duration))&key={YOUR_API_KEY}

结果:

{
 "items": [
  {
   "etag": "\"RmznBCICv9YtgWaaa_nWDIH1_GM/aCBUdsaX0W34z3It8a8FCh5uteo\"",
   "id": "Ks-_Mh1QhMc",
   "snippet": {
    "publishedAt": "2012-10-01T15:27:35.000Z",
    "title": "Your body language may shape who you are | Amy Cuddy",
    "thumbnails": {
     "default": {
      "url": "https://i.ytimg.com/vi/Ks-_Mh1QhMc/default.jpg"
     }
    },
    "tags": [
     "Amy Cuddy",
     "TED",
     "TEDTalk",
     "TEDTalks",
     "TED Talk",
     "TED Talks",
     "TEDGlobal",
     "brain",
     "business",
     "psychology",
     "self",
     "success"
    ]
   },
   "contentDetails": {
    "duration": "PT21M3S"
   }
  }
 ]
}

我建议您使用 Google API 资源管理器使用您遇到问题的视频 ID 运行相同的请求,以验证这不是 API 不返回您的持续时间的问题。

【讨论】:

  • 脚本运行良好,问题是我试图从播放列表中获取视频时长。但是播放列表不显示视频时长,所以我尝试首先从播放列表中获取所有 videoID,然后从找到的每个 videoID 中获取视频详细信息。它可以工作,但是脚本太慢了,因为它必须进行多重解析。
  • @Kokox 你有什么方法可以做到这一点吗?
【解决方案2】:

如果您的代码包含 50 个项目的播放列表,则需要 51 次 API 调用。

不要对播放列表中的每个视频进行单个视频请求,而是先获取播放列表中的所有视频 ID,然后一次请求最多 50 个视频(ID 参数采用逗号分隔的 up 列表最多 50 项)。

那么一个 50 项的播放列表只需要 2 次 API 调用。

应该更快。

【讨论】:

  • 我真的不知道你可以输入几个用逗号分隔的ID,现在我可以优化我的功能了,谢谢!
  • 如果您以逗号分隔列出视频,配额是否算作一次请求?
猜你喜欢
  • 2011-06-04
  • 2011-01-30
  • 2015-08-20
  • 2013-09-12
  • 2012-12-26
  • 1970-01-01
  • 2014-03-02
  • 2021-12-19
  • 2015-11-24
相关资源
最近更新 更多