From 61f22e8f4b3eef599ebd50f1c483d1928aa6defd Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Tue, 4 Jul 2017 13:42:20 +0800 Subject: [PATCH 01/25] fix from https://github.com/soimort/you-get/pull/2015 --- addon.py | 148 ++++++++++--------------------------------------------- 1 file changed, 26 insertions(+), 122 deletions(-) diff --git a/addon.py b/addon.py index f33b139..0267f6f 100644 --- a/addon.py +++ b/addon.py @@ -1869,92 +1869,6 @@ def getSetting(self,key,default=None): return setting == 'true' return setting -class youkuDecoder: - def __init__( self ): - return - - def getFileIDMixString(self,seed): - mixed = [] - source = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/\:._-1234567890") - seed = float(seed) - for i in range(len(source)): - seed = (seed * 211 + 30031 ) % 65536 - index = math.floor(seed /65536 *len(source)) - mixed.append(source[int(index)]) - source.remove(source[int(index)]) - return mixed - - def getFileId(self,fileId,seed): - mixed = self.getFileIDMixString(seed) - ids = fileId.split('*') - realId = [] - for i in range(0,len(ids)-1): - realId.append(mixed[int(ids[i])]) - return ''.join(realId) - - def trans_e(self, a, c): - b = range(256) - f = 0 - result = '' - h = 0 - while h < 256: - f = (f + b[h] + ord(a[h % len(a)])) % 256 - b[h], b[f] = b[f], b[h] - h += 1 - q = f = h = 0 - while q < len(c): - h = (h + 1) % 256 - f = (f + b[h]) % 256 - b[h], b[f] = b[f], b[h] - if isinstance(c[q], int): - result += chr(c[q] ^ b[(b[h] + b[f]) % 256]) - else: - result += chr(ord(c[q]) ^ b[(b[h] + b[f]) % 256]) - q += 1 - return result - - def trans_f(self, a, c): - """ - :argument a: list - :param c: - :return: - """ - b = [] - for f in range(len(a)): - i = ord(a[f][0]) - 97 if "a" <= a[f] <= "z" else int(a[f]) + 26 - e = 0 - while e < 36: - if c[e] == i: - i = e - break - e += 1 - v = i - 26 if i > 25 else chr(i + 97) - b.append(str(v)) - return ''.join(b) - - f_code_1 = 'becaf9be' - f_code_2 = 'bf7e5f01' - - def _calc_ep(self, sid, fileId, token): - ep = self.trans_e(self.f_code_2, '%s_%s_%s' % (sid, fileId, token)) - return base64.b64encode(ep) - - def _calc_ep2(self, vid, ep): - e_code = self.trans_e(self.f_code_1, base64.b64decode(ep)) - sid, token = e_code.split('_') - new_ep = self.trans_e(self.f_code_2, '%s_%s_%s' % (sid, vid, token)) - return base64.b64encode(new_ep), token, sid - - def get_sid(self, ep): - e_code = self.trans_e(self.f_code_1, base64.b64decode(ep)) - return e_code.split('_') - - def generate_ep(self, no, fileid, sid, token): - ep = urllib.quote(self._calc_ep(sid, fileid, token).encode('latin1'), - safe="~()*!.'" - ) - return ep - def getNumber(data, k): try: s = data[k] @@ -2005,10 +1919,21 @@ def getProperty(item, key): return value +def fetch_cna(): + url = 'http://gm.mmstat.com/yt/ykcomment.play.commentInit?cna=' + req = urllib2.urlopen(url) + return req.headers['Set-Cookie'].split(';')[0].split('=')[1] + +def youku_ups(vid, ccode='0401'): + url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) + url += '&client_ip=192.168.1.1' + url += '&utid=' + fetch_cna() + url += '&client_ts=' + str(int(time.time())) + return json.loads(GetHttpData(url)) + def play(vid, playContinue=False): readSettings() - playid = vid try: ret = eval(cache.get('history')) @@ -2040,15 +1965,12 @@ def play(vid, playContinue=False): xbmc.executebuiltin("ActivateWindow(busydialog)") try: - movinfo = json.loads(GetHttpData('http://play.youku.com/play/get.json?vid=%s&ct=12' % playid).replace('\r\n','')) - movdat = movinfo['data'] - movinfo = json.loads(GetHttpData('http://play.youku.com/play/get.json?vid=%s&ct=10' % playid).replace('\r\n','')) - movdat1 = movinfo['data'] + movdat = youku_ups(vid, '0401')['data'] assert 'stream' in movdat - assert 'stream' in movdat1 - except: + except Exception, e: + log(e) xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') + xbmcgui.Dialog().ok('提示框', '解析地址异常0,无法播放') return #Select resolution. @@ -2058,7 +1980,7 @@ def play(vid, playContinue=False): try: for i in range(settings['resolution'], len(settings_data['resolution'])): for t in settings_data['resolution_type'][i]: - for s in movdat1['stream'][::-1]: + for s in movdat['stream'][::-1]: if settings['language'] == 0 or language_code == s['audio_lang'] or s['audio_lang'] == 'default': if t == s['stream_type']: stream = s @@ -2070,12 +1992,12 @@ def play(vid, playContinue=False): break except: xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') + xbmcgui.Dialog().ok('提示框', '解析地址异常2,无法播放') return if not stream.has_key('stream_type'): xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') + xbmcgui.Dialog().ok('提示框', '解析地址异常3,无法播放') return @@ -2084,34 +2006,16 @@ def play(vid, playContinue=False): urls = [] segs = stream['segs'] - oip = movdat['security']['ip'] - ep = movdat['security']['encrypt_string'] - sid, token = youkuDecoder().get_sid(ep) - for no in range(len(segs)): k = segs[no]['key'] assert k != -1 - fileid = stream['segs'][no]['fileid'] - ep = youkuDecoder().generate_ep(no, fileid, sid, token) - q = urllib.urlencode(dict( - ctype = 12, - ev = 1, - K = k, - ep = urllib.unquote(ep), - oip = oip, - token = token, - yxon = 1 - )) - u = 'http://k.youku.com/player/getFlvPath/sid/{sid}_00/st/{container}/fileid/{fileid}?{q}'.format( - sid = sid, - container = resolution_map[resolution], - fileid = fileid, - q = q - ) - urls += [i['server'] for i in json.loads(GetHttpData(u))] + urls.append(segs[no]["cdn_url"]) playlist = xbmc.PlayList(1) playlist.clear() + title = movdat['video']['title'] + listitem=xbmcgui.ListItem(title) + listitem.setInfo(type="Video",infoLabels={"Title":title}) if settings_data['play_type'][settings['play']] == 'concatenate' and resolution_map[resolution] == 'flv': vc.start(urls) @@ -2121,10 +2025,10 @@ def play(vid, playContinue=False): listitem.setInfo(type="Video", infoLabels={"Title":movdat['video']['title']}) playlist.add('http://127.0.0.1:%d' % port, listitem) elif settings_data['play_type'][settings['play']] == 'list': + _title = u"%s - 第 %s/%s 节" for i in range(len(urls)): - title =movdat['video']['title'] + u" - 第"+str(i+1)+"/"+str(len(urls)) + u"节" - listitem=xbmcgui.ListItem(title) - listitem.setInfo(type="Video",infoLabels={"Title":title}) + listitem = xbmcgui.ListItem(_title % (title, i+1, len(urls))) + listitem.setInfo(type="Video", infoLabels={"Title": _title}) playlist.add(urls[i], listitem) else: playurl = 'stack://' + ' , '.join(urls) From cba4abbc8454591c1dc94cf0ea88e252de758483 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Tue, 4 Jul 2017 14:00:43 +0800 Subject: [PATCH 02/25] fix playlist title --- addon.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon.py b/addon.py index 0267f6f..f17158b 100644 --- a/addon.py +++ b/addon.py @@ -2025,9 +2025,9 @@ def play(vid, playContinue=False): listitem.setInfo(type="Video", infoLabels={"Title":movdat['video']['title']}) playlist.add('http://127.0.0.1:%d' % port, listitem) elif settings_data['play_type'][settings['play']] == 'list': - _title = u"%s - 第 %s/%s 节" for i in range(len(urls)): - listitem = xbmcgui.ListItem(_title % (title, i+1, len(urls))) + _title = u"%s - 第 %s/%s 节" % (title, i+1, len(urls)) + listitem = xbmcgui.ListItem(_title) listitem.setInfo(type="Video", infoLabels={"Title": _title}) playlist.add(urls[i], listitem) else: From 53c996f4cce4c5c1a326875f4f7d5c48ccbd69e3 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Tue, 8 Aug 2017 01:01:45 +0800 Subject: [PATCH 03/25] add referer from https://github.com/soimort/you-get/commit/6c0e4b796397a2b2ca2f26bbb865c03cce59b99a --- addon.py | 10 ++++++++-- addon.xml | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index f17158b..c964e4d 100644 --- a/addon.py +++ b/addon.py @@ -9,6 +9,8 @@ except: import storageserverdummy as StorageServer +import requests + __addonid__ = "plugin.video.youkutv" __addon__ = xbmcaddon.Addon(id=__addonid__) __cwd__ = __addon__.getAddonInfo('path') @@ -1924,12 +1926,16 @@ def fetch_cna(): req = urllib2.urlopen(url) return req.headers['Set-Cookie'].split(';')[0].split('=')[1] -def youku_ups(vid, ccode='0401'): +def youku_ups(vid, ccode='0401', referer='http://v.youku.com'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) url += '&client_ip=192.168.1.1' url += '&utid=' + fetch_cna() url += '&client_ts=' + str(int(time.time())) - return json.loads(GetHttpData(url)) + # return json.loads(GetHttpData(url)) + headers = {'Referer': referer, + 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36' + } + return requests.get(url, headers=headers).json() def play(vid, playContinue=False): diff --git a/addon.xml b/addon.xml index 18ffe00..436a8c3 100644 --- a/addon.xml +++ b/addon.xml @@ -1,7 +1,8 @@  - + + video From d76a100f23339f884d1d3fd1c76c2357c25461ab Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Sun, 10 Sep 2017 13:43:28 +0800 Subject: [PATCH 04/25] fix User-Agent --- addon.py | 2 +- addon.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addon.py b/addon.py index c964e4d..21421b7 100644 --- a/addon.py +++ b/addon.py @@ -1933,7 +1933,7 @@ def youku_ups(vid, ccode='0401', referer='http://v.youku.com'): url += '&client_ts=' + str(int(time.time())) # return json.loads(GetHttpData(url)) headers = {'Referer': referer, - 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36' + 'User-Agent':'Mozilla/5.0 (iPad; CPU OS 10_1_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B100' } return requests.get(url, headers=headers).json() diff --git a/addon.xml b/addon.xml index 436a8c3..a14d10c 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From 5c321d569e97e0cbb4e74b78520b489ac4f2bfcb Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Sun, 10 Sep 2017 23:51:46 +0800 Subject: [PATCH 05/25] change ip to cdn --- addon.py | 20 +++++++++++++++++--- addon.xml | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/addon.py b/addon.py index 21421b7..fc5f4ae 100644 --- a/addon.py +++ b/addon.py @@ -2,7 +2,7 @@ # default.py import xbmcgui, xbmcaddon, xbmc -import json, sys, urllib, urllib2, gzip, StringIO, re, os, time, threading, socket, base64, math, cookielib +import json, sys, urllib, urllib2, urlparse, gzip, StringIO, re, os, time, threading, socket, cookielib from video_concatenate import video_concatenate try: import StorageServer @@ -1933,10 +1933,23 @@ def youku_ups(vid, ccode='0401', referer='http://v.youku.com'): url += '&client_ts=' + str(int(time.time())) # return json.loads(GetHttpData(url)) headers = {'Referer': referer, - 'User-Agent':'Mozilla/5.0 (iPad; CPU OS 10_1_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B100' + 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36' } return requests.get(url, headers=headers).json() +def change_cdn(url, dispatcher_url='vali.cp31.ott.cibntv.net'): + # if the cnd_url starts with an ip addr, it should be youku's old CDN + # which rejects http requests randomly with status code > 400 + # change it to the dispatcher of aliCDN can do better + # at least a little more recoverable from HTTP 403 + if dispatcher_url in url: + return url + elif 'k.youku.com' in url: + return url + else: + url_seg_list = list(urlparse.urlparse(url)) + url_seg_list[1] = dispatcher_url + return urlparse.urlunparse(url_seg_list) def play(vid, playContinue=False): readSettings() @@ -2015,7 +2028,8 @@ def play(vid, playContinue=False): for no in range(len(segs)): k = segs[no]['key'] assert k != -1 - urls.append(segs[no]["cdn_url"]) + url = segs[no]["cdn_url"] + urls.append(change_cdn(url)) playlist = xbmc.PlayList(1) playlist.clear() diff --git a/addon.xml b/addon.xml index a14d10c..5e37d92 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From 53aad5389c9595bafbd55d21d231abcf48e2a094 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Mon, 11 Sep 2017 22:26:27 +0800 Subject: [PATCH 06/25] sleep 3s, before ups --- addon.py | 1 + addon.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addon.py b/addon.py index fc5f4ae..78816dd 100644 --- a/addon.py +++ b/addon.py @@ -1935,6 +1935,7 @@ def youku_ups(vid, ccode='0401', referer='http://v.youku.com'): headers = {'Referer': referer, 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36' } + time.sleep(3) return requests.get(url, headers=headers).json() def change_cdn(url, dispatcher_url='vali.cp31.ott.cibntv.net'): diff --git a/addon.xml b/addon.xml index 5e37d92..a57cd74 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From 32d5b038ab79698a9177d7fce5e622243c366aaf Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Tue, 12 Sep 2017 21:30:50 +0800 Subject: [PATCH 07/25] quote cna --- addon.py | 9 ++++++--- addon.xml | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/addon.py b/addon.py index 78816dd..9a4eb47 100644 --- a/addon.py +++ b/addon.py @@ -1922,9 +1922,12 @@ def getProperty(item, key): return value def fetch_cna(): - url = 'http://gm.mmstat.com/yt/ykcomment.play.commentInit?cna=' - req = urllib2.urlopen(url) - return req.headers['Set-Cookie'].split(';')[0].split('=')[1] + url = 'http://log.mmstat.com/eg.js' + req = requests.get(url) + cna = req.headers['Set-Cookie'].split(';')[0].split('=')[1] + if '%' not in cna: + cna = requests.compat.quote(cna) + return cna def youku_ups(vid, ccode='0401', referer='http://v.youku.com'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) diff --git a/addon.xml b/addon.xml index a57cd74..2db3c6b 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From d10609dc620e3efe23611c0204eb9e61d1813503 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Tue, 12 Sep 2017 21:58:53 +0800 Subject: [PATCH 08/25] clean up --- addon.py | 36 +++++++----------------------------- addon.xml | 2 +- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/addon.py b/addon.py index 9a4eb47..2a68d47 100644 --- a/addon.py +++ b/addon.py @@ -2,7 +2,7 @@ # default.py import xbmcgui, xbmcaddon, xbmc -import json, sys, urllib, urllib2, urlparse, gzip, StringIO, re, os, time, threading, socket, cookielib +import json, sys, urllib, urlparse, os, time, threading, socket from video_concatenate import video_concatenate try: import StorageServer @@ -28,6 +28,10 @@ HOST = 'http://tv.api.3g.youku.com/' IDS = 'pid=0ce22bfd5ef5d2c5&guid=12d60728bd267e3e0b6ab4d124d6c5f0&ngdid=357e71ee78debf7340d29408b88c85c4&ver=2.6.0&operator=T-Mobile_310260&network=WIFI&launcher=0' +headers = {'Referer': 'http://v.youku.com', + 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36', +} + #Fixed tabs Navigation = ['首页', '频道', '排行'] ContentID = [520, 560, 580] @@ -1929,15 +1933,11 @@ def fetch_cna(): cna = requests.compat.quote(cna) return cna -def youku_ups(vid, ccode='0401', referer='http://v.youku.com'): +def youku_ups(vid, ccode='0401'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) url += '&client_ip=192.168.1.1' url += '&utid=' + fetch_cna() url += '&client_ts=' + str(int(time.time())) - # return json.loads(GetHttpData(url)) - headers = {'Referer': referer, - 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36' - } time.sleep(3) return requests.get(url, headers=headers).json() @@ -2126,25 +2126,7 @@ def openWindow(window_name,session=None,**kwargs): def GetHttpData(url): log('Frech: ' + url) try: - req = urllib2.Request(url) - req.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) {0}{1}'. - format('AppleWebKit/537.36 (KHTML, like Gecko) ', - 'Chrome/28.0.1500.71 Safari/537.36')) - req.add_header('Accept-encoding', 'gzip') - if (url.find('play.youku.com') != -1): - req.add_header('referer', 'http://static.youku.com') - response = urllib2.urlopen(req) - httpdata = response.read() - if response.headers.get('content-encoding', None) == 'gzip': - httpdata = gzip.GzipFile(fileobj=StringIO.StringIO(httpdata)).read() - response.close() - match = re.compile('encodingt=(.+?)"').findall(httpdata) - if len(match)<=0: - match = re.compile('meta charset="(.+?)"').findall(httpdata) - if len(match)>0: - charset = match[0].lower() - if (charset != 'utf-8') and (charset != 'utf8'): - httpdata = unicode(httpdata, charset).encode('utf8') + httpdata = requests.get(url, headers=headers).content except: if xbmcgui.Dialog().yesno('错误', '网络超时,是否继续?'): return GetHttpData(url) @@ -2207,8 +2189,4 @@ def clearFavor(): openWindow('mysettings') except: if __name__ == '__main__': - cj = cookielib.CookieJar() - opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) - opener.addheaders = [('Cookie', '__ysuid={0}'.format(time.time()))] - urllib2.install_opener(opener) openWindow('main') diff --git a/addon.xml b/addon.xml index 2db3c6b..cc9d3c6 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From fcc8a9af1a29a4effd3918539054875677e60c3d Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Tue, 14 Nov 2017 23:47:32 +0800 Subject: [PATCH 09/25] add user-agent & referer for player download video --- addon.py | 10 +++++++++- addon.xml | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/addon.py b/addon.py index 2a68d47..2badc59 100644 --- a/addon.py +++ b/addon.py @@ -1955,6 +1955,12 @@ def change_cdn(url, dispatcher_url='vali.cp31.ott.cibntv.net'): url_seg_list[1] = dispatcher_url return urlparse.urlunparse(url_seg_list) +def add_headers(url): + # http://kodi.wiki/view/HTTP + param = '&'.join(['%s=%s' % (k, headers[k]) for k in headers]) + return '%s|%s' % (url, param) + + def play(vid, playContinue=False): readSettings() @@ -2033,7 +2039,9 @@ def play(vid, playContinue=False): k = segs[no]['key'] assert k != -1 url = segs[no]["cdn_url"] - urls.append(change_cdn(url)) + url = change_cdn(url) + url = add_headers(url) + urls.append(url) playlist = xbmc.PlayList(1) playlist.clear() diff --git a/addon.xml b/addon.xml index cc9d3c6..8b709f4 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From 2211370faa45a9dc779e7a169cc3ec7df336a81b Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Wed, 15 Nov 2017 14:07:02 +0800 Subject: [PATCH 10/25] rm debug info --- addon.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addon.py b/addon.py index 2badc59..893a6b2 100644 --- a/addon.py +++ b/addon.py @@ -1999,7 +1999,7 @@ def play(vid, playContinue=False): except Exception, e: log(e) xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常0,无法播放') + xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') return #Select resolution. @@ -2021,12 +2021,12 @@ def play(vid, playContinue=False): break except: xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常2,无法播放') + xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') return if not stream.has_key('stream_type'): xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常3,无法播放') + xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') return From 8542beade31edfb2b4b33d5a49ceffefab2f50e4 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Sun, 19 Nov 2017 21:49:13 +0800 Subject: [PATCH 11/25] add new 720p alias mp4hd2v2 --- addon.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon.py b/addon.py index 893a6b2..7b4678a 100644 --- a/addon.py +++ b/addon.py @@ -48,7 +48,7 @@ {'title': '观看记录', 'image': 'yk_history.jpg', 'mtype': 'history'}, {'title': '收藏', 'image': 'yk_favor.jpg', 'mtype': 'favor'}] settings_data = {'resolution':[u'1080P', u'超清', u'高清', u'标清', u'标清(3GP)'], - 'resolution_type':[['hd3','mp4hd3'], ['hd2','mp4hd2'], ['mp4','mp4hd'], ['flv','flvhd'], ['3gphd']], + 'resolution_type':[['hd3','mp4hd3'], ['hd2','mp4hd2', 'mp4hd2v2'], ['mp4','mp4hd'], ['flv','flvhd'], ['3gphd']], 'language':[u'默认', u'国语', u'粤语', u'英语'], 'language_code':[u'', u'guoyu', u'yue', u'yingyu'], 'play':['整合(试验阶段)', '分段', '堆叠'], @@ -60,7 +60,7 @@ 'mp4': 'mp4', 'mp4hd': 'mp4', 'hd2': 'flv', - 'mp4hd2': 'flv', + 'mp4hd2v2': 'flv', 'hd3': 'flv', 'mp4hd3': 'flv'} From 3ed614bb1c016cc2dae56bbd01b22b1f2655ea48 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Sun, 19 Nov 2017 21:50:04 +0800 Subject: [PATCH 12/25] update version to 1.7.16 --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 8b709f4..65be880 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From a9c0103922cc887608b73ad59545b31c932fd244 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Thu, 23 Nov 2017 23:06:24 +0800 Subject: [PATCH 13/25] change code form 0401 to 0406 --- addon.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon.py b/addon.py index 7b4678a..2bfa26a 100644 --- a/addon.py +++ b/addon.py @@ -1933,7 +1933,7 @@ def fetch_cna(): cna = requests.compat.quote(cna) return cna -def youku_ups(vid, ccode='0401'): +def youku_ups(vid, ccode='0406'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) url += '&client_ip=192.168.1.1' url += '&utid=' + fetch_cna() @@ -1994,7 +1994,7 @@ def play(vid, playContinue=False): xbmc.executebuiltin("ActivateWindow(busydialog)") try: - movdat = youku_ups(vid, '0401')['data'] + movdat = youku_ups(vid, '0406')['data'] assert 'stream' in movdat except Exception, e: log(e) From a3dcf0fa22bff38a992e0e6bbf3562df9f21898d Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Thu, 23 Nov 2017 23:08:51 +0800 Subject: [PATCH 14/25] upgrade to 1.7.17 --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 65be880..8bef01b 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From b1cd9e87d97ebb8fd150adb335e32d120942e399 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Thu, 30 Nov 2017 23:29:47 +0800 Subject: [PATCH 15/25] update ccode to 0501 --- addon.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addon.py b/addon.py index 2bfa26a..7c58ecc 100644 --- a/addon.py +++ b/addon.py @@ -1933,7 +1933,7 @@ def fetch_cna(): cna = requests.compat.quote(cna) return cna -def youku_ups(vid, ccode='0406'): +def youku_ups(vid, ccode='0501'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) url += '&client_ip=192.168.1.1' url += '&utid=' + fetch_cna() @@ -1994,7 +1994,7 @@ def play(vid, playContinue=False): xbmc.executebuiltin("ActivateWindow(busydialog)") try: - movdat = youku_ups(vid, '0406')['data'] + movdat = youku_ups(vid)['data'] assert 'stream' in movdat except Exception, e: log(e) From 8f990911475762b5fa068c67bd8c464c6980c53e Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Thu, 30 Nov 2017 23:30:27 +0800 Subject: [PATCH 16/25] ver 1.7.18 --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 8bef01b..2651b67 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From fa9686d2f42a18af1ed7066c78dc62cd351c990a Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Fri, 8 Dec 2017 10:33:29 +0800 Subject: [PATCH 17/25] update ccode to 0508 --- addon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.py b/addon.py index 7c58ecc..760062a 100644 --- a/addon.py +++ b/addon.py @@ -1933,7 +1933,7 @@ def fetch_cna(): cna = requests.compat.quote(cna) return cna -def youku_ups(vid, ccode='0501'): +def youku_ups(vid, ccode='0508'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) url += '&client_ip=192.168.1.1' url += '&utid=' + fetch_cna() From fdfc7ac64680a37037f775fa4768d873573e9055 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Fri, 8 Dec 2017 10:34:17 +0800 Subject: [PATCH 18/25] ver 1.7.19 --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 2651b67..726343f 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From e593b4fdd0079ae79a576fe5dfc42fb9fe3535a4 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Wed, 21 Feb 2018 20:11:49 +0800 Subject: [PATCH 19/25] change ccode to 0507 --- addon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.py b/addon.py index 760062a..08cacdc 100644 --- a/addon.py +++ b/addon.py @@ -1933,7 +1933,7 @@ def fetch_cna(): cna = requests.compat.quote(cna) return cna -def youku_ups(vid, ccode='0508'): +def youku_ups(vid, ccode='0507'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) url += '&client_ip=192.168.1.1' url += '&utid=' + fetch_cna() From febc957fbef7952008874a46db29f7e564f5946f Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Wed, 21 Feb 2018 20:12:20 +0800 Subject: [PATCH 20/25] update to 1.7.20 --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 726343f..424b7a8 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From 61f9c457c99dc7689b15196f5e5c09bd355ee96b Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Thu, 29 Mar 2018 22:14:24 +0800 Subject: [PATCH 21/25] update ccode to 0590 --- addon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.py b/addon.py index 08cacdc..4ae10d1 100644 --- a/addon.py +++ b/addon.py @@ -1933,7 +1933,7 @@ def fetch_cna(): cna = requests.compat.quote(cna) return cna -def youku_ups(vid, ccode='0507'): +def youku_ups(vid, ccode='0590'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) url += '&client_ip=192.168.1.1' url += '&utid=' + fetch_cna() From 500e24ac1df5d5442a63fb849908eae5a58567cc Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Thu, 29 Mar 2018 22:15:07 +0800 Subject: [PATCH 22/25] update to 1.7.21 --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index 424b7a8..fa49202 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From d02a058f57fe3e38dc621f352ee0f6aeebcd5cab Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Thu, 12 Apr 2018 21:47:46 +0800 Subject: [PATCH 23/25] add ckey --- addon.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addon.py b/addon.py index 4ae10d1..9b84ebd 100644 --- a/addon.py +++ b/addon.py @@ -1933,11 +1933,15 @@ def fetch_cna(): cna = requests.compat.quote(cna) return cna -def youku_ups(vid, ccode='0590'): +def youku_ups(vid, ccode='0502'): url = 'http://ups.youku.com/ups/get.json?vid={}&ccode={}'.format(vid, ccode) url += '&client_ip=192.168.1.1' url += '&utid=' + fetch_cna() url += '&client_ts=' + str(int(time.time())) + # Found in http://g.alicdn.com/player/ykplayer/0.5.28/youku-player.min.js + # grep -oE '"[0-9a-zA-Z+/=]{256}"' youku-player.min.js + ckey = 'DIl58SLFxFNndSV1GFNnMQVYkx1PP5tKe1siZu/86PR1u/Wh1Ptd+WOZsHHWxysSfAOhNJpdVWsdVJNsfJ8Sxd8WKVvNfAS8aS8fAOzYARzPyPc3JvtnPHjTdKfESTdnuTW6ZPvk2pNDh4uFzotgdMEFkzQ5wZVXl2Pf1/Y6hLK0OnCNxBj3+nb0v72gZ6b0td+WOZsHHWxysSo/0y9D2K42SaB8Y/+aD2K42SaB8Y/+ahU+WOZsHcrxysooUeND' + url += '&ckey=' + requests.compat.quote(ckey) time.sleep(3) return requests.get(url, headers=headers).json() From 459e5475067f4a17642a9d255f8d91624dec959a Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Thu, 12 Apr 2018 21:48:23 +0800 Subject: [PATCH 24/25] update to 1.7.22 --- addon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addon.xml b/addon.xml index fa49202..4277824 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@  - + From 044c68b8be48067825873b2c8ee42f35dc1c1a82 Mon Sep 17 00:00:00 2001 From: 4ft35t Date: Wed, 2 May 2018 00:51:38 +0800 Subject: [PATCH 25/25] fix resolution_type --- addon.py | 58 ++++++++++++++++++++++++-------------------------------- 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/addon.py b/addon.py index 9b84ebd..429fa50 100644 --- a/addon.py +++ b/addon.py @@ -47,22 +47,23 @@ mainData = [{'title': '搜索', 'image': 'yk_search.jpg', 'mtype': 'search'}, {'title': '观看记录', 'image': 'yk_history.jpg', 'mtype': 'history'}, {'title': '收藏', 'image': 'yk_favor.jpg', 'mtype': 'favor'}] -settings_data = {'resolution':[u'1080P', u'超清', u'高清', u'标清', u'标清(3GP)'], - 'resolution_type':[['hd3','mp4hd3'], ['hd2','mp4hd2', 'mp4hd2v2'], ['mp4','mp4hd'], ['flv','flvhd'], ['3gphd']], +settings_data = {'resolution':[u'1080P', u'超清', u'高清', u'标清'], + 'resolution_type':[['mp4hd3', 'mp4hd3v2'], ['mp4hd2', 'mp4hd2v2'], ['mp4hd', '3gphd'], ['mp4sd', 'flvhd']], 'language':[u'默认', u'国语', u'粤语', u'英语'], 'language_code':[u'', u'guoyu', u'yue', u'yingyu'], 'play':['整合(试验阶段)', '分段', '堆叠'], 'play_type':['concatenate', 'list', 'stack']} settings={'resolution':0, 'language':0, 'play':0} -resolution_map = {'3gphd': '3gp', - 'flv': 'flv', - 'flvhd': 'flv', - 'mp4': 'mp4', - 'mp4hd': 'mp4', - 'hd2': 'flv', - 'mp4hd2v2': 'flv', - 'hd3': 'flv', - 'mp4hd3': 'flv'} +resolution_map = { + "3gphd": "mp4", + "mp4hd2": "hd2", + "mp4hd3": "hd3", + "flvhd": "flv", + "mp4hd3v2": "hd3", + "mp4hd2v2": "hd2", + "mp4sd": "flv", + "mp4hd": "mp4" +} ACTION_MOVE_LEFT = 1 @@ -2001,36 +2002,27 @@ def play(vid, playContinue=False): movdat = youku_ups(vid)['data'] assert 'stream' in movdat except Exception, e: - log(e) xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') + xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放。\nNo stream.') return #Select resolution. stream = {} - resolution = '' - language_code = settings_data['language_code'][settings['language']] - try: - for i in range(settings['resolution'], len(settings_data['resolution'])): - for t in settings_data['resolution_type'][i]: - for s in movdat['stream'][::-1]: - if settings['language'] == 0 or language_code == s['audio_lang'] or s['audio_lang'] == 'default': - if t == s['stream_type']: - stream = s - resolution = settings_data['resolution_type'][i][0] - break - if stream.has_key('stream_type'): - break - if stream.has_key('stream_type'): + # resolution from higher to lower + for i in range(settings['resolution'], len(settings_data['resolution'])): + if stream: + break + for t in settings_data['resolution_type'][i]: + if stream: break - except: - xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') - return + for s in movdat['stream'][::-1]: + if t == s['stream_type']: + stream = s + break - if not stream.has_key('stream_type'): + if not stream: xbmc.executebuiltin( "Dialog.Close(busydialog)" ) - xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放') + xbmcgui.Dialog().ok('提示框', '解析地址异常,无法播放。\nStream type not matched.') return