📌  相关文章
📜  Youtube 数据 API 播放列表 |组 2

📅  最后修改于: 2021-10-22 02:59:20             🧑  作者: Mango

我们已经讨论了播放列表的前两种方法 – 列出与频道 ID 关联的所有播放列表,检索我的播放列表,即授权用户帐户的播放列表。

现在,我们将讨论另外三种方法:插入播放列表、更新播放列表和删除播放列表。这意味着我们可以只使用 API 插入,或者我们可以说创建一个新的播放列表,然后我们可以只使用 API 将视频上传到播放列表,或者我们可以对视频进行评级以将其添加到所需的播放列表。
现在我们可以通过查看事物如何相互关联以及如何使用 API 完成所有操作来推导出相关性。您只需要一组有效的凭据来授权访问。所有这些方法都需要用户授权,所以我们将首先讨论如何创建OAuth Credential ,然后我们将看看这些功能的实现。

按照以下步骤生成客户端 ID 和密钥。

  1. 转到 Google Google Developers Console,然后单击页面右上角的登录。使用有效 Google 帐户的凭据登录。如果您没有 google 帐户,请先设置一个帐户,然后使用详细信息在 Google Developers 主页上登录。
  2. 现在导航到开发人员仪表板并创建一个新项目。
  3. 单击启用 API 选项
  4. 在搜索字段中,搜索Youtube Data API并选择下拉列表中的 Youtube Data API 选项。
  5. 您将被重定向到显示有关 Youtube Data API 信息的屏幕,以及两个选项: ENABLE 和 TRY API
  6. 单击启用选项以开始使用 API。
  7. 在 APIs & Services 下的侧边栏中,选择Credentials
  8. 在页面顶部,选择OAuth 同意屏幕选项卡。选择一个电子邮件地址,如果尚未设置,请输入产品名称,然后单击保存按钮。
  9. 凭据选项卡中,选择创建凭据下拉列表,然后选择OAuth 客户端 ID 。 OAuth 通常用于需要授权的情况,例如检索用户喜欢的视频。
  10. 选择其他应用程序类型,输入名称“YouTube Data API Myvideos”,然后单击“创建”按钮并单击“确定”。
  11. 单击客户端 ID 右侧的下载按钮以下载 JSON 文件。
  12. 将文件保存并重命名为 client_secret.json 并将其移动到工作目录。

使用 pip命令安装其他库:

pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2

插入播放列表的代码:此示例显示如何在授权用户的帐户中插入/创建播放列表。 snippet.title是创建新播放列表时的必需属性。其他的是可选的。

import os
import google.oauth2.credentials
import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
  
# The CLIENT_SECRETS_FILE variable specifies
# the name of a file that contains
# client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"
  
# This scope allows for full read/write
# access to the authenticated user's account
# and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
  
def get_authenticated_service():
    flow = InstalledAppFlow.from_client_secrets_file(
                         CLIENT_SECRETS_FILE, SCOPES)
    credentials = flow.run_console()
    return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
  
def print_response(response):
    print(response)
  
# Build a resource based on a list of 
# properties given as key-value pairs.
# Leave properties with empty values 
# out of the inserted resource.
def build_resource(properties):
    resource = {}
    for p in properties:
        # Given a key like "snippet.title", split
        # into "snippet" and "title", where
        # "snippet" will be an object and "title" 
        # will be a property in that object.
        prop_array = p.split('.')
        ref = resource
        for pa in range(0, len(prop_array)):
        is_array = False
        key = prop_array[pa]
      
        # For properties that have array values,
        # convert a name like "snippet.tags[]" to 
        # snippet.tags, and set a flag to handle
        # the value as an array.
        if key[-2:] == '[]':
            key = key[0:len(key)-2:]
            is_array = True
      
        if pa == (len(prop_array) - 1):
            # Leave properties without values 
            # out of inserted resource.
            if properties[p]:
            if is_array:
                ref[key] = properties[p].split(',')
            else:
                ref[key] = properties[p]
        elif key not in ref:
            # For example, the property is "snippet.title",
            # but the resource does not yet have a "snippet"
            # object. Create the snippet object here.
            # Setting "ref = ref[key]" means that in the next
            # time through the "for pa in range ..." loop,
            # we will be setting a property in the
            # resource's "snippet" object.
            ref[key] = {}
            ref = ref[key]
        else:
            # For example, the property is "snippet.description",
            # and the resource already has a "snippet" object.
            ref = ref[key]
    return resource
  
# Remove keyword arguments that are not set
def remove_empty_kwargs(**kwargs):
    good_kwargs = {}
    if kwargs is not None:
        for key, value in kwargs.items():
        if value:
            good_kwargs[key] = value
    return good_kwargs
  
def playlists_insert(client, properties, **kwargs):
    resource = build_resource(properties)
    kwargs = remove_empty_kwargs(**kwargs)
    response = client.playlists().insert(
        body=resource,
        **kwargs
    ).execute()
      
    return print_response(response)
  
  
if __name__ == '__main__':
    # When running locally, disable OAuthlib's
    # HTTPs verification. When running in production 
    # *do not* leave this option enabled.
    os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
    client = get_authenticated_service()
      
    playlists_insert(client,
        {'snippet.title':'Information Security',
        'snippet.description':'This playlist contains videos \
                   related to Information Security and Privacy \
                   and Security in Online Social Media',
                     
        'snippet.tags[]':'',
        'snippet.defaultLanguage':'EN',
        'status.privacyStatus':''},
        part='snippet,status',
        onBehalfOfContentOwner='')

输出:
当您执行代码时,系统会要求您提供授权代码。要获取代码,您需要按照以下行上方的命令提示符屏幕中提到的链接进行操作:输入授权代码。

现在点击链接并复制粘贴您将通过授予权限获得的授权代码。

从上面的输出中,您可以看到我的帐户中有一个新的播放列表,其标题和描述与代码中提到的相同,但没有添加视频。
我们可以根据您的选择通过代码或从 youtube 手动将视频添加到播放列表中,或者您也可以对视频进行评分以将其添加到播放列表中。
注意:您可以从可用的库菜单中查看您拥有的播放列表列表,方法是单击您初始的 youtube 页面右上角的图标,然后转到第一个选项注册的电子邮件 ID。这将在最左侧的垂直菜单中显示库选项。库列出了您帐户中的所有播放列表。

更新播放列表的代码:此示例向您展示了如何更新播放列表属性,如标题、说明或隐私状态。 idsnippet.title是强制性属性,所有其他属性都是可选的。

import os
import google.oauth2.credentials
import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
  
# The CLIENT_SECRETS_FILE variable specifies
# the name of a file that contains
# client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"
  
# This scope allows for full read/write
# access to the authenticated user's account
# and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
  
def get_authenticated_service():
    flow = InstalledAppFlow.from_client_secrets_file(
                         CLIENT_SECRETS_FILE, SCOPES)
                           
    credentials = flow.run_console()
    return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
      
    def print_response(response):
        print(response)
  
# Build a resource based on a list of properties
# given as key-value pairs. Leave properties with
# empty values out of the inserted resource.
def build_resource(properties):
    resource = {}
    for p in properties:
        # Given a key like "snippet.title", split into
        # "snippet" and "title", where "snippet" will be
        # an object and "title" will be a property in that object.
        prop_array = p.split('.')
        ref = resource
        for pa in range(0, len(prop_array)):
            is_array = False
            key = prop_array[pa]
      
        # For properties that have array values,
        # convert a name like "snippet.tags[]" to
        # snippet.tags, and set a flag to handle
        # the value as an array.
        if key[-2:] == '[]':
            key = key[0:len(key)-2:]
            is_array = True
      
        if pa == (len(prop_array) - 1):
            # Leave properties without values
            # out of inserted resource.
            if properties[p]:
            if is_array:
                ref[key] = properties[p].split(',')
            else:
                ref[key] = properties[p]
        elif key not in ref:
            # For example, the property is "snippet.title",
            # but the resource does not yet have a "snippet"
            # object. Create the snippet object here.
            # Setting "ref = ref[key]" means that in the next
            # time through the "for pa in range ..." loop, 
            # we will be setting a property in the
            # resource's "snippet" object.
            ref[key] = {}
            ref = ref[key]
        else:
            # For example, the property is "snippet.description",
            # and the resource already has a "snippet" object.
            ref = ref[key]
    return resource
  
# Remove keyword arguments that are not set
def remove_empty_kwargs(**kwargs):
    good_kwargs = {}
    if kwargs is not None:
        for key, value in kwargs.items():
        if value:
            good_kwargs[key] = value
    return good_kwargs
  
def playlists_updateproperties(client, properties, **kwargs):
  
    resource = build_resource(properties)
    kwargs = remove_empty_kwargs(**kwargs)
    response = client.playlists().update(
        body=resource,**kwargs).execute()
  
    return print_response(response)
  
  
if __name__ == '__main__':
    # When running locally, disable OAuthlib's
    # HTTPs verification. When running in production 
    # *do not* leave this option enabled.
    os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
    client = get_authenticated_service()
      
    playlists_updateproperties(client, 
        {'id': 'PLqAJNJC4tCYs2-uG-AqaqHAIJzm_1FEtY',
        'snippet.title': 'Information Security',
        'snippet.description': 'This playlist contains videos on\
                    topics of Information Security and Privacy and \
                    Security in Online Social Media',
                      
        'snippet.tags[]': '',
        'status.privacyStatus': 'public'},
        part='snippet,status',
        onBehalfOfContentOwner='')

输出:

当您执行代码时,系统会要求您提供授权代码。要获取代码,您需要按照以下行上方的命令提示符屏幕中提到的链接进行操作:输入授权代码。

现在点击链接并复制粘贴您将通过授予权限获得的授权代码。

如果将上一个和此输出的播放列表快照进行比较,您可以看到我更新了播放列表的描述和隐私状态。

删除播放列表的代码:现在是删除我们在第一个示例中创建的播放列表的时候了。

import os
import google.oauth2.credentials
import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
  
# The CLIENT_SECRETS_FILE variable specifies
# the name of a file that contains
# client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"
  
# This scope allows for full read/write access to the
# authenticated user's account and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
  
def get_authenticated_service():
    flow = InstalledAppFlow.from_client_secrets_file(
                         CLIENT_SECRETS_FILE, SCOPES)
                           
    credentials = flow.run_console()
    return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
  
def print_response(response):
    print(response)
  
# Build a resource based on a list of properties
# given as key-value pairs. Leave properties with
# empty values out of the inserted resource.
def build_resource(properties):
resource = {}
for p in properties:
    # Given a key like "snippet.title", split into
    # "snippet" and "title", where "snippet" will be
    # an object and "title" will be a property in that object.
    prop_array = p.split('.')
    ref = resource
    for pa in range(0, len(prop_array)):
    is_array = False
    key = prop_array[pa]
  
    # For properties that have array values,
    # convert a name like "snippet.tags[]" to
    # snippet.tags, and set a flag to handle
    # the value as an array.
    if key[-2:] == '[]':
        key = key[0:len(key)-2:]
        is_array = True
  
    if pa == (len(prop_array) - 1):
        # Leave properties without values 
        # out of inserted resource.
        if properties[p]:
        if is_array:
            ref[key] = properties[p].split(', ')
        else:
            ref[key] = properties[p]
    elif key not in ref:
        # For example, the property is "snippet.title",
        # but the resource does not yet have a "snippet"
        # object. Create the snippet object here.
        # Setting "ref = ref[key]" means that in the next
        # time through the "for pa in range ..." loop, we 
        # will be setting a property in the
        # resource's "snippet" object.
        ref[key] = {}
        ref = ref[key]
    else:
        # For example, the property is "snippet.description",
        # and the resource already has a "snippet" object.
        ref = ref[key]
return resource
  
# Remove keyword arguments that are not set
def remove_empty_kwargs(**kwargs):
    good_kwargs = {}
    if kwargs is not None:
        for key, value in kwargs.items():
        if value:
            good_kwargs[key] = value
    return good_kwargs
      
    def playlists_delete(client, **kwargs):
    kwargs = remove_empty_kwargs(**kwargs)
    response = client.playlists().delete(**kwargs).execute()
      
    return print_response(response)
  
  
if __name__ == '__main__':
    # When running locally, disable OAuthlib's
    # HTTPs verification. When
    # running in production * do not * 
    # leave this option enabled.
    os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
    client = get_authenticated_service()
      
    playlists_delete(client,
        id ='PLqAJNJC4tCYs2-uG-AqaqHAIJzm_1FEtY',
        onBehalfOfContentOwner ='')

输出:
当您执行代码时,系统会要求您提供授权代码。要获取代码,您需要按照以下行上方的命令提示符屏幕中提到的链接进行操作:输入授权代码。

现在点击链接并复制粘贴您将通过授予权限获得的授权代码。

现在,如果您查看 youtube 中的“库”菜单,您将看到该播放列表不再存在并且已成功删除。

请查看 Youtube 数据 API 播放列表的完整文档以获取完整的属性/属性列表。

参考:

  1. https://developers.google.com/youtube/v3/docs/playlists/delete
  2. https://developers.google.com/youtube/v3/docs/playlists/insert
  3. https://developers.google.com/youtube/v3/docs/playlists/update