title: Google API OAuth - getting 401 (Unauthorized) when trying to upload to YouTube
body: <p>The last days I've been banging my head against the wall trying to upload a movie to YouTube using its official Python Wrapper lib.</p>
  
  <p>What I've succeeded till now:</p>
  
  <ul>
  <li>Building an Request Access URL</li>
  <li>Saving the returned OAuth Secret for a later use (getting the actual Access Token)</li>
  <li>Getting an Access Token and its coupled Secret. Stored them in a DB.</li>
  </ul>
  
  <p>What I'm trying without success:</p>
  
  <ul>
  <li>Preparing and uploading a video - this always get me a:
  <code>{'status': 401, 'body': 'Token invalid - Invalid AuthSub token.', 'reason': 'Unauthorized'}</code></li>
  </ul>
  
  <p>Below is a compilation of the relevant code blocks for the above:</p>
  
  <p><strong>Getting the Access Request URL</strong></p>
  
  <pre><code>def GetOAuthToken():
      callback_url = 'http://www.mysite.com/media_sites/oauth_access_token_callback/youtube'
      scope = 'http://gdata.youtube.com'
      secure = False
      session = True
  
      yt_service.developer_key = YOUTUBE_DEVELOPER_KEY
      yt_service.client_id = YOUTUBE_KEY
  
      yt_service.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)
  
      req_token = yt_service.FetchOAuthRequestToken(scopes=scope)
      print 'secret: %s' % req_token.secret
      yt_service.SetOAuthToken(req_token)    
      yt_service.SetOAuthToken(req_token)
      return yt_service.GenerateOAuthAuthorizationURL(callback_url=callback_url, )
  </code></pre>
  
  <p><strong>Getting the Access Token</strong></p>
  
  <pre><code>def handle_token():
      scope = 'http://gdata.youtube.com'
  
      yt_service = gdata.youtube.service.YouTubeService()
      yt_service.developer_key = YOUTUBE_DEVELOPER_KEY
      yt_service.client_id = YOUTUBE_KEY
  
      yt_service.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)
  
  
      oauth_token = gdata.auth.OAuthTokenFromUrl('http://www.mysite.com/media_sites/oauth_access_token_callback/youtube?oauth_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
      oauth_token.secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
      if oauth_token:
          oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)
          yt_service.SetOAuthToken(oauth_token)
          access_token = yt_service.UpgradeToOAuthAccessToken()
  </code></pre>
  
  <p><strong>Uploading The Video</strong></p>
  
  <pre><code>def upload_vid(access_token, access_token_secret):
      my_media_group = gdata.media.Group(
    title=gdata.media.Title(text='My Test Movie'),
    description=gdata.media.Description(description_type='plain',
                                        text='My description'),
    keywords=gdata.media.Keywords(text='cars, funny'),
    category=[gdata.media.Category(
        text='Autos',
        scheme='http://gdata.youtube.com/schemas/2007/categories.cat',
        label='Autos')],
    player=None
  )
  
  
      yt_service = gdata.youtube.service.YouTubeService()
      yt_service.developer_key = YOUTUBE_DEVELOPER_KEY
      yt_service.client_id = YOUTUBE_KEY
  
      yt_service.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)
  
      oauth_token = gdata.auth.OAuthToken(key=access_token, secret=access_token_secret, scopes='http://gdata.youtube.com')
      oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, YOUTUBE_KEY, consumer_secret=YOUTUBE_SECRET)
  
      yt_service.SetOAuthToken(oauth_token)
  
      where = gdata.geo.Where()
      where.set_location((37.0,-122.0))
  
      video_entry = gdata.youtube.YouTubeVideoEntry(media=my_media_group, geo=where)
  
      video_file_location = '/home/path/of/myfile.flv'
  
      new_entry = yt_service.InsertVideoEntry(video_entry, video_file_location)
  </code></pre>
  
  <p>So basically this gives me a 401 every time I try to upload a movie.
  Any help will be great!</p>