【问题标题】:Uploading video to YouTube and adding it to playlist using YouTube Data API v3 in Python使用 Python 中的 YouTube Data API v3 将视频上传到 YouTube 并将其添加到播放列表
【发布时间】:2014-04-06 02:44:27
【问题描述】:

借助Example code 中给出的示例,我编写了一个脚本来使用 Python 中的 YouTube Data API v3 将视频上传到 YouTube。

我编写了另一个脚本,使用相同的 YouTube Data API v3 将上传的视频添加到播放列表中,您可以看到 here

之后,我编写了一个脚本来上传视频并将该视频添加到播放列表中。在我处理身份验证和范围的过程中,我仍然收到权限错误。这是我的新脚本

#!/usr/bin/python

import httplib
import httplib2
import os
import random
import sys
import time

from apiclient.discovery import build
from apiclient.errors import HttpError
from apiclient.http import MediaFileUpload
from oauth2client.file import Storage
from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import run

# Explicitly tell the underlying HTTP transport library not to retry, since
# we are handling retry logic ourselves.
httplib2.RETRIES = 1

# Maximum number of times to retry before giving up.
MAX_RETRIES = 10

# Always retry when these exceptions are raised.
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, httplib.NotConnected,
  httplib.IncompleteRead, httplib.ImproperConnectionState,
  httplib.CannotSendRequest, httplib.CannotSendHeader,
  httplib.ResponseNotReady, httplib.BadStatusLine)

# Always retry when an apiclient.errors.HttpError with one of these status
# codes is raised.
RETRIABLE_STATUS_CODES = [500, 502, 503, 504]
CLIENT_SECRETS_FILE = "client_secrets.json"

# A limited OAuth 2 access scope that allows for uploading files, but not other
# types of account access.
YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

# Helpful 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 APIs Console
https://code.google.com/apis/console#access

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():
  flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, scope=YOUTUBE_UPLOAD_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 initialize_upload(title,description,keywords,privacyStatus,file):
  youtube = get_authenticated_service()

  tags = None
  if keywords:
    tags = keywords.split(",")

  insert_request = youtube.videos().insert(
    part="snippet,status",
    body=dict(
      snippet=dict(
        title=title,
        description=description,
        tags=tags,
        categoryId='26'
      ),
      status=dict(
        privacyStatus=privacyStatus
      )
    ),
    # chunksize=-1 means that the entire file will be uploaded in a single
    # HTTP request. (If the upload fails, it will still be retried where it
    # left off.) This is usually a best practice, but if you're using Python
    # older than 2.6 or if you're running on App Engine, you should set the
    # chunksize to something like 1024 * 1024 (1 megabyte).
    media_body=MediaFileUpload(file, chunksize=-1, resumable=True)
  )

  vid=resumable_upload(insert_request)

  #Here I added lines to add video to playlist
  #add_video_to_playlist(youtube,vid,"PL2JW1S4IMwYubm06iDKfDsmWVB-J8funQ")
  #youtube = get_authenticated_service()
  add_video_request=youtube.playlistItems().insert(
        part="snippet",
        body={
                'snippet': {
                  'playlistId': "PL2JW1S4IMwYubm06iDKfDsmWVB-J8funQ", 
                  'resourceId': {
                          'kind': 'youtube#video',
                      'videoId': vid
                    }
                #'position': 0
                }
        }
    ).execute()


def resumable_upload(insert_request):
  response = None
  error = None
  retry = 0
  vid=None
  while response is None:
    try:
      print "Uploading file..."
      status, response = insert_request.next_chunk()
      if 'id' in response:
        print "'%s' (video id: %s) was successfully uploaded." % (
          title, response['id'])
    vid=response['id']
      else:
        exit("The upload failed with an unexpected response: %s" % response)
    except HttpError, e:
      if e.resp.status in RETRIABLE_STATUS_CODES:
        error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status,
                                                             e.content)
      else:
        raise
    except RETRIABLE_EXCEPTIONS, e:
      error = "A retriable error occurred: %s" % e

    if error is not None:
      print error
      retry += 1
      if retry > MAX_RETRIES:
        exit("No longer attempting to retry.")

      max_sleep = 2 ** retry
      sleep_seconds = random.random() * max_sleep
      print "Sleeping %f seconds and then retrying..." % sleep_seconds
      time.sleep(sleep_seconds)
  return vid  

if __name__ == '__main__':

  title="sample title"
  description="sample description"

  keywords="keyword1,keyword2,keyword3"

  privacyStatus="public"
  file="myfile.mp4"
  vid=initialize_upload(title,description,keywords,privacyStatus,file)
  print 'video ID is :',vid

我无法弄清楚出了什么问题。我收到权限错误。两个脚本都可以独立工作。

谁能帮我找出我错在哪里或如何实现上传视频并添加播放列表。

【问题讨论】:

    标签: python-2.7 youtube-api


    【解决方案1】:

    我得到的答案实际上在两个独立的脚本范围内是不同的。
    上传范围为“https://www.googleapis.com/auth/youtube.upload
    添加到播放列表的范围是“https://www.googleapis.com/auth/youtube

    因为范围不同,所以我不得不单独处理身份验证。

    【讨论】:

    • 虽然我在身份验证中使用了 2 个作用域,但我不能按顺序执行 2 个步骤!。我必须分开做。您是否有任何解决方案可以按顺序处理这两个步骤?
    • 我没有尝试,我使用两个单独的身份验证上传并添加到播放列表
    • 我刚刚遇到你的问题here。让我赞扬你的询问,但我必须说你问错地方了。您正确地指出,几乎每个宗教或信仰体系都规定有些人比其他人“更高”,无论他们被称为“更属灵”还是“更了解真理”。但几乎所有的信仰体系都无可辩驳地相互不相容,所以至多有一个是正确的,也可能没有一个是正确的。在我看来,批判性思考和倾听自己的良心要好得多。
    • 请注意,人类有一种自然的倾向,即想要对某事有归属感,无论是一群喜欢某事的人,还是一群拥有共同信仰的人。你和我也不例外,重要的是要认识到这种倾向,以消除它对我们信念评估的偏见影响。当人们自称拥有一位大师/老师/领导者时,他们会觉得自己比没有大师/老师/领导的人处于优越位置,即使他们没有意识到这一点。
    • @user21820:感谢您的来信。请给我您的电子邮件地址或任何其他联系方式。我的是 alokmahor@gmail.com
    猜你喜欢
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2022-01-08
    • 2015-12-31
    • 2012-12-23
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多