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

如何通过YouTube Data API排除归档直播,保留频道视频页的首映视频?

如何通过YouTube Data API区分频道Videos页面的首映视频与归档直播?

我需要匹配某频道公开的Videos标签内容,要求排除归档直播,但保留出现在/videos页面里的首映视频。以下两个公开视频可复现当前问题:

  • IcZxVrRrzcM:属于/videos页面中的首映视频
  • 6-qDqVXDZbY:属于未出现在/videos页面中的归档直播

最小可复现示例(MRE)

import requests

YT_API_KEY: str = ""
VIDEO_URL = "https://www.googleapis.com/youtube/v3/videos"

for video_id in ["IcZxVrRrzcM", "6-qDqVXDZbY"]:
    resp = requests.get(
        VIDEO_URL,
        params={
            "part": "snippet,liveStreamingDetails",
            "id": video_id,
            "key": YT_API_KEY,
        },
        timeout=30,
    ).json()

    video = resp["items"][0]
    print(
        video_id,
        video["snippet"].get("liveBroadcastContent"),
        "liveStreamingDetails" in video,
    )

运行后返回结果:

IcZxVrRrzcM none True
6-qDqVXDZbY none True

可以看到,liveBroadcastContent和liveStreamingDetails字段无法区分这两类视频,但通过频道的/videos页面能明确识别它们的归属。


解决方案:利用频道的Upload播放列表匹配Videos页面内容

YouTube Data API v3没有直接标记某视频是否属于/videos页面的字段,但可以通过以下逻辑实现需求:

  1. 获取频道的Upload播放列表ID:每个频道的/videos页面对应的是该频道的「Upload」播放列表,调用channels.list接口,指定part=contentDetails,即可拿到contentDetails.relatedPlaylists.uploads的值。
  2. 遍历Upload播放列表内容:调用playlistItems.list接口,传入上述播放列表ID,获取的所有视频就是/videos页面展示的内容,自然排除了归档直播(归档直播默认归属于「Live」播放列表)。
  3. 验证单个视频归属:如果需要判断单个视频是否在/videos页面,可检查该视频ID是否存在于Upload播放列表的返回结果中。

示例代码(获取频道Upload播放列表并验证视频):

import requests

YT_API_KEY: str = ""
CHANNEL_URL = "https://www.googleapis.com/youtube/v3/channels"
PLAYLIST_ITEMS_URL = "https://www.googleapis.com/youtube/v3/playlistItems"

# 目标频道ID(从频道URL @LiquidZulu 可获取)
CHANNEL_ID = "UCZuluV8rXjK-0h0xX8l7R5g"

# 1. 获取频道的Upload播放列表ID
resp_channel = requests.get(
    CHANNEL_URL,
    params={
        "part": "contentDetails",
        "id": CHANNEL_ID,
        "key": YT_API_KEY,
    },
    timeout=30
).json()
upload_playlist_id = resp_channel["items"][0]["contentDetails"]["relatedPlaylists"]["uploads"]

# 2. 获取Upload播放列表中的视频ID(这里只取前50个,可通过pageToken分页获取全部)
resp_playlist = requests.get(
    PLAYLIST_ITEMS_URL,
    params={
        "part": "contentDetails",
        "playlistId": upload_playlist_id,
        "maxResults": 50,
        "key": YT_API_KEY,
    },
    timeout=30
).json()

uploaded_video_ids = [item["contentDetails"]["videoId"] for item in resp_playlist["items"]]

# 3. 验证测试视频是否在/videos页面中
test_video_ids = ["IcZxVrRrzcM", "6-qDqVXDZbY"]
for vid in test_video_ids:
    print(f"{vid}: {'在Videos页面中' if vid in uploaded_video_ids else '不在Videos页面中'}")

说明

首映视频本质是按直播形式发布的预录制内容,直播结束后liveBroadcastContent会变为none,同时保留liveStreamingDetails字段;归档直播结束后同样会有这些字段,因此无法通过单个视频的字段直接区分。而通过频道的Upload播放列表筛选,是最准确匹配/videos页面内容的方式。

内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 16:17:33