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
相关产品推荐
相关产品推荐

