X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=youtube_dl%2Fextractor%2Fyouku.py;h=5c1f84a09021ffbd64d17ca7d4c6953c6b6e7d1c;hb=d800609c62703e4e6edd2891a8432306462e4db3;hp=b6129ecfad564ae5078a26ba0bb8a098a026f379;hpb=4d77550cf0d968344a6762c90496ffbe7528cbe7;p=youtube-dl diff --git a/youtube_dl/extractor/youku.py b/youtube_dl/extractor/youku.py index b6129ecfa..5c1f84a09 100644 --- a/youtube_dl/extractor/youku.py +++ b/youtube_dl/extractor/youku.py @@ -2,6 +2,9 @@ from __future__ import unicode_literals import base64 +import random +import string +import time from .common import InfoExtractor from ..compat import ( @@ -141,32 +144,38 @@ class YoukuIE(InfoExtractor): return video_urls_dict + @staticmethod + def get_ysuid(): + return '%d%s' % (int(time.time()), ''.join([ + random.choice(string.ascii_letters) for i in range(3)])) + def get_hd(self, fm): hd_id_dict = { - 'flv': '0', - 'mp4': '1', - 'hd2': '2', - 'hd3': '3', '3gp': '0', '3gphd': '1', + 'flv': '0', 'flvhd': '0', + 'mp4': '1', 'mp4hd': '1', - 'mp4hd2': '1' + 'mp4hd2': '1', + 'mp4hd3': '1', + 'hd2': '2', + 'hd3': '3', } return hd_id_dict[fm] def parse_ext_l(self, fm): ext_dict = { + '3gp': 'flv', + '3gphd': 'mp4', 'flv': 'flv', + 'flvhd': 'flv', 'mp4': 'mp4', 'mp4hd': 'mp4', 'mp4hd2': 'flv', 'mp4hd3': 'flv', 'hd2': 'flv', 'hd3': 'flv', - '3gp': 'flv', - '3gphd': 'mp4', - 'flvhd': 'flv' } return ext_dict[fm] @@ -174,20 +183,22 @@ class YoukuIE(InfoExtractor): _dict = { '3gp': 'h6', '3gphd': 'h5', - 'flvhd': 'h4', 'flv': 'h4', + 'flvhd': 'h4', 'mp4': 'h3', - 'hd2': 'h2', - 'hd3': 'h1', 'mp4hd': 'h3', + 'mp4hd2': 'h4', 'mp4hd3': 'h4', - 'mp4hd2': 'h4' + 'hd2': 'h2', + 'hd3': 'h1', } return _dict[fm] def _real_extract(self, url): video_id = self._match_id(url) + self._set_cookie('youku.com', '__ysuid', self.get_ysuid()) + def retrieve_data(req_url, note): headers = { 'Referer': req_url, @@ -203,16 +214,14 @@ class YoukuIE(InfoExtractor): return raw_data['data'] - video_password = self._downloader.params.get('videopassword', None) + video_password = self._downloader.params.get('videopassword') # request basic data basic_data_url = "http://play.youku.com/play/get.json?vid=%s&ct=12" % video_id if video_password: basic_data_url += '&pwd=%s' % video_password - data = retrieve_data( - basic_data_url, - 'Downloading JSON metadata 1') + data = retrieve_data(basic_data_url, 'Downloading JSON metadata') error = data.get('error') if error: @@ -220,9 +229,12 @@ class YoukuIE(InfoExtractor): if error_note is not None and '因版权原因无法观看此视频' in error_note: raise ExtractorError( 'Youku said: Sorry, this video is available in China only', expected=True) + elif error_note and '该视频被设为私密' in error_note: + raise ExtractorError( + 'Youku said: Sorry, this video is private', expected=True) else: msg = 'Youku server reported error %i' % error.get('code') - if error is not None: + if error_note is not None: msg += ': ' + error_note raise ExtractorError(msg)