From 30272b737505086976b0db944c05a39c8a346d38 Mon Sep 17 00:00:00 2001 From: Mort Yao Date: Thu, 17 Mar 2016 03:00:47 +0100 Subject: [PATCH] [youku] fix #991 completely --- src/you_get/extractors/youku.py | 113 +++++++++++++------------------- 1 file changed, 46 insertions(+), 67 deletions(-) diff --git a/src/you_get/extractors/youku.py b/src/you_get/extractors/youku.py index 82fd6624..bc6e85e3 100644 --- a/src/you_get/extractors/youku.py +++ b/src/you_get/extractors/youku.py @@ -151,18 +151,12 @@ class Youku(VideoExtractor): exit(0) api_url = 'http://play.youku.com/play/get.json?vid=%s&ct=12' % self.vid - api_url1 = 'http://play.youku.com/play/get.json?vid=%s&ct=10' % self.vid try: meta = json.loads(get_content( api_url, headers={'Referer': 'http://static.youku.com/'} )) - meta1 = json.loads(get_content( - api_url1, - headers={'Referer': 'http://static.youku.com/'} - )) data = meta['data'] - data1 = meta1['data'] assert 'stream' in data except AssertionError: if 'error' in data: @@ -171,17 +165,11 @@ class Youku(VideoExtractor): self.password_protected = True self.password = input(log.sprint('Password: ', log.YELLOW)) api_url += '&pwd={}'.format(self.password) - api_url1 += '&pwd={}'.format(self.password) meta = json.loads(get_content( api_url, headers={'Referer': 'http://static.youku.com/'} )) - meta1 = json.loads(get_content( - api_url1, - headers={'Referer': 'http://static.youku.com/'} - )) data = meta['data'] - data1 = meta1['data'] else: log.wtf('[Failed] ' + data['error']['note']) else: @@ -196,33 +184,30 @@ class Youku(VideoExtractor): stream_types = dict([(i['id'], i) for i in self.stream_types]) self.streams_parameter = {} - self.streams_fallback_parameter = {} - audio_lang = data1['stream'][0]['audio_lang'] - for stream in data1['stream']: - stream_id = stream['stream_type'] - if stream_id in stream_types and stream['audio_lang'] == audio_lang: - if 'alias-of' in stream_types[stream_id]: - stream_id = stream_types[stream_id]['alias-of'] - if stream_id in self.streams: continue # STOP! - self.streams[stream_id] = { - 'container': stream_types[stream_id]['container'], - 'video_profile': stream_types[stream_id]['video_profile'], - 'size': stream['size'] - } - self.streams_parameter[stream_id] = { - 'fileid': stream['stream_fileid'], - 'segs': stream['segs'] - } + audio_lang = data['stream'][0]['audio_lang'] + for stream in data['stream']: stream_id = stream['stream_type'] if stream_id in stream_types and stream['audio_lang'] == audio_lang: if 'alias-of' in stream_types[stream_id]: stream_id = stream_types[stream_id]['alias-of'] - if stream_id in self.streams_fallback_parameter: continue # STOP! - self.streams_fallback_parameter[stream_id] = { - 'fileid': stream['stream_fileid'], - 'segs': stream['segs'] - } + + if stream_id not in self.streams: + self.streams[stream_id] = { + 'container': stream_types[stream_id]['container'], + 'video_profile': stream_types[stream_id]['video_profile'], + 'size': stream['size'], + 'pieces': [{ + 'fileid': stream['stream_fileid'], + 'segs': stream['segs'] + }] + } + else: + self.streams[stream_id]['size'] += stream['size'] + self.streams[stream_id]['pieces'].append({ + 'fileid': stream['stream_fileid'], + 'segs': stream['segs'] + }) # Audio languages if 'dvd' in data and 'audiolang' in data['dvd']: @@ -249,42 +234,36 @@ class Youku(VideoExtractor): ) sid, token = e_code.split('_') - sp = self.streams_parameter while True: try: - segs = sp[stream_id]['segs'] - streamfileid = sp[stream_id]['fileid'] - ksegs = [] - for no in range(0, len(segs)): - k = segs[no]['key'] - assert k != -1 - fileid, ep = self.__class__.generate_ep(no, streamfileid, - sid, token) - q = parse.urlencode(dict( - ctype = 12, - ev = 1, - K = k, - ep = parse.unquote(ep), - oip = str(self.ip), - token = token, - yxon = 1 - )) - u = 'http://k.youku.com/player/getFlvPath/sid/{sid}_00' \ - '/st/{container}/fileid/{fileid}?{q}'.format( - sid = sid, - container = self.streams[stream_id]['container'], - fileid = fileid, - q = q - ) - # unset_proxy() also strips cookies,because k.youku.com doesn't need cookies('r') for now - ksegs += [i['server'] for i in json.loads(get_content(u))] - except error.HTTPError as e: - # Use fallback stream data in case of HTTP 404 - log.e('[Error] ' + str(e)) - sp = self.streams_fallback_parameter - except KeyError: - # Move on to next stream if best quality not available + pieces = self.streams[stream_id]['pieces'] + for piece in pieces: + segs = piece['segs'] + streamfileid = piece['fileid'] + for no in range(0, len(segs)): + k = segs[no]['key'] + fileid, ep = self.__class__.generate_ep(no, streamfileid, + sid, token) + q = parse.urlencode(dict( + ctype = 12, + ev = 1, + K = k, + ep = parse.unquote(ep), + oip = str(self.ip), + token = token, + yxon = 1 + )) + u = 'http://k.youku.com/player/getFlvPath/sid/{sid}_00' \ + '/st/{container}/fileid/{fileid}?{q}'.format( + sid = sid, + container = self.streams[stream_id]['container'], + fileid = fileid, + q = q + ) + ksegs += [i['server'] for i in json.loads(get_content(u))] + except: + # Move on to next stream del self.streams_sorted[0] stream_id = self.streams_sorted[0]['id'] else: break