通过 API (Python) 将多个视频添加到 youtube-playlist

Adding multiple videos to youtube-playlist via API (Python)

我在将多个视频添加到 YouTube 上已有的播放列表时遇到问题。

目前,我可以通过在脚本中使用不同的视频 ID 重复一段代码(从 request =print(f"\n{response}") 的位)来添加多个视频;但是,我想找到一种更聪明、更好的方法来做到这一点。

我已经尝试阅读其他 post 有关此问题的文章,但不幸的是,它们对我不起作用。

此外,我查看了 Google YouTube API 文档,但在那里找不到解决我的问题的方法。

由于这是我的第一个 post,如果我需要为社区添加更多信息来解决问题,请告诉我。

这是我目前正在使用的代码:

# -*- coding: utf-8 -*-

# Sample Python code for youtube.playlistItems.insert
# See instructions for running these code samples locally:
# https://developers.google.com/explorer-help/guides/code_samples#python

import os

import google_auth_oauthlib.flow
import googleapiclient.discovery
import googleapiclient.errors

scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"]

def main():
    # Disable OAuthlib's HTTPS verification when running locally.
    # *DO NOT* leave this option enabled in production.
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"

    api_service_name = "youtube"
    api_version = "v3"
    client_secrets_file = "XXXX.json"

    # Get credentials and create an API client
    flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file(
        client_secrets_file, scopes)
    credentials = flow.run_console()
    youtube = googleapiclient.discovery.build(
        api_service_name, api_version, credentials=credentials)

    request = youtube.playlistItems().insert(
        part="snippet",
        body={
          "snippet": {
            "playlistId": "playlist-xy", #an actual playlistid
            "position": 0,
            "resourceId": {
              "kind": "youtube#video",
              "videoId": "videoid-xy" #an actual videoid
            }
          }
        }
    )
    response = request.execute()

    print(f"\n{response}")

if __name__ == "__main__":
    main()

使用API提供的Batch Processing option

您不是创建单个请求,而是创建一个批处理,然后将所有请求添加到其中,然后执行。假设您将所有视频 ID 存储在列表 videoIds:

youtube = googleapiclient.discovery.build(
    api_service_name, api_version, credentials=credentials)
batch = youtube.new_batch_http_request()
for videoId in videoIds:
    batch.add(youtube.playlistItems().insert(
        part="snippet",
        body={
          "snippet": {
            "playlistId": "playlist-xy", #an actual playlistid
            "position": 0,
            "resourceId": {
              "kind": "youtube#video",
              "videoId": videoId
            }
          }
        }
      )
    )
responses = batch.execute()

您还可以设置一个回调函数,调用它来响应每个批次项目。上面链接的页面上提供了相关信息。