def qq(self): html = _http(self.url) vid = re.compile(r'vid:"([^"]+)"').search(html).group(1) murl = 'http://vv.video.qq.com/' vinfo = _http('%sgetinfo?otype=json&vids=%s' % (murl, vid)) infoj = json.loads(vinfo.split('=')[1][:-1]) qtyps = OrderedDict(( ('1080P', 'fhd'), ('超清', 'shd'), ('高清', 'hd'), ('标清', 'sd'))) #python 2.7 syntax #vtyps = {v['name']:v['id'] for v in infoj['fl']['fi']} vtyps = dict((v['name'],v['id']) for v in infoj['fl']['fi']) qtypid = vtyps['sd'] sels = [k for k,v in qtyps.iteritems() if v in vtyps] sel = dialog.select('清晰度', sels) surls = [] urlpre = infoj['vl']['vi'][0]['ul']['ui'][-1]['url'] if sel is -1: return 'cancel' qtypid = vtyps[qtyps[sels[sel]]] for i in range(1, int(infoj['vl']['vi'][0]['cl']['fc'])+1): fn = '%s.p%s.%s.mp4' % (vid, qtypid%10000, str(i)) sinfo = _http( '{0}getkey?format={1}&filename={2}&vid={3}&otype=json'.format( murl, qtypid, fn, vid)) skey = json.loads(sinfo.split('=')[1][:-1])['key'] surl = urllib2.urlopen( '%s%s?vkey=%s' % (urlpre, fn, skey), timeout=30).geturl() if not surl: break surls.append(surl) movurl = 'stack://{0}'.format(' , '.join(surls)) return movurl
def qq(self): html = _http(self.url) vid = re.compile(r'vid:"([^"]+)"').search(html).group(1) murl = 'http://vv.video.qq.com/' vinfo = _http('%sgetinfo?otype=json&vids=%s' % (murl, vid)) infoj = json.loads(vinfo.split('=')[1][:-1]) qtyps = OrderedDict( (('1080P', 'fhd'), ('超清', 'shd'), ('高清', 'hd'), ('标清', 'sd'))) #python 2.7 syntax #vtyps = {v['name']:v['id'] for v in infoj['fl']['fi']} vtyps = dict((v['name'], v['id']) for v in infoj['fl']['fi']) qtypid = vtyps['sd'] sels = [k for k, v in qtyps.iteritems() if v in vtyps] sel = dialog.select('清晰度', sels) surls = [] urlpre = infoj['vl']['vi'][0]['ul']['ui'][-1]['url'] if sel is -1: return 'cancel' qtypid = vtyps[qtyps[sels[sel]]] for i in range(1, int(infoj['vl']['vi'][0]['cl']['fc'])): fn = '%s.p%s.%s.mp4' % (vid, qtypid % 10000, str(i)) sinfo = _http( '{0}getkey?format={1}&filename={2}&vid={3}&otype=json'.format( murl, qtypid, fn, vid)) skey = json.loads(sinfo.split('=')[1][:-1])['key'] surl = urllib2.urlopen('%s%s?vkey=%s' % (urlpre, fn, skey), timeout=30).geturl() if not surl: break surls.append(surl) movurl = 'stack://{0}'.format(' , '.join(surls)) return movurl
def qq(self): html = _http(self.url) vid = re.compile(r'vid:"([^"]+)"').search(html).group(1) murl = "http://vv.video.qq.com/" vinfo = _http("%sgetinfo?otype=json&vids=%s" % (murl, vid)) infoj = json.loads(vinfo.split("=")[1][:-1]) qtyps = OrderedDict((("1080P", "fhd"), ("超清", "shd"), ("高清", "hd"), ("标清", "sd"))) # python 2.7 syntax # vtyps = {v['name']:v['id'] for v in infoj['fl']['fi']} vtyps = dict((v["name"], v["id"]) for v in infoj["fl"]["fi"]) qtypid = vtyps["sd"] sels = [k for k, v in qtyps.iteritems() if v in vtyps] sel = dialog.select("清晰度", sels) surls = [] urlpre = infoj["vl"]["vi"][0]["ul"]["ui"][-1]["url"] if sel is -1: return "cancel" qtypid = vtyps[qtyps[sels[sel]]] for i in range(1, int(infoj["vl"]["vi"][0]["cl"]["fc"])): fn = "%s.p%s.%s.mp4" % (vid, qtypid % 10000, str(i)) sinfo = _http("{0}getkey?format={1}&filename={2}&vid={3}&otype=json".format(murl, qtypid, fn, vid)) skey = json.loads(sinfo.split("=")[1][:-1])["key"] surl = urllib2.urlopen("%s%s?vkey=%s" % (urlpre, fn, skey), timeout=30).geturl() if not surl: break surls.append(surl) movurl = "stack://{0}".format(" , ".join(surls)) return movurl
def youku(self): stypes = OrderedDict( (('1080P', 'hd3'), ('超清', 'hd2'), ('高清', 'mp4'), ('标清', 'flv'))) #get movie metadata (json format) vid = self.url[-18:-5] moviesurl = "http://v.youku.com/player/getPlayList/VideoIDS/{0}/ctype/12/ev/1".format( vid) result = _http(moviesurl) movinfo = json.loads(result.replace('\r\n', '')) movdat = movinfo['data'][0] streamfids = movdat['streamfileids'] stype = 'flv' # user select streamtype if len(streamfids) > 1: selstypes = [k for k, v in stypes.iteritems() if v in streamfids] selitem = dialog.select('清晰度', selstypes) if selitem is -1: return 'cancle' stype = stypes[selstypes[selitem]] #stream file format type is mp4 or flv ftype = 'mp4' if stype in 'mp4' else 'flv' video_id = movdat['videoid'] oip = movdat['ip'] ep = movdat['ep'] ep, token, sid = self._calc_ep2(video_id, ep) query = urllib.urlencode( dict( vid=video_id, ts=int(time.time()), keyframe=1, type=ftype, ep=ep, oip=oip, ctype=12, ev=1, token=token, sid=sid, )) movurl = 'http://pl.youku.com/playlist/m3u8?%s' % (query) #fileid = self._getfileid(streamfids[stype], int(movdat['seed'])) #movsegs = movdat['segs'][stype] #rooturl = 'http://f.youku.com/player/getFlvPath/sid/00_00/st' #segurls = [] #for movseg in movsegs: #youku split stream file to seg # segid = '{0}{1:02X}{2}'.format(fileid[0:8], # int(movseg['no']) ,fileid[10:]) # kstr = movseg['k'] # segurl = '{0}/{1}/fileid/{2}?K={3}'.format( # rooturl, ftype, segid, kstr) # segurls.append(segurl) #movurl = 'stack://{0}'.format(' , '.join(segurls)) return movurl
def youku(self): stypes = OrderedDict((("1080P", "hd3"), ("超清", "hd2"), ("高清", "mp4"), ("标清", "flv"))) # get movie metadata (json format) vid = self.url[-18:-5] moviesurl = "http://v.youku.com/player/getPlayList/VideoIDS/{0}/ctype/12/ev/1".format(vid) result = _http(moviesurl) movinfo = json.loads(result.replace("\r\n", "")) movdat = movinfo["data"][0] streamfids = movdat["streamfileids"] stype = "flv" # user select streamtype if len(streamfids) > 1: selstypes = [k for k, v in stypes.iteritems() if v in streamfids] selitem = dialog.select("清晰度", selstypes) if selitem is -1: return "cancle" stype = stypes[selstypes[selitem]] # stream file format type is mp4 or flv ftype = "mp4" if stype in "mp4" else "flv" video_id = movdat["videoid"] oip = movdat["ip"] ep = movdat["ep"] ep, token, sid = self._calc_ep2(video_id, ep) query = urllib.urlencode( dict( vid=video_id, ts=int(time.time()), keyframe=1, type=ftype, ep=ep, oip=oip, ctype=12, ev=1, token=token, sid=sid, ) ) movurl = "http://pl.youku.com/playlist/m3u8?%s" % (query) # fileid = self._getfileid(streamfids[stype], int(movdat['seed'])) # movsegs = movdat['segs'][stype] # rooturl = 'http://f.youku.com/player/getFlvPath/sid/00_00/st' # segurls = [] # for movseg in movsegs: # youku split stream file to seg # segid = '{0}{1:02X}{2}'.format(fileid[0:8], # int(movseg['no']) ,fileid[10:]) # kstr = movseg['k'] # segurl = '{0}/{1}/fileid/{2}?K={3}'.format( # rooturl, ftype, segid, kstr) # segurls.append(segurl) # movurl = 'stack://{0}'.format(' , '.join(segurls)) return movurl
def _get_action_dict(): """ Map actions to 'category name'->'action id'->'action name' dict""" d = OrderedDict() for elem in _actions: category = elem[0] actions = elem[1][0::2] names = elem[1][1::2] d[category] = OrderedDict(zip(actions, names)) d["Windows"] = _get_activate_window_actions() d["Add-ons"] = _get_run_addon_actions() return d
def _current_keymap(self, window, category): actions = OrderedDict([(action, "") for action in ACTIONS[category].keys()]) for w, a, k in self.defaultkeymap: if w == window: if a in actions.keys(): actions[a] = k for w, a, k in self.userkeymap: if w == window: if a in actions.keys(): actions[a] = k names = ACTIONS[category] return [(action, key, names[action]) for action, key in actions.iteritems()]
def youku(self): stypes = OrderedDict((('1080P', 'hd3'), ('超清', 'hd2'), ('高清', 'mp4'), ('标清', 'flv'))) #get movie metadata (json format) vid = self.url[-18:-5] moviesurl="http://v.youku.com/player/getPlayList/VideoIDS/{0}/ctype/12/ev/1".format( vid) result = _http(moviesurl) movinfo = json.loads(result.replace('\r\n','')) movdat = movinfo['data'][0] streamfids = movdat['streamfileids'] video_id = movdat['videoid'] stype = 'flv' # user select streamtype if len(streamfids) > 1: selstypes = [k for k,v in stypes.iteritems() if v in streamfids] selitem = dialog.select('清晰度', selstypes) if selitem is -1: return 'cancle' stype = stypes[selstypes[selitem]] #stream file format type is mp4 or flv ftype = 'mp4' if stype in 'mp4' else 'flv' fileid = self._getfileid(streamfids[stype], int(movdat['seed'])) new_ep, token, sid = self._calc_ep2(video_id, movdat['ep']) query = urllib.urlencode(dict( vid=video_id, ts=int(time.time()), keyframe=1, type=stype, ep=new_ep, oip=movdat['ip'], ctype=12, ev=1, token=token, sid=sid, )) movurl = 'http://pl.youku.com/playlist/m3u8?' + query #movurl = _http(url) # movsegs = movdat['segs'][stype] # rooturl = 'http://k.youku.com/player/getFlvPath/sid/00_00/st' # segurls = [] # for movseg in movsegs: # #youku split stream file to seg # segid = '{0}{1:02X}{2}'.format(fileid[0:8], # int(movseg['no']) ,fileid[10:]) # kstr = movseg['k'] # segurl = '{0}/{1}/fileid/{2}?K={3}'.format( # rooturl, ftype, segid, kstr) # rsp = urllib2.urlopen(segurl) # rsegurl = rsp.geturl() # segurls.append(rsegurl) # movurl = 'stack://{0}'.format(' , '.join(segurls)) m3p8 = _http(movurl) segurls = re.findall('(http://.*)\?', m3p8) seen = set() segurls = [x for x in segurls if x not in seen and not seen.add(x)] movurl = 'stack://{0}'.format(' , '.join(segurls)) return movurl
def youku(self): stypes = OrderedDict((('1080P', 'hd3'), ('超清', 'hd2'), ('高清', 'mp4'), ('标清', 'flv'))) #get movie metadata (json format) vid = self.url[-18:-5] moviesurl="http://v.youku.com/player/getPlayList/VideoIDS/{0}".format( vid) result = _http(moviesurl) movinfo = json.loads(result.replace('\r\n','')) movdat = movinfo['data'][0] streamfids = movdat['streamfileids'] stype = 'flv' # user select streamtype if len(streamfids) > 1: selstypes = [k for k,v in stypes.iteritems() if v in streamfids] selitem = dialog.select('清晰度', selstypes) if selitem is -1: return 'cancle' stype = stypes[selstypes[selitem]] #stream file format type is mp4 or flv ftype = 'mp4' if stype in 'mp4' else 'flv' fileid = self._getfileid(streamfids[stype], int(movdat['seed'])) movsegs = movdat['segs'][stype] rooturl = 'http://f.youku.com/player/getFlvPath/sid/00_00/st' segurls = [] for movseg in movsegs: #youku split stream file to seg segid = '{0}{1:02X}{2}'.format(fileid[0:8], int(movseg['no']) ,fileid[10:]) kstr = movseg['k'] segurl = '{0}/{1}/fileid/{2}?K={3}'.format( rooturl, ftype, segid, kstr) rsp = urllib2.urlopen(segurl) rsegurl = rsp.geturl() segurls.append(rsegurl) movurl = 'stack://{0}'.format(' , '.join(segurls)) return movurl
def youku(self): stypes = OrderedDict( (('1080P', 'hd3'), ('超清', 'hd2'), ('高清', 'mp4'), ('标清', 'flv'))) #get movie metadata (json format) vid = self.url[-18:-5] moviesurl = "http://v.youku.com/player/getPlayList/VideoIDS/{0}".format( vid) result = _http(moviesurl) movinfo = json.loads(result.replace('\r\n', '')) movdat = movinfo['data'][0] streamfids = movdat['streamfileids'] stype = 'flv' # user select streamtype if len(streamfids) > 1: selstypes = [k for k, v in stypes.iteritems() if v in streamfids] selitem = dialog.select('清晰度', selstypes) if selitem is -1: return 'cancle' stype = stypes[selstypes[selitem]] #stream file format type is mp4 or flv ftype = 'mp4' if stype in 'mp4' else 'flv' fileid = self._getfileid(streamfids[stype], int(movdat['seed'])) movsegs = movdat['segs'][stype] rooturl = 'http://f.youku.com/player/getFlvPath/sid/00_00/st' segurls = [] for movseg in movsegs: #youku split stream file to seg segid = '{0}{1:02X}{2}'.format(fileid[0:8], int(movseg['no']), fileid[10:]) kstr = movseg['k'] segurl = '{0}/{1}/fileid/{2}?K={3}'.format(rooturl, ftype, segid, kstr) rsp = urllib2.urlopen(segurl) rsegurl = rsp.geturl() segurls.append(rsegurl) movurl = 'stack://{0}'.format(' , '.join(segurls)) return movurl
def action_dict(actions, action_names): """Create dict of action->name sorted by name""" return OrderedDict(sorted(zip(actions, action_names), key=lambda t: t[1]))
if 'addons' in res: addons.extend([a for a in res['addons'] if a['enabled']]) actions = ['runaddon(%s)' % a['addonid'] for a in addons] names = ['Launch %s' % a['name'] for a in addons] return action_dict(actions, names) def _get_activate_window_actions(): all_windows = _activate_window + _windows[2:] #don't include "global" actions = ["activatewindow(%s)" % w_id for w_id in all_windows[0::2]] names = ["Open %s" % w for w in all_windows[1::2]] return action_dict(actions, names) def _get_action_dict(): """ Map actions to 'category name'->'action id'->'action name' dict""" d = OrderedDict() for elem in _actions: category = elem[0] actions = elem[1][0::2] names = elem[1][1::2] d[category] = OrderedDict(zip(actions, names)) d["Windows"] = _get_activate_window_actions() d["Add-ons"] = _get_run_addon_actions() return d ACTIONS = _get_action_dict() WINDOWS = OrderedDict(zip(_windows[0::2], _windows[1::2]))
def showmovie(url): """ show movie list """ #filter key, e.g. 'http://www.youku.com/v_showlist/c90' urlsps = re.findall(r'(.*?/[a-z]_*\d+)', url) key = urlsps[0] #filter movie by filters if 'change' in url: url = key for k, v in filters[key].iteritems(): if '筛选' in k: continue fts = [m[1] for m in v] selitem = dialog.select(k, fts) if selitem is -1: return url = '{0}{1}'.format(url, v[selitem][0]) url = '{0}.html'.format(url) print '*' * 80, url if url in epcache: return epcache[url] result = _http(url) #get catalog filter list, filter will be cache #filters item example: # key:'http://www.youku.com/v_olist/c_97' # value: '{'地区':('_a_大陆', '大陆', ...)} if key not in filters: filterstr = re.search(r'yk-filter-panel">(.*?)yk-filter-handle', result, re.S) filtertypes = re.findall(r'<label>(.*?)<.*?<ul>(.*?)</ul>', filterstr.group(1), re.S) types = OrderedDict() for filtertype in filtertypes[1:]: typeitems = re.findall(r'(_*[a-z]+_*[^_]+?).html">(.*?)</a>', filtertype[1], re.S) typeitems.insert(0, ('', '全部')) types[filtertype[0]] = typeitems yksorts = re.findall(r'yk-sort-item(.*?)/ul>', result, re.S) for seq, yksort in enumerate(yksorts): if 'v_olist' in key: sorts = re.findall(r'(_s_\d+)(_d_\d+).*?>(.*?)</a>', yksort) types['排序{0}'.format(seq)] = [(s[seq], s[2]) for s in sorts] else: sorts = re.findall(r'(d\d+)(s\d+).*?>(.*?)</a>', yksort) types['排序{0}'.format(seq)] = [(s[not seq], s[2]) for s in sorts] filters[key] = types #get movie list mstr = r'{0}{1}{2}'.format('[vp]-thumb">\s+<img src="(.*?)" alt="([^>]+)"', '.*?"[pv]-thumb-tag[lr]b"><.*?">([^<]+?)', '<.*?"[pv]-link">\s+<a href="(.*?)"') movies = re.findall(mstr, result, re.S) #deduplication movie item #movies = [(k,v) for k,v in OrderedDict(movies).iteritems()] #add pre/next item pagestr = re.search(r'class="yk-pages">(.*?)</ul>', result, re.S) if pagestr: pre = re.findall(r'class="prev" title="(.*?)">\s*<a href="(.*?)"', pagestr.group(1)) if pre: movies.append(('', pre[0][0], '', 'http://www.youku.com{0}'.format(pre[0][1]))) nex = re.findall(r'class="next" title="(.*?)">\s*<a href="(.*?)"', pagestr.group(1)) if nex: movies.append(('', nex[0][0], '', 'http://www.youku.com{0}'.format(nex[0][1]))) cpg = re.findall(r'class="current">.*?>(\d+)<', pagestr.group(1)) tpg = re.findall(r'class="pass".*?>(\d+)<', pagestr.group(1), re.S) #add fliter item pagetitle = '【第{0}页/共{1}页】【[COLOR FFFF0000]过滤条件选择)[/COLOR]】' movies.insert(0, ('', pagetitle.format( cpg[0], tpg[0] if tpg else '1'), '', '{0}change'.format(url))) maptuple = (('olist', 'showmovie'), ('showlist', 'showmovie'), ('show_page', 'showepisode'), ('v_show/', 'playmovie')) menus = [] #0 is thunmnailimg, 1 is title, 2 is status, 3 is url for seq, m in enumerate(movies): routeaddr = filter(lambda x: x[0] in m[3], maptuple) menus.append({ 'label': '{0}. {1}【{2}】'.format(seq, m[1], m[2]).decode('utf-8') if m[0] else m[1].decode('utf-8'), 'path': plugin.url_for(routeaddr[0][1], url=m[3]), 'thumbnail': m[0], }) epcache[url] = menus return menus
def youku(self): stypes = OrderedDict((('1080P', 'hd3'), ('超清', 'hd2'), ('高清', 'mp4'), ('标清', 'flv'))) # get movie metadata (json format) vid = self.url[-18:-5] moviesurl = ('http://v.youku.com/player/getPlayList/VideoIDS/{0}' '/Pf/4/ctype/12/ev/1').format(vid) result = _http(moviesurl) movinfo = json.loads(result.replace('\r\n', '')) movdat = movinfo['data'][0] streamfids = movdat['streamfileids'] video_id = movdat['videoid'] # print video_id stype = 'flv' # user select streamtype if len(streamfids) > 1: selstypes = [k for k, v in stypes.iteritems() if v in streamfids] selitem = dialog.select('清晰度', selstypes) if selitem is -1: return 'cancle' stype = stypes[selstypes[selitem]] # stream file format type is mp4 or flv ftype = 'mp4' if stype in 'mp4' else 'flv' fileid = self.get_fileid(streamfids[stype], int(movdat['seed'])) token, sid = self.get_sid_token(video_id, movdat['ep']) # query = urllib.urlencode(dict( # vid=video_id, ts=int(time.time()), keyframe=1, type=stype, # ep=new_ep, oip=movdat['ip'], ctype=12, ev=1, token=token, sid=sid, # )) # the length video just 40 min by m3u8 # movurl = 'http://pl.youku.com/playlist/m3u8?' + query # print movurl # movurl = _http(url) movsegs = movdat['segs'][stype] rooturl = 'http://k.youku.com/player/getFlvPath/sid' segurls = [] for movseg in movsegs: # youku split stream file to seg segid = '{0}{1:02X}{2}'.format( fileid[0:8], int(movseg['no']), fileid[10:]) kstr = movseg['k'] segurl = '{0}/{1}_00/st/{2}/fileid/{3}?'.format( rooturl, sid, ftype, segid) new_ep = base64.b64encode( self.trans_e(self.f_code_2, sid+'_'+segid+'_'+token)) query = urllib.urlencode(dict(K=kstr, ctype=12, ev=1, oip=movdat['ip'], token=token, ep=new_ep)) segurl = segurl + query # print segurl rsp = urllib2.urlopen(segurl) rsegurl = rsp.geturl() segurls.append(rsegurl) # m3u8 = _http(movurl) # print m3u8 # segurls = re.findall('(http://.*)\?', m3u8) # lens = re.findall('EXTINF:([\d\.]+),', m3u8) # b = 0 # for a in lens: # b = b + float(a) # print b # print segurls # seen = set() # segurls = [x for x in segurls if x not in seen and not seen.add(x)] # print segurls movurl = 'stack://{0}'.format(' , '.join(segurls)) return movurl
def youku(self): stypes = OrderedDict( (('1080P', 'hd3'), ('超清', 'hd2'), ('高清', 'mp4'), ('标清', 'flv'))) # get movie metadata (json format) vid = self.url[-18:-5] moviesurl = ('http://v.youku.com/player/getPlayList/VideoIDS/{0}' '/Pf/4/ctype/12/ev/1').format(vid) result = _http(moviesurl) movinfo = json.loads(result.replace('\r\n', '')) movdat = movinfo['data'][0] streamfids = movdat['streamfileids'] video_id = movdat['videoid'] # print video_id stype = 'flv' # user select streamtype if len(streamfids) > 1: selstypes = [k for k, v in stypes.iteritems() if v in streamfids] selitem = dialog.select('清晰度', selstypes) if selitem is -1: return 'cancle' stype = stypes[selstypes[selitem]] # stream file format type is mp4 or flv ftype = 'mp4' if stype in 'mp4' else 'flv' fileid = self.get_fileid(streamfids[stype], int(movdat['seed'])) token, sid = self.get_sid_token(video_id, movdat['ep']) # query = urllib.urlencode(dict( # vid=video_id, ts=int(time.time()), keyframe=1, type=stype, # ep=new_ep, oip=movdat['ip'], ctype=12, ev=1, token=token, sid=sid, # )) # the length video just 40 min by m3u8 # movurl = 'http://pl.youku.com/playlist/m3u8?' + query # print movurl # movurl = _http(url) movsegs = movdat['segs'][stype] rooturl = 'http://k.youku.com/player/getFlvPath/sid' segurls = [] for movseg in movsegs: # youku split stream file to seg segid = '{0}{1:02X}{2}'.format(fileid[0:8], int(movseg['no']), fileid[10:]) kstr = movseg['k'] segurl = '{0}/{1}_00/st/{2}/fileid/{3}?'.format( rooturl, sid, ftype, segid) new_ep = base64.b64encode( self.trans_e(self.f_code_2, sid + '_' + segid + '_' + token)) query = urllib.urlencode( dict(K=kstr, ctype=12, ev=1, oip=movdat['ip'], token=token, ep=new_ep)) segurl = segurl + query # print segurl rsp = urllib2.urlopen(segurl) rsegurl = rsp.geturl() segurls.append(rsegurl) # m3u8 = _http(movurl) # print m3u8 # segurls = re.findall('(http://.*)\?', m3u8) # lens = re.findall('EXTINF:([\d\.]+),', m3u8) # b = 0 # for a in lens: # b = b + float(a) # print b # print segurls # seen = set() # segurls = [x for x in segurls if x not in seen and not seen.add(x)] # print segurls movurl = 'stack://{0}'.format(' , '.join(segurls)) return movurl