Mengupload Referensi Baru

Catatan: YouTube Content ID API ditujukan untuk digunakan oleh partner konten YouTube dan tidak dapat diakses oleh semua developer atau pengguna YouTube. Jika Anda tidak melihat YouTube Content ID API sebagai salah satu layanan yang tercantum di Konsol API Google, lihat Pusat Bantuan YouTube untuk mempelajari Program Partner YouTube lebih lanjut.

Contoh kode ini menunjukkan cara mengupload reference menggunakan YouTube Content ID API. Untuk mengupload reference, Anda harus membuat asset terlebih dahulu, lalu mengonfigurasi kepemilikan dan kebijakan kecocokan aset. Contoh ini memandu semua langkah berikut.

Contoh ini disajikan sebagai serangkaian langkah yang disertakan bersama dengan bagian kode yang relevan. Anda dapat menemukan seluruh skrip di akhir halaman ini. Kode ini ditulis di Python. Library klien untuk bahasa pemrograman populer lainnya juga tersedia.

Skrip contoh tidak melakukan penanganan error apa pun.

Persyaratan

Pada langkah ini, kami akan menerapkan otorisasi OAuth 2.0 ke dalam skrip. Hal ini memungkinkan pengguna yang menjalankan skrip untuk memberikan otorisasi pada skrip agar dapat melakukan permintaan API yang diatribusikan ke akun pengguna.

Membuat file client_secrets.json

YouTube Content ID API memerlukan file client_secrets.json, yang berisi informasi dari Konsol API, untuk melakukan autentikasi. Anda juga harus mendaftarkan aplikasi Anda. Untuk penjelasan yang lebih lengkap tentang cara kerja autentikasi, lihat panduan autentikasi.

 {
  "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"
  }
}

Menambahkan kode autentikasi ke skrip

Untuk mengaktifkan autentikasi dan otorisasi pengguna, Anda perlu menambahkan pernyataan import berikut:

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

Selanjutnya, kita akan membuat objek FLOW menggunakan rahasia klien yang dikonfigurasi di langkah 2a. Jika pengguna mengizinkan aplikasi kita untuk mengirimkan permintaan API atas nama pengguna, kredensial yang dihasilkan akan disimpan dalam objek Storage untuk digunakan nanti. Pengguna perlu memberikan otorisasi ulang ke aplikasi kita jika masa berlaku kredensial berakhir.

Tambahkan kode berikut ke bagian akhir fungsi 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)

Buat objek httplib2 dan lampirkan kredensial

Setelah pengguna memberikan otorisasi pada skrip, kita akan membuat objek httplib2.Http, yang menangani permintaan API, dan melampirkan kredensial otorisasi ke objek tersebut.

Tambahkan pernyataan import berikut:

  import httplib2

Dan tambahkan kode ini ke bagian akhir fungsi main:

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

Mendapatkan layanan

Setelah otorisasi berhasil, kode mendapatkan layanan yang diperlukan untuk operasi yang akan dilakukannya. Tindakan ini terlebih dahulu membuat objek service yang memberikan akses ke semua layanan YouTube Content ID API. Kode kemudian menggunakan objek service untuk mendapatkan empat layanan khusus resource yang dipanggilnya.

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()

Membuat Aset

Langkah pertama dalam mengupload reference adalah membuat asset. Pertama, kita membuat objek metadata sederhana yang hanya menetapkan judul aset. Kode tersebut kemudian menambahkan objek tersebut ke asset_body, yang juga mengidentifikasi jenis aset. Objek asset_body kemudian akan digunakan sebagai input untuk metode asset_service.insert(). Metode tersebut akan membuat aset dan menampilkan ID uniknya.

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

Perbarui Kepemilikan

Setelah membuat asset, skrip akan mengonfigurasi ownership aset. Contoh ini menunjukkan bahwa pemilik konten memiliki 100% aset, tetapi kepemilikan tersebut terbatas untuk Polandia (PL) dan Britania Raya (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)

Memperbarui kebijakan kecocokan aset

Sebelum membuat referensi, kode juga harus mengonfigurasi kebijakan kecocokan aset dengan memperbarui resource assetMatchPolicy yang terkait dengan aset. Kebijakan kecocokan aset menentukan tindakan yang akan diambil YouTube saat video di YouTube ditemukan cocok dengan referensi apa pun yang terkait dengan aset tersebut. Contoh ini membuat kebijakan sederhana yang melacak setiap kecocokan di seluruh dunia yang berdurasi lebih dari 10 detik.

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)

Upload Referensi

Setelah asset, ownership, dan assetMatchPolicy diterapkan, skrip akan mengupload reference. Class tersebut menggunakan metode MediaFileUpload sehingga dapat memanfaatkan upload yang dapat dilanjutkan. Perhatikan bahwa parameter reference_file menentukan nama file lokal yang akan diupload, dan nilai tersebut diteruskan ke skrip menggunakan opsi 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__ = '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)