X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=youtube_dl%2Fextractor%2Fyouku.py;h=5c1f84a09021ffbd64d17ca7d4c6953c6b6e7d1c;hb=d800609c62703e4e6edd2891a8432306462e4db3;hp=5110efcb43b37e2cd4f98bb41e9e257a1d097f93;hpb=7e37c394858ac215b02d1c4ea425d20a17bf4655;p=youtube-dl diff --git a/youtube_dl/extractor/youku.py b/youtube_dl/extractor/youku.py index 5110efcb4..5c1f84a09 100644 --- a/youtube_dl/extractor/youku.py +++ b/youtube_dl/extractor/youku.py @@ -2,7 +2,9 @@ from __future__ import unicode_literals import base64 -import json +import random +import string +import time from .common import InfoExtractor from ..compat import ( @@ -26,8 +28,8 @@ class YoukuIE(InfoExtractor): ''' _TESTS = [{ + # MD5 is unstable 'url': 'http://v.youku.com/v_show/id_XMTc1ODE5Njcy.html', - 'md5': '5f3af4192eabacc4501508d54a8cabd7', 'info_dict': { 'id': 'XMTc1ODE5Njcy_part1', 'title': '★Smile﹗♡ Git Fresh -Booty Music舞蹈.', @@ -43,6 +45,7 @@ class YoukuIE(InfoExtractor): 'title': '武媚娘传奇 85', }, 'playlist_count': 11, + 'skip': 'Available in China only', }, { 'url': 'http://v.youku.com/v_show/id_XMTI1OTczNDM5Mg==.html', 'info_dict': { @@ -50,7 +53,6 @@ class YoukuIE(InfoExtractor): 'title': '花千骨 04', }, 'playlist_count': 13, - 'skip': 'Available in China only', }, { 'url': 'http://v.youku.com/v_show/id_XNjA1NzA2Njgw.html', 'note': 'Video protected with password', @@ -88,10 +90,6 @@ class YoukuIE(InfoExtractor): # get oip oip = data['security']['ip'] - # get fileid - string_ls = list( - 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890') - fileid_dict = {} for stream in data['stream']: format = stream.get('stream_type') @@ -122,13 +120,11 @@ class YoukuIE(InfoExtractor): format = stream.get('stream_type') video_urls = [] for dt in stream['segs']: - #n = str(int(dt['size'])) n = str(stream['segs'].index(dt)) param = { 'K': dt['key'], 'hd': self.get_hd(format), 'myp': 0, - #'ts': dt['total_milliseconds_video'], 'ypp': 0, 'ctype': 12, 'ev': 1, @@ -139,7 +135,7 @@ class YoukuIE(InfoExtractor): video_url = \ 'http://k.youku.com/player/getFlvPath/' + \ 'sid/' + sid + \ - '_00'+ \ + '_00' + \ '/st/' + self.parse_ext_l(format) + \ '/fileid/' + get_fileid(format, n) + '?' + \ compat_urllib_parse.urlencode(param) @@ -148,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] @@ -181,49 +183,45 @@ 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) - def retrieve_data(req_url, note): - + self._set_cookie('youku.com', '__ysuid', self.get_ysuid()) + def retrieve_data(req_url, note): headers = { - 'Referer': req_url, - } - self._set_cookie('youku.com','xreferrer','http://www.youku.com') - req = sanitized_Request(req_url,headers=headers) + 'Referer': req_url, + } + self._set_cookie('youku.com', 'xreferrer', 'http://www.youku.com') + req = sanitized_Request(req_url, headers=headers) cn_verification_proxy = self._downloader.params.get('cn_verification_proxy') if cn_verification_proxy: req.add_header('Ytdl-request-proxy', cn_verification_proxy) raw_data = self._download_json(req, video_id, note=note) - js = json.dumps(raw_data) 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: @@ -231,16 +229,18 @@ 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) - #get video title + # get video title title = data['video']['title'] - # generate video_urls_dict video_urls_dict = self.construct_video_urls(data)