Youtube Data API for handling videos | Set-3

Prerequisite: Youtube Data API for handling videos | Set-1, Set-2

Before proceeding further, first see how to get a list of valid Video Categories, to determine in which category to put a video. For the example we have used the “IN” value for the regionCode parameter. You can use any other value. Only categoryId’s that have assignable parameter as value “True” can be used in the video insertion or updation.

Let’s discuss how to insert a video in authorized user’s account youtube account.

Find Valid Video Categories:

filter_none

edit
close

play_arrow

link
brightness_4
code

# importing library
from apiclient.discovery import build
  
# Arguments that need to passed
# to the build function
DEVELOPER_KEY = "API_key" 
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
  
# creating Youtube Resource Object
youtube_object = build(YOUTUBE_API_SERVICE_NAME, 
                            YOUTUBE_API_VERSION,
                   developerKey = DEVELOPER_KEY)
      
def youtube_video_categories():
      
    # calling the videoCategory.list method
    # to retrieve youtube video categories result
    video_category = youtube_object.videoCategories(
       ).list(part ='snippet', regionCode ='IN').execute()
      
    # extracting the results
    # from video_category response
    results = video_category.get("items", [])
  
    # empty list to store video category metadata
    videos_categories = []
      
    # extracting required info
    # from each result object
    for result in results:
          
        # video_categories result object
        videos_categories.append("% s, (% s % s)"
                   %(result["id"],
                   result["snippet"]["title"],
                   result["snippet"]["assignable"]))
  
    print ("Video_Category_Id Catgeory_Name     Assignable :\n",
                          "\n".join(videos_categories), "\n")
      
if __name__ == "__main__":
    youtube_video_categories()

chevron_right


Output:



Since inserting a video in authorized user’s account requires user’s authorization so we will be creating OAuth type of credential for this example. Follow the steps below to generate a Client Id and a Secret Key.

  1. Go to Google Google Developers Console and Click on Sign In in the upper rightmost corner of the page. Sign In using the credentials of the valid Google Account. If you don’t have a google account, setup an account first and then use the details to Sign In on the Google Developers Homepage.
  2. Now navigate to the Developer Dashboard and create a new Project.
  3. Click on Enable API option.
  4. In the search field, search for Youtube Data API and select the Youtube Data API option that comes in the drop down list.
  5. You will be redirected to a screen that says information about the Youtube Data API, along with two options : ENABLE and TRY API.
  6. Click on ENABLE option to get started with the API.
  7. In the sidebar under APIs & Services, select Credentials.
  8. At the top of the page, select the OAuth consent screen tab. Select an Email address, enter a Product name if not already set, and click the Save button.
  9. In the Credentials tab, select the Create credentials drop-down list, and choose OAuth Client Id. OAuth is generally used where authorization is required like in the case of retrieving liked videos of a user.
  10. Select the application type Other, enter the name “YouTube Data API Myvideos”, and click the Create button.
  11. Click OK.
  12. Click on Download button to the right of the client Id to download the JSON file.
  13. Save and rename the file as client_secret.json and move it to the working directory.

Install additional libraries using the pip command:

pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2

We have downloaded a sample video- Learn ABC to show how upload works. The id, snippet.title and snippet.categoryId are the mandatory properties, all other are optional.

Insert a video: This example shows how to upload a video to the authorized user’s account. Video upload is governed by following constraints:

  1. File can take maximum size of 128MB
  2. Acceptable Media MIME Types are only video/*, application/octet-stream
filter_none

edit
close

play_arrow

link
brightness_4
code

# importing necessary libraries
import os
import urllib.request, urllib.parse, urllib.error
import http.client
import urllib.request
import urllib.error
import http.client
import httplib2
import random
import time
import google.oauth2.credentials
import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
from apiclient.http import MediaFileUpload
  
# The CLIENT_SECRETS_FILE variable 
# specifies the name of a file that 
# contains client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"
  
# This scope allows for full read /
# write access to the authenticated
# user's account and requires requests
# to use an SSL connection.
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
  
def get_authenticated_service():
flow = InstalledAppFlow.from_client_secrets_file(
                     CLIENT_SECRETS_FILE, SCOPES)
                      
credentials = flow.run_console()
return build(API_SERVICE_NAME, API_VERSION,
                credentials = credentials)
  
# Here we are telling HTTP Transport
# Library not to retry the video upload.
httplib2.RETRIES = 1
  
# MAX_RETRIES specifies the maximum number
# of retries that can done before giving up.
MAX_RETRIES = 10
  
# Always retry when these exceptions are raised.
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError,
                        http.client.NotConnected,
                        http.client.IncompleteRead,
                        http.client.ImproperConnectionState,
                        http.client.CannotSendRequest,
                        http.client.CannotSendHeader,
                        http.client.ResponseNotReady,
                        http.client.BadStatusLine)
  
# Always retry when an apiclient.errors.HttpError
# with one of these status codes is raised.
RETRIABLE_STATUS_CODES = [500, 502, 503, 504]
  
# This method implements an exponential
# backoff strategy to resume a failed upload.
def resumable_upload(request, resource, method):
response = None
error = None
retry = 0
  
while response is None:
    try:
          
    print("Uploading the file...")
    status, response = request.next_chunk()
      
    if response is not None:
          
        if method == 'insert' and 'id' in response:
            print(response)
        elif method != 'insert' or 'id' not in response:
            print(response)
        else:
            exit("The file upload failed with an\
            unexpected response: % s" % response)
              
    except HttpError as 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 as 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)
      
def print_response(response):
    print(response)
  
# Build a resource based on a list of 
# properties given as key-value pairs.
# Leave properties with empty values
# out of the inserted resource.
def build_resource(properties):
      
    resource = {}
    for p in properties:
          
        # Given a key like "snippet.title", split into
        # "snippet" and "title", where
        # "snippet" will be an object and "title"
        # will be a property in that object.
        prop_array = p.split('.')
        ref = resource
        for pa in range(0, len(prop_array)):
        is_array = False
        key = prop_array[pa]
      
        # For properties that have array values,
        # convert a name like "snippet.tags[]" to 
        # snippet.tags, and set a flag to handle
        # the value as an array.
        if key[-2:] == '[]':
            key = key[0:len(key)-2:]
            is_array = True
      
        if pa == (len(prop_array) - 1):
              
            # Leave properties without values
            # out of inserted resource.
            if properties[p]:
                if is_array:
                    ref[key] = properties[p].split(', ')
                else:
                    ref[key] = properties[p]
                      
        elif key not in ref:
            # For example, the property is "snippet.title",
            # but the resource does not yet have a "snippet" 
            # object. Create the snippet object here.
            # Setting "ref = ref[key]" means that in the
            # next time through the "for pa in range ..." loop,
            # we will be setting a property in the
            # resource's "snippet" object.
            ref[key] = {}
            ref = ref[key]
        else:
            # For example, the property is "snippet.description",
            # and the resource already has a "snippet" object.
            ref = ref[key]
    return resource
  
# Remove keyword arguments that are not set
def remove_empty_kwargs(**kwargs):
    good_kwargs = {}
      
    if kwargs is not None:
        for key, value in list(kwargs.items()):
            if value:
                good_kwargs[key] = value
    return good_kwargs
  
def videos_insert(client, properties, media_file, **kwargs):
    resource = build_resource(properties) 
    kwargs = remove_empty_kwargs(**kwargs) 
    request = client.videos().insert(body = resource,
               media_body = MediaFileUpload(media_file,
         chunksize =-1, resumable = True), **kwargs)
      
      
    return resumable_upload(request, 'video', 'insert')
  
  
if __name__ == '__main__':
      
    # When running locally, disable OAuthlib's
    # HTTPs verification. When running in production
    # * do not * leave this option enabled.
    os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
    client = get_authenticated_service()
    media_file = 'videoplayback.3gp'
      
    if not os.path.exists(media_file):
        exit('Please specify the complete valid file location.')
      
    videos_insert(client, 
        {'snippet.categoryId': '27',
        'snippet.defaultLanguage': '',
        'snippet.description': 'Sample Leran ABC Video',
        'snippet.tags[]': '',
        'snippet.title': 'Sample Test video upload',
        'status.embeddable': '',
        'status.license': '',
        'status.privacyStatus': 'private',
        'status.publicStatsViewable': ''},
        media_file,
        part ='snippet, status')

chevron_right


Output:

When executing the code it will ask for the authorization code. For getting the code you need to follow the link mentioned in the command prompt screen above the line: Enter the Authorization code.

Now follow the link and copy paste the authorization code that you will get by granting the permission.

Now as you can see from used account, it show the video is uploaded.

References:



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.