这里的简短回答是,在当前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;
}
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
。
根据
文档,
snippet
每个API配额的成本为2单位,而对
id
的请求为0。因此,我不需要在每个页面的每个项目上获取snippet。我只需要抓取结果中最后一个视频的snippet,这可以通过更精细的调用完成。
$youtube->videos->listVideos()
通过添加
PlaylistCache
类,我只有在缓存版本的播放列表返回
true
时,在
$playlistCache->isExpired()
调用上才会访问API,因此我每24小时只需要一次轮询整个播放列表,而不是为每个用户的每个页面加载1次。
尽管仍然不完美,但据我所知,这是目前可用的最佳选项。