Nota:l'API YouTube Content ID è destinata ai partner per i contenuti di YouTube e non è accessibile a tutti gli sviluppatori o a tutti gli utenti di YouTube. Se non visualizzi l'API YouTube Content ID tra i servizi elencati nella console API di Google, visita il Centro assistenza YouTube per scoprire di più sul Programma partner di YouTube.
Questo esempio di codice mostra come caricare un reference
utilizzando l'API YouTube Content ID. Per caricare un reference
, devi prima creare un asset
e configurare la proprietà e la norma di corrispondenza della risorsa. Questo esempio illustra in dettaglio tutti questi passaggi.
Questo esempio viene presentato come la serie di passaggi coinvolti e le sezioni pertinenti del codice. Puoi trovare l'intero script alla fine di questa pagina. Il codice è scritto in Python. Sono inoltre disponibili librerie client per altri linguaggi di programmazione popolari.
Lo script di esempio non esegue alcuna gestione degli errori.
Requisiti
- Python 2.5 o superiore
- google-api-python-client
In questo passaggio, incorporeremo l'autorizzazione OAuth 2.0 nello script. Ciò consente all'utente che esegue lo script di autorizzare lo script a eseguire richieste API attribuite all'account dell'utente.
Crea un file client_secrets.json
L'API YouTube Content ID richiede un file client_secrets.json
, che contiene informazioni della console API, per eseguire l'autenticazione. Devi anche registrare la tua applicazione. Per una spiegazione più completa di come funziona l'autenticazione, consulta la guida all'autenticazione.
{ "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" } }
Aggiungi il codice di autenticazione allo script
Per attivare l'autenticazione e l'autorizzazione degli utenti, devi aggiungere le seguenti istruzioni import
:
from oauth2client.file import Storage from oauth2client.client import flow_from_clientsecrets from oauth2client.tools import run
A questo punto, creeremo un oggetto FLOW
utilizzando i client secret configurati nel passaggio 2a. Se l'utente autorizza la nostra applicazione a inviare richieste API per conto dell'utente, le credenziali risultanti vengono memorizzate in un oggetto Storage
per essere utilizzate in un secondo momento. Se le credenziali scadono, l'utente dovrà autorizzare di nuovo la nostra applicazione.
Aggiungi il seguente codice alla fine della funzione 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)
Crea l'oggetto httplib2
e collega le credenziali
Dopo che l'utente autorizza il nostro script, creiamo un oggetto httplib2.Http
, che gestisce le richieste API, e colleghiamo le credenziali di autorizzazione all'oggetto.
Aggiungi la seguente istruzione di importazione:
import httplib2
Aggiungi questo codice alla fine della funzione main
:
# Create httplib2.Http object to handle HTTP requests and # attach auth credentials. http = httplib2.Http() http = credentials.authorize(http)
Ottenere i servizi
Dopo aver ottenuto l'autorizzazione, il codice ottiene i servizi necessari per le operazioni che eseguirà. Innanzitutto crea un oggetto service
che fornisce l'accesso a tutti i servizi dell'API YouTube Content ID. Il codice utilizza quindi l'oggetto service
per ottenere i quattro servizi specifici delle risorse che chiama.
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()
Crea un asset
Il primo passaggio per caricare un reference
è creare il asset
. Per prima cosa creiamo un semplice oggetto metadata
che imposta solo il titolo della risorsa. Il codice aggiunge poi quell'oggetto a asset_body
, identificando anche il tipo di asset. L'oggetto asset_body
, a sua volta, viene utilizzato come input per il metodo asset_service.insert()
. Questo metodo crea l'asset e restituisce il suo ID univoco.
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
Aggiorna la proprietà
Dopo aver creato asset
, lo script configura il ownership
dell'asset. Questo esempio indica che il proprietario dei contenuti possiede il 100% della risorsa, ma che la proprietà è limitata ai seguenti paesi: Polonia (PL
) e Gran Bretagna (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)
Aggiornare la norma di corrispondenza della risorsa
Prima di creare il riferimento, il codice deve anche configurare la norma di corrispondenza della risorsa aggiornando la risorsa assetMatchPolicy
associata all'asset. La norma di corrispondenza della risorsa determina l'azione che YouTube intraprenderà quando un video su YouTube trova una corrispondenza con qualsiasi riferimento associato alla risorsa. In questo esempio viene creata una semplice norma che monitora a livello mondiale qualsiasi corrispondenza più lunga di 10 secondi.
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)
Carica il riferimento
Dopo aver configurato asset
, ownership
e assetMatchPolicy
, lo script carica un reference
. Utilizza il metodo MediaFileUpload
in modo da poter usufruire del caricamento ripristinabile. Tieni presente che il parametro reference_file
specifica il nome di un file locale da caricare e che questo valore viene trasmesso allo script utilizzando l'opzione della riga di comando 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)