بارگذاری یک مرجع جدید

توجه: YouTube Content ID API برای استفاده شرکای محتوای YouTube در نظر گرفته شده است و برای همه توسعه دهندگان یا همه کاربران YouTube قابل دسترسی نیست. اگر API شناسه محتوای YouTube را به‌عنوان یکی از سرویس‌های فهرست شده در Google API Console نمی‌بینید، برای کسب اطلاعات بیشتر درباره YouTube Partner Program به مرکز راهنمایی YouTube مراجعه کنید.

این نمونه کد نحوه آپلود یک reference با استفاده از YouTube Content ID API را نشان می دهد. برای آپلود یک reference ، ابتدا باید یک asset ایجاد کنید و سیاست مالکیت و مطابقت دارایی را پیکربندی کنید. این مثال تمام این مراحل را طی می کند.

این مثال به صورت مجموعه ای از مراحل همراه با بخش های مربوطه کد ارائه شده است. شما می توانید کل اسکریپت را در انتهای این صفحه پیدا کنید. کد به زبان پایتون نوشته شده است. کتابخانه های سرویس گیرنده برای سایر زبان های برنامه نویسی محبوب نیز در دسترس هستند.

اسکریپت نمونه هیچ گونه رسیدگی به خطا را انجام نمی دهد.

الزامات

در این مرحله، مجوز OAuth 2.0 را در اسکریپت قرار می دهیم. این به کاربر در حال اجرا اسکریپت را قادر می‌سازد تا به اسکریپت اجازه دهد تا درخواست‌های API منتسب به حساب کاربر را انجام دهد.

یک فایل client_secrets.json ایجاد کنید

API شناسه محتوای YouTube برای احراز هویت به فایل client_secrets.json نیاز دارد که حاوی اطلاعاتی از کنسول API است. همچنین باید درخواست خود را ثبت کنید . برای توضیح کامل تر در مورد نحوه عملکرد احراز هویت، راهنمای احراز هویت را ببینید.

 {
  "web": {
    "client_id": "INSERT CLIENT ID HERE",
    "client_secret": "INSERT CLIENT SECRET HERE",
    "redirect_uris": [],
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token"
  }
}

کد احراز هویت را به اسکریپت خود اضافه کنید

برای فعال کردن احراز هویت و مجوز کاربر، باید عبارات import زیر را اضافه کنید:

from oauth2client.file import Storage
from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import run

در مرحله بعد، یک شی FLOW با استفاده از رمزهای سرویس گیرنده پیکربندی شده در مرحله 2a ایجاد می کنیم. اگر کاربر به برنامه ما اجازه دهد درخواست‌های API را از طرف کاربر ارسال کند، اعتبارنامه‌های حاصل در یک شی Storage برای استفاده بعدی ذخیره می‌شوند. اگر اعتبارنامه منقضی شود، کاربر باید مجدداً مجوز برنامه ما را صادر کند.

کد زیر را به انتهای تابع main اضافه کنید:

  # Set up a Flow object to be used if we need to authenticate.
  FLOW = flow_from_clientsecrets('client_secrets.json',
      scope='https://www.googleapis.com/auth/youtubepartner',
      message='error message')

  # The Storage object stores the credentials. If it doesn't exist, or if
  # the credentials are invalid or expired, run through the native client flow.
  storage = Storage('yt_partner_api.dat')
  credentials = storage.get()
  
  if (credentials is None or credentials.invalid or
      credentials.token_expiry <= datetime.now()):
    credentials = run(FLOW, storage)

شی httplib2 ایجاد کنید و اعتبارنامه ها را پیوست کنید

پس از اینکه کاربر اسکریپت ما را تأیید کرد، یک شی httplib2.Http ایجاد می کنیم که درخواست های API را مدیریت می کند و اعتبار مجوز را به آن شی متصل می کنیم.

عبارت import زیر را اضافه کنید:

  import httplib2

و این کد را به انتهای تابع main اضافه کنید:

  # Create httplib2.Http object to handle HTTP requests and
  # attach auth credentials.
  http = httplib2.Http()
  http = credentials.authorize(http)

خدمات را دریافت کنید

پس از تأیید موفقیت آمیز، کد خدمات لازم را برای عملیاتی که انجام خواهد داد دریافت می کند. ابتدا یک شیء service ایجاد می کند که دسترسی به تمام سرویس های API شناسه محتوای YouTube را فراهم می کند. سپس کد از شیء service برای بدست آوردن چهار سرویس خاص منبعی که فراخوانی می کند استفاده می کند.

from apiclient.discovery import build

# ...

service = build("youtubePartner", "v1", http=http, static_discovery=False)
# ...
asset_service = service.assets()
# ...
ownership_service = service.ownership()
# ...
match_policy_service = service.assetMatchPolicy()
# ...
reference_service = service.references()

یک دارایی ایجاد کنید

اولین مرحله در آپلود یک reference ، ایجاد asset است. ابتدا یک شیء metadata ساده ایجاد می کنیم که فقط عنوان دارایی را تعیین می کند. سپس کد آن شی را به asset_body اضافه می کند که نوع دارایی را نیز مشخص می کند. شی asset_body به نوبه خود به عنوان ورودی متد asset_service.insert() استفاده می شود. آن روش دارایی را ایجاد می کند و شناسه منحصر به فرد آن را برمی گرداند.

def _create_asset(service, title, metadata_type):
  metadata = {'title': title}
  asset_body = {'metadata': metadata, 'type': metadata_type}
  # Retrieve asset service.
  asset_service = service.assets()

  # Create and execute insert request.
  request = asset_service.insert(body=asset_body)
  response = request.execute()
  logger.info('Asset has been created.\n%s', response)
  asset_id = response['id']
  return asset_id

مالکیت را به روز کنید

پس از ایجاد asset ، اسکریپت ownership دارایی را پیکربندی می کند. این مثال نشان می‌دهد که مالک محتوا 100٪ دارایی را در اختیار دارد، اما این مالکیت محدود به لهستان ( PL ) و بریتانیای کبیر ( GB ) است.

def _create_asset_ownership(service, asset_id, owner_name):
  ownership = {
      'owner': owner_name,
      'ratio' : 100,
      'type': 'include',
      'territories': ['PL', 'GB']}
  ownership_body = {'general': [ownership]}
  ownership_service = service.ownership()

  request = ownership_service.update(assetId=asset_id, body=ownership_body)
  response = request.execute()
  logger.info('Asset ownership has been created.\n%s', response)

خط مشی مطابقت دارایی را به روز کنید

قبل از ایجاد مرجع، کد باید با به روز رسانی منبع assetMatchPolicy مرتبط با دارایی، خط مشی مطابقت دارایی را نیز پیکربندی کند. خط‌مشی تطابق دارایی نشان می‌دهد که وقتی ویدیویی در YouTube مطابق با هر مرجع مرتبط با آن دارایی است، YouTube انجام دهد. این مثال یک خط‌مشی ساده ایجاد می‌کند که هر مسابقه را در سراسر جهان بیش از 10 ثانیه ردیابی می‌کند.

def _create_match_policy(service, asset_id):
  match_policy_service = service.assetMatchPolicy()
  everywhere_policy_condition = {
      'requiredTerritories': {
          'type': 'exclude', 'territories': []},
      'requiredReferenceDuration': [{'low': 10}],
      'contentMatchType': 'video'}
  track_everywhere_rule = {
      'action': 'track',
      'condition': everywhere_policy_condition}
  request = match_policy_service.update(
      assetId=asset_id,
      body={
        'name': 'Track Everywhere 10s.',
        'description': 'Track Everywhere matches longer than 10s.',
        'rules': [track_everywhere_rule]})
  response = request.execute()
  logger.info('Asset match policy has been created.\n%s', response)

مرجع را آپلود کنید

هنگامی که asset ، ownership و assetMatchPolicy قرار گرفتند، اسکریپت یک reference آپلود می کند. از روش MediaFileUpload استفاده می کند تا بتواند از مزیت بارگذاری مجدد استفاده کند. توجه داشته باشید که پارامتر reference_file نام یک فایل محلی برای آپلود را مشخص می کند و این مقدار با استفاده از گزینه command-line reference_file به اسکریپت ارسال می شود.

def _create_reference(service, asset_id, reference_file):
  reference_service = service.reference()
  media = MediaFileUpload(reference_file, resumable=True)
  request = reference_service.insert(
      body={'assetId': asset_id, 'contentType': 'video'},
      media_body=media)
  status, response = request.next_chunk()
  while response is None:
    status, response = request.next_chunk()
    if status:
      logger.info("Uploaded %d%%.", int(status.progress() * 100))
  logger.info('Reference has been created.\n%s', response)
    

Full code sample

The complete working sample asset_reference_upload_example.py is listed below:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2012 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Simple command-line sample for Youtube partner API.

Command-line application that creates asset, asset ownership, match policy
and reference.

Usage:
  $ python asset_reference_upload_example.py --reference_file=REFERENCE_FILE \
      --asset_title=ASSET_TITLE --owner=OWNER

You can also get help on all the command-line flags the program understands
by running:

  $ python asset_reference_upload_example.py --help
"""

__author__ = '[email protected] (Mateusz Zięba)'

import httplib2
import logging
import sys
import optparse
import os

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

# 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 API Console at
# https://console.cloud.google.com/.
# See the "Registering your application" instructions for an explanation
# of how to find these values:
# https://developers.google.com/youtube/partner/guides/registering_an_application
CLIENT_SECRETS = 'client_secrets.json'

# 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 need to populate the client_secrets.json
file found at:

%s

with information from the API Console
<https://console.cloud.google.com/>.

""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)

# Set up a Flow object to be used if we need to authenticate.
FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
           scope='https://www.googleapis.com/auth/youtubepartner',
           message=MISSING_CLIENT_SECRETS_MESSAGE)

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())


def _create_asset(service, title, metadata_type):
  metadata = {'title': title}
  asset_body = {'metadata': metadata, 'type': metadata_type}
  # Retrieve asset service.
  asset_service = service.assets()

  # Create and execute insert request.
  request = asset_service.insert(body=asset_body)
  response = request.execute()
  logger.info('Asset has been created.\n%s', response)
  asset_id = response['id']
  return asset_id


def _create_asset_ownership(service, asset_id, owner_name):
  ownership = {
      'owner': owner_name,
      'ratio' : 100,
      'type': 'include',
      'territories': ['PL', 'GB']}
  ownership_body = {'general': [ownership]}
  ownership_service = service.ownership()

  request = ownership_service.update(assetId=asset_id, body=ownership_body)
  response = request.execute()
  logger.info('Asset ownership has been created.\n%s', response)


def _create_match_policy(service, asset_id):
  match_policy_service = service.assetMatchPolicy()
  everywhere_policy_condition = {
      'requiredTerritories': {
          'type': 'exclude', 'territories': []},
      'requiredReferenceDuration': [{'low': 10}],
      'contentMatchType': 'video'}
  track_everywhere_rule = {
      'action': 'track',
      'condition': everywhere_policy_condition}
  request = match_policy_service.update(
      assetId=asset_id,
      body={
        'name': 'Track Everywhere 10s.',
        'description': 'Track Everywhere matches longer than 10s.',
        'rules': [track_everywhere_rule]})
  response = request.execute()
  logger.info('Asset match policy has been created.\n%s', response)


def _create_reference(service, asset_id, reference_file):
  reference_service = service.references()
  media = MediaFileUpload(reference_file, resumable=True)
  request = reference_service.insert(
      body={'assetId': asset_id, 'contentType': 'video'},
      media_body=media)
  status, response = request.next_chunk()
  while response is None:
    status, response = request.next_chunk()
    if status:
      logger.info("Uploaded %d%%.", int(status.progress() * 100))
  logger.info('Reference has been created.\n%s', response)


def _parse_options():
  parser = optparse.OptionParser(
      description='Creates asset, asset ownership, match policy and reference.')
  parser.add_option('--version',
                    default='v1',
                    type=str, help='API version.')
  parser.add_option('--reference_file', type=str,
                    help='File containing reference to be uploaded. Required')
  parser.add_option('--asset_title',
                    type=str, help='Asset title. Required')
  parser.add_option('--owner',
                    type=str, help='Content owner name. Required')
  (options, args) = parser.parse_args()

  if not options.reference_file:
    parser.error("--reference_file is required")
  if not options.asset_title:
    parser.error("--asset_title is required")
  if not options.owner:
    parser.error("--owner is required")
  return options


def main(argv):
  options = _parse_options()
  # If the Credentials don't exist or are invalid run through the native client
  # flow. The Storage object ensures that if successful the good
  # Credentials are written back to a file.
  storage = Storage('yt_partner_api.dat')
  credentials = storage.get()
  if credentials is None or credentials.invalid:
    credentials = run(FLOW, storage)

  # Create an httplib2.Http object to handle our HTTP requests and authorize it
  # with our good Credentials.
  http = httplib2.Http()
  http = credentials.authorize(http)

  service = build("youtubePartner", options.version, http=http, static_discovery=False)

  try:
    asset_id = _create_asset(service, options.asset_title, 'web')
    _create_asset_ownership(service, asset_id, options.owner)
    _create_match_policy(service, asset_id)
    _create_reference(service, asset_id, options.reference_file)

  except AccessTokenRefreshError:
    logger.info("The credentials have been revoked or expired, please re-run"
      " the application to re-authorize")

if __name__ == '__main__':
  main(sys.argv)