diff --git a/python/upload_thumbnail.py b/python/upload_thumbnail.py new file mode 100644 index 00000000..2c7b54c7 --- /dev/null +++ b/python/upload_thumbnail.py @@ -0,0 +1,91 @@ +#!/usr/bin/python + +import httplib2 +import os +import sys + +from apiclient.discovery import build +from apiclient.errors import HttpError +from oauth2client.client import flow_from_clientsecrets +from oauth2client.file import Storage +from oauth2client.tools import argparser, run_flow + + +# 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 Cloud Console }} at +# {{ https://cloud.google.com/console }}. +# Please ensure that you have enabled the YouTube Data API for your project. +# For more information about using OAuth2 to access the YouTube Data API, see: +# https://developers.google.com/youtube/v3/guides/authentication +# For more information about the client_secrets.json file format, see: +# https://developers.google.com/api-client-library/python/guide/aaa_client_secrets +CLIENT_SECRETS_FILE = "client_secrets.json" + +# This OAuth 2.0 access scope allows for full read/write access to the +# authenticated user's account. +YOUTUBE_READ_WRITE_SCOPE = "https://www.googleapis.com/auth/youtube" +YOUTUBE_API_SERVICE_NAME = "youtube" +YOUTUBE_API_VERSION = "v3" + +# This variable defines a 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 will need to populate the client_secrets.json file +found at: + + %s + +with information from the {{ Cloud Console }} +{{ https://cloud.google.com/console }} + +For more information about the client_secrets.json file format, please visit: +https://developers.google.com/api-client-library/python/guide/aaa_client_secrets +""" % os.path.abspath(os.path.join(os.path.dirname(__file__), + CLIENT_SECRETS_FILE)) + +def get_authenticated_service(args): + flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, + scope=YOUTUBE_READ_WRITE_SCOPE, + message=MISSING_CLIENT_SECRETS_MESSAGE) + + storage = Storage("%s-oauth2.json" % sys.argv[0]) + credentials = storage.get() + + if credentials is None or credentials.invalid: + credentials = run_flow(flow, storage, args) + + return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, + http=credentials.authorize(httplib2.Http())) + +# Call the API's thumbnails.set method to upload the thumbnail image and +# associate it with the appropriate video. +def upload_thumbnail(youtube, video_id, file): + youtube.thumbnails().set( + videoId=video_id, + media_body=file + ).execute() + +if __name__ == "__main__": + # The "videoid" option specifies the YouTube video ID that uniquely + # identifies the video for which the thumbnail image is being updated. + argparser.add_argument("--video-id", required=True, + help="ID of video whose thumbnail you're updating.") + # The "file" option specifies the path to the thumbnail image file. + argparser.add_argument("--file", required=True, + help="Path to thumbnail image file.") + args = argparser.parse_args() + + if not os.path.exists(args.file): + exit("Please specify a valid file using the --file= parameter.") + + youtube = get_authenticated_service(args) + try: + upload_thumbnail(youtube, args.video_id, args.file) + except HttpError, e: + print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content) + else: + print "The custom thumbnail was successfully set."