【问题标题】:Trying to add multiple videos to a YouTube playlist from .csv file尝试将多个视频从 .csv 文件添加到 YouTube 播放列表
【发布时间】:2015-03-31 23:01:47
【问题描述】:

我正在尝试使用 youtube-api. 将存储在 .csv 文件中的视频 ID 列表添加到播放列表中

我已经添加了一个视频,但我正在努力导入存储在 CSV 文件中的视频 ID 列表。

所以在这个 sn-p 中,我想用指向 CSV 文件的链接替换视频 ID:

def add_video_to_playlist(youtube, videoID, playlistID):
    add_video_request = youtube.playlistItems().insert(
    part = "snippet",
    body = {
             'snippet': {
              'playlistId': 'PLpB9AHGzZKOugx13Kwkj47mro_PftxSE9',
              'resourceId': {
                  'kind': 'youtube#video',
                  'videoId': 'tcJ4eVVK640'`

据我所知,这是完整的代码:

import httplib2
import os
import sys
import csv

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run


# The CLIENT_SECRETS_FILE variable specifies the name of a file
# that containsthe OAuth 2.0 information for this application,
# including its client_id and client_secret. You can acquire
# an OAuth 2.0 client ID and client secret from the Google
# Cloud Console at https://cloud.google.com/console.
#
# Please ensure that you have enabled the
# YouTube Data API for your project.
#
# For more information about using OAuth2 to
# access the YouTube Data API, see:
#   https://developers.google.com/youtube/v3/guides/authentication
#
# For more information about the client_secrets.json
# file format, see:
#   https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
#
CLIENT_ID = ''
CLIENT_SECRETS_FILE = ""

# This variable defines a message to display if the CLIENT_SECRETS_FILE is
# missing.
MISSING_CLIENT_SECRETS_MESSAGE = """
WARNING: Please configure OAuth 2.0

To make this sample run you will need to populate the client_secrets.json file
found at:

%s

with information from the Cloud Console
https://cloud.google.com/console

For more information about the client_secrets.json file format, please visit:
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
""" % os.path.abspath(os.path.join(os.path.dirname(__file__),
                           CLIENT_SECRETS_FILE))

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account.
YOUTUBE_SCOPE = "https://www.googleapis.com/auth/youtube"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"


def get_authenticated_service():
    flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
                                   scope=YOUTUBE_SCOPE,
                                   message=MISSING_CLIENT_SECRETS_MESSAGE)

    storage = Storage("%s-oauth2.json" % sys.argv[0])
    credentials = storage.get()

    if credentials is None or credentials.invalid:
        credentials = run(flow, storage)

    return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
                 http=credentials.authorize(httplib2.Http()))


def add_video_to_playlist(youtube, videoID, playlistID):
    add_video_request = youtube.playlistItems().insert(
        part = "snippet",
               body = {
                   'snippet': {
                       'playlistId': 'PlayistId',
                       'resourceId': {
                           'kind': 'youtube#video',
                           '     videoId': 'VideoId'
                       }
                       #'position': 0
                   }
               }
    ).execute()

if __name__ == '__main__':
    youtube = get_authenticated_service()
    add_video_to_playlist(youtube, "yszl2oxi8IY", "PL2JW1S4IMwYubm06iDKfDsmWVB-    J8funQ")

【问题讨论】:

  • 在两个地方有意外的多个空格:在函数add_video_to_playlist()中的videoId附近的字符串中:' videoId': 'VideoId'(但仅限于完整代码部分)和字符串"PL2JW1S4IMwYubm06iDKfDsmWVB- J8funQ"跨度>

标签: python csv youtube youtube-api


【解决方案1】:

这段代码对我有用:

#!/usr/bin/python
import argparse

import httplib2
from oauth2client import tools
import os
import sys

from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow


# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains
# the OAuth 2.0 information for this application, including its client_id and
# client_secret. You can acquire an OAuth 2.0 client ID and client secret from
# the Google Developers Console at
# https://console.developers.google.com/.
# Please ensure that you have enabled the YouTube Data API for your project.
# For more information about using OAuth2 to access the YouTube Data API, see:
#   https://developers.google.com/youtube/v3/guides/authentication
# For more information about the client_secrets.json file format, see:
#   https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
CLIENT_SECRETS_FILE = "client_secrets.json"

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account.
YOUTUBE_READ_WRITE_SCOPE = "https://www.googleapis.com/auth/youtube"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

# This variable defines a message to display if the CLIENT_SECRETS_FILE is
# missing.
MISSING_CLIENT_SECRETS_MESSAGE = """
WARNING: Please configure OAuth 2.0

To make this sample run you will need to populate the client_secrets.json file
found at:

   %s

with information from the Developers Console
https://console.developers.google.com/

For more information about the client_secrets.json file format, please visit:
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
""" % os.path.abspath(os.path.join(os.path.dirname(__file__),
                                   CLIENT_SECRETS_FILE))


def get_authenticated_service(flags):
    flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
                                   scope=YOUTUBE_READ_WRITE_SCOPE,
                                   message=MISSING_CLIENT_SECRETS_MESSAGE)

    storage = Storage("%s-oauth2.json" % sys.argv[0])
    credentials = storage.get()

    if credentials is None or credentials.invalid:
        credentials = run_flow(flow, storage, flags)

    return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
                 http=credentials.authorize(httplib2.Http()))


def list_playlist_items(youtube, playlistID):
    playlistitems_list_request = youtube.playlistItems().list(
        playlistId=playlistID,
        part="snippet",
        maxResults=50
    )

    while playlistitems_list_request:
        playlistitems_list_response = playlistitems_list_request.execute()

        # Print information about each video.
        for playlist_item in playlistitems_list_response["items"]:
            title = playlist_item["snippet"]["title"]
            video_id = playlist_item["snippet"]["resourceId"]["videoId"]
            print "%s (%s)" % (title, video_id)

        playlistitems_list_request = youtube.playlistItems().list_next(
            playlistitems_list_request, playlistitems_list_response)


def add_video_to_playlist(youtube, videoID, playlistID):
    playlistitems_insert_request = youtube.playlistItems().insert(
        part="snippet",
        body={
            'snippet': {
                'playlistId': playlistID,
                'resourceId': {
                    'kind': 'youtube#video',
                    'videoId': videoID

                }
                # 'position': 0
            }
        }
    ).execute()


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        parents=[tools.argparser])
    flags = parser.parse_args()
    youtube = get_authenticated_service(flags)
    playlistID = "YOUR PLAYLIST ID"
    videoIDs = [
        "-xhJx6UR4Vw", "04mfKJWDSzI", "MORE VIDEO IDS"
    ]
    for videoID in videoIDs:
        add_video_to_playlist(youtube, videoID, playlistID)
    list_playlist_items(youtube, playlistID)

请注意,您需要在Google Developer Console 中创建一个项目,启用 YouTube 数据 API,添加新凭据(类型为 OAuth 2.0 客户端 ID --> Web 应用程序,添加授权重定向 URL http://localhost:8080/ ),下载client_secrets.json文件并放在同一目录下。

祝你好运:)

【讨论】:

  • 你改变了什么?例如。我注意到您修复了add_video_to_playlist() 中videoId 附近字符串中的多个空格:' videoId': 'VideoId'
【解决方案2】:

如果您添加视频的方法有效,则应保持原样。无需在这方面重新编写它。相反,您基本上将遍历videoIDs 的列表并多次调用add_video_to_playlist。

为此,基本概念是:

 for video_id in list_of_video_ids:
      add_video_to_playlist(youtube,video_id,playlistID)

从那里,您向后工作并通过遍历 csv 文件的行来构建您的 list_of_video_ids:

 import csv

 with open('path/to/file.csv', 'w') as file:
      reader = csv.reader(file)
      list_of_video_ids = []
      for row in reader:
           list_of_video_ids.append(row[0]) # assuming your video IDs
                                            # are in the first column
                                            # of each row

 for video_id in list_of_video_ids:
      ... # so on and so forth

csv.reader() 创建一个阅读器对象。通过迭代此对象,您可以按顺序访问文件的每一行,并使用编号索引抓取每一列。

您也可以使用csv.DictReader()。迭代它会创建作为字典的行,文件第一行中的值是这些列的键。因此,如果列中的第一个单元格标题为 video_id,您将使用 row['video_id'] 访问该单元格。

如果您正在寻找更具体的内容,请告诉我。这是一个总体概述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2014-02-09
    • 2015-12-31
    • 1970-01-01
    • 2023-03-24
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多