我正在使用 http://www.youtube.com/get_video_info?video_id= *VIDEO_ID* 并从我得到的数据中解析 url_encoded_fmt_stream_map 并得到像
http://blah.youtube.com/videoplayback?blah
早些时候我可以使用这个网址下载视频,但现在我无法再下载视频了。任何人都知道为什么?
我正在使用 http://www.youtube.com/get_video_info?video_id= *VIDEO_ID* 并从我得到的数据中解析 url_encoded_fmt_stream_map 并得到像
http://blah.youtube.com/videoplayback?blah
早些时候我可以使用这个网址下载视频,但现在我无法再下载视频了。任何人都知道为什么?
以下是返回视频网址的代码:
youtube-dl 的所有功劳我只复制了提取 url 所需的脚本部分
video_id = "yourvideoid"
for el_type in ['&el=embedded', '&el=detailpage', '&el=vevo', '']:
video_info_url = ('http://www.youtube.com/get_video_info?&video_id=%s%s& ps=default&eurl=&gl=US&hl=en'
% (video_id, el_type))
request = urllib2.Request(video_info_url)
try:
video_info_webpage = urllib2.urlopen(request).read()
video_info = parse_qs(video_info_webpage)
if 'token' in video_info:
break
except (urllib2.URLError, httplib.HTTPException, socket.error), err:
print('ERROR: unable to download video info webpage: %s' % str(err))
video_url_list = video_info['url_encoded_fmt_stream_map'][0]
url_data_strs = video_info['url_encoded_fmt_stream_map'][0].split(',')
url_data = [parse_qs(uds) for uds in url_data_strs]
url_data = filter(lambda ud: 'itag' in ud and 'url' in ud, url_data)
url_map = dict((ud['itag'][0], ud['url'][0] + '&signature=' + ud['sig'][0]) for ud in url_data)
print(str(url_map))
不知道为什么,但它似乎影响了所有下载器扩展,所以它几乎肯定在 YouTube 方面。我假设它与知识产权有关。YouTube“旨在”成为流媒体网站,而不是视频文件存储库。
addons.mozilla.com 的 Shutaro发现了一种解决方法,该解决方法需要强制 YouTube 恢复为提供较旧的 .webm 格式。
我遇到了同样的问题,据我从其他修复它的人那里了解到,我们需要向视频链接(返回的 mp4 或 3gp 链接)添加签名......我正在调查这个并将更新。如果你发现任何东西,我希望你也能这样做。