Fetch OAuth Authenticated YouTube API Version 2.0 Requests with GData-Python-Client, Including Insight

We’ve been using Google’s GData-Python-Client library to connect our VidCaster client accounts to YouTube, which allows for neat operations like importing* and exporting of video.

A key component of VidCaster is to provide simple aggregated video analytics to our users, which means we need to import YouTube Insight data.

The general YouTube 2.0 API supports downloading of this Insight data if the request is authenticated on the behalf of the user that owns this video. Per the documentation, you can obtain a link to a CSV video analytics report for an individual clip by requesting a video entry while authenticated on behalf of the user. In Google’s words:

A video entry contains a link to an Insight data feed if the authenticated user retrieving the entry owns the video.

Unfortunately, this is a GData 2.0 API call and the current Python-GData-Client library only supports 1.0 API calls for YouTube, through the deprecated service class, instead of the 2.0 API client class.

The question: How to access this YouTube 2.0 API data using the current version of the GData-Python-Client library? We’ve already gone through the trouble of integrating OAuth for our users, and we’d rather not write a full OAuth query implementation, nor rewrite the GData-Python-Client library.

The answer: We can use a rather generic authenticated 2.0 request to fetch raw queries and process the XML response ourselves.

While we can’t use the developer-friendly feed-specific queries like yt_service.GetYouTubeVideoFeed() from the 1.0 API, we can still make the request and retrieve a response while authenticated which allows us to get the valuable Insight data.

Below is the basic code, note that you’ll have to implement OAuth before using this solution:

import gdata.gauth
import gdata.youtube.client
import gdata.youtube.service
from gdata.gauth import OAuthHmacToken

# Our code to fetch site settings and individual OAuth credentials
from django.conf import settings
from myproject.credentials.models import Credential

CONSUMER_KEY = settings.GOOGLE_CONSUMER_KEY
CONSUMER_SECRET = settings.GOOGLE_CONSUMER_SECRET
YOUTUBE_DEVELOPER_KEY = settings.YOUTUBE_DEVELOPER_KEY
SCOPES = ['http://gdata.youtube.com']

# Fetch token and token_secret per your existing OAuth implementation
credential = Credential.objects.get(pk=1)
token = credential.token
token_secret = credential.token_secret

yt_service = gdata.youtube.client.YouTubeClient(source='MyCompany-MyApp-v1')
yt_service.developer_key = YOUTUBE_DEVELOPER_KEY

oauth_token = OAuthHmacToken(consumer_key=CONSUMER_KEY, consumer_secret=CONSUMER_SECRET, token=token, token_secret=token_secret, auth_state=gdata.gauth.ACCESS_TOKEN)

feed = yt_service.get_feed(uri="http://gdata.youtube.com/feeds/api/users/default/uploads/?v=2", auth_token=oauth_token)

# Great, now you have a feed that includes links to the Insight CSV files!
# I'll leave pagination and parsing XML as an exercise for the reader.

Goods:

  • It works.
  • No modification of existing gdata-python-client library needed, also saves you from needing to write a raw oauth signed query to obtain this data.

Bads:

  • Returns raw XML response, you’ll have to parse this yourself.
  • Not a standard way of implementing a signed OAuth request in V2.0, these functions are normally performed by fancy client class methods on your behalf.
  • In theory this code shouldn’t break even with future releases, but there will be a better way of performing this request when the gdata-python-client maintainer(s) update the library.
  • Very frustrating: The Insight data returned in these CSV files only has the last 7-days of statistics for a given video. This is an artificial limitation enforced by their proprietary security token passed in the generated link. There’s a bit of discussion about this limitation here. Take a second and “star” the feature request to unlock this additional data.

*Downloading videos from YouTube is not officially supported in the API. Youtube-dl.py is the best solution I’ve found as a workaround. It’s well maintained and Python based.

Advertisements
This entry was posted in tech, work and tagged , , , , , , , , , , , , , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s