Not: YouTube Content ID API, YouTube içerik iş ortaklarının kullanımı için tasarlanmıştır ve tüm geliştiriciler ya da tüm YouTube kullanıcıları tarafından kullanılamaz. YouTube Content ID API'yi Google API Konsolu'nda listelenen hizmetlerden biri olarak görmüyorsanız YouTube İş Ortağı Programı hakkında daha fazla bilgi edinmek için YouTube Yardım Merkezi'ni ziyaret edin.
Bu kod örneğinde, YouTube Content ID API kullanılarak nasıl reference
yükleneceği gösterilmektedir. reference
yüklemek için önce bir asset
oluşturmanız ve öğenin sahipliği ile eşleşme politikasını yapılandırmanız gerekir. Bu örnek, tüm bu adımlarda size yol gösterir.
Bu örnek, kodun ilgili bölümleriyle birlikte sürece dahil edilen bir dizi adım olarak sunulmaktadır. Komut dosyasının tamamını bu sayfanın sonunda bulabilirsiniz. Bu kod Python'da yazılmıştır. Diğer popüler programlama dilleri için istemci kitaplıkları da mevcuttur.
Örnek komut dosyası, hata işlemez.
Koşullar
- Python 2.5 veya sonraki sürümler
- google-api-python-client
Bu adımda, OAuth 2.0 yetkilendirmesini komut dosyasına dahil edeceğiz. Bu işlem, komut dosyasını çalıştıran kullanıcının, komut dosyasını kullanıcının hesabıyla ilişkilendirilen API isteklerini gerçekleştirmek üzere yetkilendirmesini sağlar.
client_secrets.json dosyası oluşturma
YouTube Content ID API'nin kimlik doğrulaması için API Konsolu'ndan alınan bilgileri içeren bir client_secrets.json
dosyası gerekir. Ayrıca uygulamanızı kaydetmeniz de gerekir. Kimlik doğrulamanın işleyiş şekliyle ilgili daha kapsamlı bir açıklama için kimlik doğrulama kılavuzuna göz atın.
{ "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" } }
Komut dosyanıza kimlik doğrulama kodu ekleyin
Kullanıcı kimlik doğrulamasını ve yetkilendirmeyi etkinleştirmek için aşağıdaki import
ifadelerini eklemeniz gerekir:
from oauth2client.file import Storage from oauth2client.client import flow_from_clientsecrets from oauth2client.tools import run
Ardından, 2a adımında yapılandırılan istemci gizli anahtarlarını kullanarak bir FLOW
nesnesi oluşturacağız. Kullanıcı, kullanıcı adına API istekleri göndermek üzere uygulamamıza yetki verirse sonuçta elde edilen kimlik bilgileri daha sonra kullanılmak üzere bir Storage
nesnesinde depolanır. Kimlik bilgilerinin geçerliliği sona ererse kullanıcının uygulamamızı yeniden yetkilendirmesi gerekir.
main
işlevinin sonuna aşağıdaki kodu ekleyin:
# 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
nesnesi oluştur ve kimlik bilgilerini ekle
Kullanıcı komut dosyamızı yetkilendirdikten sonra, API isteklerini işleyen bir httplib2.Http
nesnesi oluşturur ve yetkilendirme kimlik bilgilerini bu nesneye ekleriz.
Aşağıdaki import (içe aktarma) ifadesini ekleyin:
import httplib2
Ayrıca şu kodu main
işlevinin sonuna ekleyin:
# Create httplib2.Http object to handle HTTP requests and # attach auth credentials. http = httplib2.Http() http = credentials.authorize(http)
Hizmet alma
Başarılı bir yetkilendirmeden sonra kod, gerçekleştireceği işlemler için gerekli hizmetleri edinir. Önce tüm YouTube Content ID API hizmetlerine erişim sağlayan bir service
nesnesi oluşturur. Daha sonra kod, çağrı yaptığı kaynağa özel dört hizmeti elde etmek için service
nesnesini kullanır.
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()
Öğe oluşturun
reference
yüklemenin ilk adımı asset
oluşturmaktır. Öncelikle, yalnızca öğenin başlığını ayarlayan basit bir metadata
nesnesi oluştururuz. Daha sonra kod, bu nesneyi asset_body
öğesine ekler. Bu, aynı zamanda öğenin türünü de tanımlar. Ardından asset_body
nesnesi, asset_service.insert()
yöntemine giriş olarak kullanılır. Bu yöntem öğeyi oluşturur ve benzersiz kimliğini döndürür.
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
Sahipliği Güncelle
Komut dosyası, asset
oluşturulduktan sonra öğenin ownership
özelliğini yapılandırır. Bu örnek, içerik sahibinin öğenin% 100'üne sahip olduğunu ancak sahipliğin Polonya (PL
) ve Birleşik Krallık (GB
) ile sınırlı olduğunu göstermektedir.
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)
Öğenin eşleşme politikasını güncelleme
Referansı oluşturmadan önce, kodun öğeyle ilişkili assetMatchPolicy
kaynağını güncelleyerek öğenin eşleşme politikasını da yapılandırması gerekir. Öğenin eşleşme politikası, YouTube'daki bir videonun öğeyle ilişkilendirilmiş herhangi bir referansla eşleştiği tespit edildiğinde YouTube'un yapacağı işlemi belirler. Bu örnek, 10 saniyeden uzun eşleşmeleri dünya genelinde izleyen basit bir politika oluşturur.
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)
Referansı yükleyin
asset
, ownership
ve assetMatchPolicy
yerleştirildikten sonra, komut dosyası bir reference
yükler. Bu öğe, devam ettirilebilir yükleme özelliğinden yararlanabilmek için MediaFileUpload
yöntemini kullanır. reference_file
parametresinin, yüklenecek yerel dosyanın adını belirttiğini ve bu değerin, reference_file
komut satırı seçeneği kullanılarak komut dosyasına aktarıldığını unutmayın.
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__ = 'mateuszz+pub@google.com (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)