You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Youtube API PlaylistItems:list接口maxResults参数返回重复视频ID问题求助

解决思路

问题根因排查方向

  • 首先区分两类重复:播放列表本身多次添加同一个视频导致的videoId重复,和YouTube Data API分页异常返回的重复条目。
    • 播放列表每条条目有独立的唯一标识PlaylistItem.id,如果该值无重复,说明是业务侧确实将同一视频多次加入播放列表,videoId重复属于正常现象,现有去重逻辑直接使用即可。
    • 如果PlaylistItem.id也存在重复,说明是API分页边界的已知bug,该bug由分页请求过程中播放列表内容轻微变动(如视频排序调整、上下架)导致,重复率会随maxResults设置值变化。

代码优化方案

1. 修正分页token逻辑

原代码初始pageToken设为空字符串,首次请求传入空值可能导致第一页数据重复拉取,调整初始值为null,仅在非空时传入分页参数:

List<PlaylistItem> playlistItemList = new ArrayList<>();
Set<String> existedItemIds = new HashSet<>();

try {
    String pageToken = null;

    while (pageToken != null || playlistItemList.isEmpty()) {
        YouTube.PlaylistItems.List youtubePlaylistItemsList = youtube.playlistItems().list("id,snippet,contentDetails");
        youtubePlaylistItemsList.setPlaylistId("UUlatNLsHQYQ00TCT3Nfse6w");
        youtubePlaylistItemsList.setMaxResults(50L);
        if (pageToken != null) {
            youtubePlaylistItemsList.setPageToken(pageToken);
        }
        PlaylistItemListResponse playlistItemListResponse = youtubePlaylistItemsList.execute();

        for (PlaylistItem item : playlistItemListResponse.getItems()) {
            if (!existedItemIds.contains(item.getId())) {
                existedItemIds.add(item.getId());
                playlistItemList.add(item);
            }
        }
        pageToken = playlistItemListResponse.getNextPageToken();
    }
} catch (IOException e) {
    logger.error("Error: ", e);
}

2. 拉取全量字段辅助校验

请求part参数新增id和contentDetails,可通过PlaylistItem.getContentDetails().getVideoId()获取更稳定的视频ID,也可通过position字段校验播放列表条目顺序是否连续,进一步定位重复来源。

3. 最终去重逻辑

如果业务需要唯一视频ID,原有基于videoId的HashMap去重逻辑无需修改,maxResults固定为最大值50即可,该参数下API分页效率最高,重复率最低。

内容的提问来源于stack exchange,提问作者Daniil Malofeyev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:45:03