এই গাইড একটি Python স্ক্রিপ্ট প্রদান করে এবং ব্যাখ্যা করে যা YouTube Data API ব্যবহার করে YouTube ভিডিও আপলোড করে। কোডে Python-এর জন্য Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করা হয়েছে। (অন্যান্য জনপ্রিয় প্রোগ্রামিং ল্যাঙ্গুয়েজের জন্য ক্লায়েন্ট লাইব্রেরিও উপলভ্য আছে।)
মনে রাখবেন: স্যাম্পেল স্ক্রিপ্টে সমস্যা সমাধান করা হয় না।
প্রয়োজনীয়তা
-
Python 2.5 বা তার পরবর্তী ভার্সন
-
Python-এর জন্য Google API ক্লায়েন্ট লাইব্রেরি (
google-api-python-client) ইনস্টল করুন -
Google-এর সাথে আপনার অ্যাপ্লিকেশন রেজিস্টার করুন যাতে এটি ব্যবহারকারীর ডেটা অ্যাক্সেস করার অনুমতি দিতে OAuth 2.0 প্রোটোকল ব্যবহার করতে পারে।
-
এই স্ক্রিপ্টের সাথে OAuth 2.0 ধাপ ব্যবহার করতে, আপনাকে
client_secrets.jsonফাইল তৈরি করতে হবে যাতে Cloud console থেকে তথ্য থাকে। স্ক্রিপ্ট যে ডিরেক্টরিতে আছে, ফাইলটিও সেই ডিরেক্টরিতে থাকতে হবে।{ "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" } }
স্যাম্পেল অনুরোধ
এই অনুরোধের মাধ্যমে ভিডিও আপলোড করা হয় এবং ভিডিওর জন্য বিভিন্ন মেটাডেটা ফিল্ড সেট করা হয়, যার মধ্যে রয়েছে ভিডিওর নাম, বিবরণ, কীওয়ার্ড এবং বিভাগ। কমান্ড-লাইন আর্গুমেন্টগুলি নিম্নলিখিত বিভাগে বিস্তারিতভাবে বর্ণনা করা হয়েছে।
python upload_video.py --file="/tmp/test_video_file.flv"
--title="Summer vacation in California"
--description="Had fun surfing in Santa Cruz"
--keywords="surfing,Santa Cruz"
--category="22"
--privacyStatus="private"এই উদাহরণে, স্ক্রিপ্টটি ভিডিওর জন্য নিম্নলিখিত video রিসোর্স তৈরি ও যোগ করবে:
{
"snippet": {
"title": "Summer vacation in California",
"description": "Had fun surfing in Santa Cruz",
"tags": ["surfing", "Santa Cruz"],
"categoryId": "22"
},
"status": {
"privacyStatus": "private"
}
}স্ক্রিপ্ট কল করুন
নিচে দেওয়া তালিকা থেকে স্ক্রিপ্টের কমান্ড-লাইন আর্গুমেন্ট সম্পর্কে জানতে পারবেন:
-
file: এই আর্গুমেন্ট আপনার আপলোড করা ভিডিও ফাইলের লোকেশন শনাক্ত করে।Example: --file="/home/path/to/file.mov"
-
title: আপনি যে ভিডিও আপলোড করছেন সেটির নাম। ডিফল্ট মান হলTest title।Example: --title="Summer vacation in California"
-
description: আপনি যে ভিডিও আপলোড করছেন তার বিবরণ। ডিফল্ট ভ্যালু হলTest description।Example: --description="Had fun surfing in Santa Cruz"
-
category: ভিডিওর সাথে যুক্ত YouTube ভিডিও বিভাগের বিভাগ আইডি। ডিফল্ট ভ্যালু হল22, যাPeople & Blogsক্যাটাগরিকে বোঝায়।Example: --category="22"
-
keywords: ভিডিওর সাথে সম্পর্কিত কীওয়ার্ডের কমা-দ্বারা আলাদা করা তালিকা। ডিফল্ট মান হল খালি স্ট্রিং।Example: --keywords="surfing"
-
privacyStatus: ভিডিওর গোপনীয়তা স্ট্যাটাস। আপলোড করা ভিডিওর ডিফল্ট আচরণ হল সেটি সর্বজনীনভাবে দৃশ্যমান (public) হবে। টেস্ট ভিডিও আপলোড করার সময়, আপনি--privacyStatusআর্গুমেন্টের ভ্যালু নির্দিষ্ট করতে পারেন যাতে সেইসব ভিডিও ব্যক্তিগত বা তালিকাভুক্ত নেই হিসেবে সেট করা যায়। সঠিক ভ্যালু হলpublic,privateএবংunlisted।Example: --privacyStatus="private"
নমুনা কোড
upload_video.py স্ক্রিপ্টের জন্য সম্পূর্ণ ওয়ার্কিং স্যাম্পেল নিচে তালিকাভুক্ত করা হয়েছে:
#!/usr/bin/python import httplib import httplib2 import os import random import sys import time from apiclient.discovery import build from apiclient.errors import HttpError from apiclient.http import MediaFileUpload from oauth2client.client import flow_from_clientsecrets from oauth2client.file import Storage from oauth2client.tools import argparser, run_flow # Explicitly tell the underlying HTTP transport library not to retry, since # we are handling retry logic ourselves. httplib2.RETRIES = 1 # Maximum number of times to retry before giving up. MAX_RETRIES = 10 # Always retry when these exceptions are raised. RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, httplib.NotConnected, httplib.IncompleteRead, httplib.ImproperConnectionState, httplib.CannotSendRequest, httplib.CannotSendHeader, httplib.ResponseNotReady, httplib.BadStatusLine) # Always retry when an apiclient.errors.HttpError with one of these status # codes is raised. RETRIABLE_STATUS_CODES = [500, 502, 503, 504] # 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://console.cloud.google.com/. # 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 an application to upload files to the # authenticated user's YouTube channel, but doesn't allow other types of access. YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload" 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://console.cloud.google.com/ 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)) VALID_PRIVACY_STATUSES = ("public", "private", "unlisted") def get_authenticated_service(args): flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE, scope=YOUTUBE_UPLOAD_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())) def initialize_upload(youtube, options): tags = None if options.keywords: tags = options.keywords.split(",") body=dict( snippet=dict( title=options.title, description=options.description, tags=tags, categoryId=options.category ), status=dict( privacyStatus=options.privacyStatus ) ) # Call the API's videos.insert method to create and upload the video. insert_request = youtube.videos().insert( part=",".join(body.keys()), body=body, # The chunksize parameter specifies the size of each chunk of data, in # bytes, that will be uploaded at a time. Set a higher value for # reliable connections as fewer chunks lead to faster uploads. Set a lower # value for better recovery on less reliable connections. # # Setting "chunksize" equal to -1 in the code below means that the entire # file will be uploaded in a single HTTP request. (If the upload fails, # it will still be retried where it left off.) This is usually a best # practice, but if you're using Python older than 2.6 or if you're # running on App Engine, you should set the chunksize to something like # 1024 * 1024 (1 megabyte). media_body=MediaFileUpload(options.file, chunksize=-1, resumable=True) ) resumable_upload(insert_request) # This method implements an exponential backoff strategy to resume a # failed upload. def resumable_upload(insert_request): response = None error = None retry = 0 while response is None: try: print "Uploading file..." status, response = insert_request.next_chunk() if response is not None: if 'id' in response: print "Video id '%s' was successfully uploaded." % response['id'] else: exit("The upload failed with an unexpected response: %s" % response) except HttpError, e: if e.resp.status in RETRIABLE_STATUS_CODES: error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status, e.content) else: raise except RETRIABLE_EXCEPTIONS, e: error = "A retriable error occurred: %s" % e if error is not None: print error retry += 1 if retry > MAX_RETRIES: exit("No longer attempting to retry.") max_sleep = 2 ** retry sleep_seconds = random.random() * max_sleep print "Sleeping %f seconds and then retrying..." % sleep_seconds time.sleep(sleep_seconds) if __name__ == '__main__': argparser.add_argument("--file", required=True, help="Video file to upload") argparser.add_argument("--title", help="Video title", default="Test Title") argparser.add_argument("--description", help="Video description", default="Test Description") argparser.add_argument("--category", default="22", help="Numeric video category. " + "See https://developers.google.com/youtube/v3/docs/videoCategories/list") argparser.add_argument("--keywords", help="Video keywords, comma separated", default="") argparser.add_argument("--privacyStatus", choices=VALID_PRIVACY_STATUSES, default=VALID_PRIVACY_STATUSES[0], help="Video privacy status.") 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: initialize_upload(youtube, args) except HttpError, e: print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)
অতিরিক্ত রিসোর্স
-
Authentication নির্দেশিকা OAuth 2.0 প্রয়োগ করার জন্য সম্পূর্ণ বিবরণ প্রদান করে।
-
রেফারেন্স ডকুমেন্টেশনে video রিসোর্সের ফিল্ড ব্যাখ্যা করা আছে।