gpt4 book ai didi

YouTube API v3 获取播放列表中的最后一个视频

转载 作者:行者123 更新时间:2023-12-03 05:17:02 26 4
gpt4 key购买 nike

一些基本背景:我帮助在 YouTube 上运行一个游戏 channel ,并且我正在构建一个实用程序(使用 PHP)来将该 channel 的内容与一个配套网站集成。我们的播放列表主要是按发布日期排序的“让我们玩”系列,这些系列按照各种游戏的时间顺序排列,我希望网站能显示选定系列中的“最新一集”。

我知道我可以通过将调用链接到以下内容来完成最后一个视频:

$youtubeService->playlistItems->listPlaylistItems(
"snippet",
array(
"playlistId" => $playlistId
"pageToken" => $nextPageToken
)
)

并在 $nextPageToken 时简单地抓取响应集中的最后一项。未设置。

然而,这让我感到非常低效——部分是因为我相信它会消耗我的 API 请求配额,但主要是因为它会减慢网站的整体响应时间。这些都不是理想的。

似乎应该有一种更简单的方法可以通过更改响应的顺序或使用一些方便的功能来获取播放列表中的“最新”视频,但我找不到任何文档。

我看过使用 Search PlaylistItems 上的函数,但是(根据 documentation ),搜索只接受 channel ID 作为参数而不接受播放列表 ID,这让我认为它的前进方向是错误的。

最佳答案

简短的回答是,在当前版本的 API 下这似乎是不可能的。没有明显的方法可以从本质上反向选择视频,但我确实做了一个小改动,这导致整个过程更有效率。

这是原始代码:

$items = $youtube->playlistItems->listPlaylistItems(
"snippet",
array(
"playlistId" => $playlistId,
"maxResults" => 50
)
);

while ($items->nextPageToken) {
$items = $youtube->playlistItems->listPlaylistItems(
"snippet",
array(
"playlistId" => $playlistId,
"maxResults" => 50,
"pageToken" => $items->nextPageToken
)
);
}

if ($items) {
return end($items->getItems());
}

这是修复:

首先,我添加了一个对象来帮助缓存:
class PlaylistCache {
protected $expirationDate;
protected $playlistId;
protected $latestEpisode;

__construct($playlistId, $latestEpisode) {
$this-playlistId = $playlistId;
$this->latestEpisode = $latestEpisode;

$this->expirationDate = time() + 86400;
// get current time + 24 hours
}

public function getLatestEpisode() {
return $this->latestEpisode;
}

public function getPlaylistId() {
return $this->playlistId;
}

public function isExpired() {
return $this->expirationDate < time();
}
}

然后,在轮询 API 之前,我会查看是否有可用的缓存版本,并且只有在缓存版本过期时才使用 API。
$playlistCache = json_decode(get_option('playlist_cache_' . $playlistId));

if ($playlistCache->isExpired()) {

$items = $youtube->playlistItems->listPlaylistItems(
"id",
array(
"playlistId" => $playlistId,
"maxResults" => 50
)
);

while ($items->nextPageToken) {
$items = $youtube->playlistItems->listPlaylistItems(
"id",
array(
"playlistId" => $playlistId,
"maxResults" => 50,
"pageToken" => $items->nextPageToken
)
);
}

if ($items) {
$videoId = end($items->getItems()[0]->getId());
$video = $youtube->videos->listVideos("snippet", array('id' => $videoId))
$video = $video->getItems()[0];

$playlistCache = new PlaylistCache($playlistId, $video);

update_option('playlist_cache_' . $playlistId, json_encode($playlistCache)));
}
}

return $playlistCache->getLatestEpisode();

这里的另一个重大变化是我对 listPlaylistItems() 的调用正在请求 id而不是 snippet .

根据 documentation , snippet请求 id 时会花费 2 个单位的 API 配额。是 0。因此,我不需要为每个页面上的每个项目都抓取代码段。我只需要在结果中抓取最终视频的片段,我可以通过更精细的调用来做到这一点
$youtube->videos->listVideos()

加上 PlaylistCache我只在播放列表的缓存版本返回 true 时才联系 API在 $playlistCache->isExpired()调用,所以我只需要每 24 小时轮询一次整个播放列表,而不是为每个用户每次页面加载 1 次。

它仍然不是很理想,但据我所知,它是目前可用的最佳选择。

关于YouTube API v3 获取播放列表中的最后一个视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38156902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com