404 when getting private YouTube video even when logged in with the owner's account using gdata-python-client
If a YouTube video is set as private and I try to fetch it using the gdata Python API a 404 RequestError is raised, even though I have done a programmatic login with the account that owns that video:
from gdata.youtube import service
yt_service = service.YouTubeService(email=my_email,
password=my_password,
client_id=my_client_id,
source=my_source,
developer_key=my_developer_key)
yt_service.ProgrammaticLogin()
yt_service.GetYouTubeVideoEntry(video_id='IcVqemzfyYs')
---------------------------------------------------------------------------
RequestError Traceback (most recent call last)
<ipython console>
/usr/lib/python2.4/site-packages/gdata/youtube/service.pyc in GetYouTubeVideoEntry(self, uri, video_id)
203 elif video_id and not uri:
204 uri = '%s/%s' % (YOUTUBE_VIDEO_URI, video_id)
--> 205 return self.Get(uri, converter=gdata.youtube.YouTubeVideoEntryFromString)
206
207 def GetYouTubeContactFeed(self, uri=None, username='default'):
/usr/lib/python2.4/site-packages/gdata/service.pyc in Get(self, uri, extra_headers, redirects_remaining, encoding, converter)
1100 'body': result_body}
1101 else:
-> 1102 raise RequestError, {'status': server_response.status,
1103 'reason': server_response.reason, 'body': result_body}
11开发者_如何学JAVA04
RequestError: {'status': 404, 'body': 'Video not found', 'reason': 'Not Found'}
This happens every time, unless I go into my YouTube account (through the YouTube website) and set it public, after that I can set it as private and back to public using the Python API.
Am I missing a step or is there another (or any) way to fetch a YouTube video set as private from the API?
Thanks in advance.
Apparently the YouTube Data API doesn't allow this (yet), so to workaround this I use the GetYouTubeUserFeed method of a YouTubeService instance to obtain a list of all the video entries I need (whether they are private or public):
from gdata.youtube import service
VIDEO_ID = 'IcVqemzfyYs'
yt_service = service.YouTubeService(email=my_email,
password=my_password,
client_id=my_client_id,
source=my_source,
developer_key=my_developer_key)
yt_service.ProgrammaticLogin()
userfeed = yt_service.GetYouTubeUserFeed(username=my_email[:my_email.index('@')])
video_entry = reduce(lambda e1, e2: e1 if e1.id.text.endswith(VIDEO_ENTRY) else (e2 if e2.id.text.endswith(VIDEO_ENTRY) else None),
userfeed.entry)
Hope this helps anyone having the same problem :)
精彩评论