توجه: YouTube Content ID API برای استفاده شرکای محتوای YouTube در نظر گرفته شده است و برای همه توسعه دهندگان یا همه کاربران YouTube قابل دسترسی نیست. اگر API شناسه محتوای YouTube را بهعنوان یکی از سرویسهای فهرست شده در Google API Console نمیبینید، برای کسب اطلاعات بیشتر درباره YouTube Partner Program به مرکز راهنمایی YouTube مراجعه کنید.
این نمونه کد نحوه آپلود یک reference
با استفاده از YouTube Content ID API را نشان می دهد. برای آپلود یک reference
، ابتدا باید یک asset
ایجاد کنید و سیاست مالکیت و مطابقت دارایی را پیکربندی کنید. این مثال تمام این مراحل را طی می کند.
این مثال به صورت مجموعه ای از مراحل همراه با بخش های مربوطه کد ارائه شده است. شما می توانید کل اسکریپت را در انتهای این صفحه پیدا کنید. کد به زبان پایتون نوشته شده است. کتابخانه های سرویس گیرنده برای سایر زبان های برنامه نویسی محبوب نیز در دسترس هستند.
اسکریپت نمونه هیچ گونه رسیدگی به خطا را انجام نمی دهد.
الزامات
- پایتون 2.5 یا بالاتر
- google-api-python-client
در این مرحله، مجوز 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)