def parse_vurl(self, content, options): # Read urls of all qualities root = json.loads(content) vs = root[u'tkl'][0][u'vs'] bids = [None] * 5 for v in vs: bid = int(v[u'bid']) - 1 if bid < 5: bids[bid] = ['http://data.video.qiyi.com/videos' + item[u'l'] for item in v[u'fs']] # Select quality if options & moonplayer.OPT_QL_SUPER: q = 3 elif options & moonplayer.OPT_QL_HIGH: q = 1 else: q = 0 for i in xrange(q, -1, -1): if bids[i]: self.urls = bids[i] break if options & moonplayer.OPT_DOWNLOAD and bids[4]: if moonplayer.question('是否下载1080P版本?'): self.urls = bids[4] # Get video's key first_uid = self.urls[0].split('/')[-1].split('.')[0] self.suffix = str(self.urls[0].split('.')[-1]) url = 'http://data.video.qiyi.com/' + first_uid + '.ts' moonplayer.get_url(url, self.parse_key, options)
def parse_vms(self, content, options): info = json.loads(content) if info['code'] != 'A000000': moonplayer.warn('Code Error') return if info["data"]['vp']["tkl"]=='': moonplayer.warn('Error: empty data.') return # Read urls of all qualities vs = info["data"]["vp"]["tkl"][0]["vs"] bids = [None] * 5 for v in vs: bid = int(v[u'bid']) - 1 if bid < 5 and bid >= 0: bids[bid] = v['fs'] if not v["fs"][0]["l"].startswith("/"): tmp = self.getVrsEncodeCode(v["fs"][0]["l"]) if tmp.endswith('mp4'): bids[bid] = v["flvs"] # Select quality if options & moonplayer.OPT_QL_SUPER: q = 3 elif options & moonplayer.OPT_QL_HIGH: q = 1 else: q = 0 for i in xrange(q, -1, -1): if bids[i]: self.video_links = bids[i] break if options & moonplayer.OPT_DOWNLOAD and bids[4]: if moonplayer.question('是否下载1080P版本?'): self.video_links = bids[4] # Get video's key self.urls = [] self.vlinks = [] self.key_roots = [] self.info = info for i in self.video_links: vlink = i['l'] if not vlink.startswith('/'): vlink = self.getVrsEncodeCode(vlink) self.vlinks.append(vlink) self.key_roots.append(vlink.split("/")[-1].split(".")[0]) url = "http://data.video.qiyi.com/t?tn=" + str(random()) moonplayer.get_url(url, self.parse_key, options)
def parse_vms(self, content, options): info = json.loads(content) if info['code'] != 'A000000': moonplayer.warn('Code Error') return if info["data"]['vp']["tkl"] == '': moonplayer.warn('Error: empty data.') return # Read urls of all qualities vs = info["data"]["vp"]["tkl"][0]["vs"] bids = [None] * 5 for v in vs: bid = int(v[u'bid']) - 1 if bid < 5 and bid >= 0: bids[bid] = v['fs'] if not v["fs"][0]["l"].startswith("/"): tmp = self.getVrsEncodeCode(v["fs"][0]["l"]) if tmp.endswith('mp4'): bids[bid] = v["flvs"] # Select quality if options & moonplayer.OPT_QL_SUPER: q = 3 elif options & moonplayer.OPT_QL_HIGH: q = 1 else: q = 0 for i in xrange(q, -1, -1): if bids[i]: self.video_links = bids[i] break if options & moonplayer.OPT_DOWNLOAD and bids[4]: if moonplayer.question('是否下载1080P版本?'): self.video_links = bids[4] # Get video's key self.urls = [] self.vlinks = [] self.key_roots = [] self.info = info for i in self.video_links: vlink = i['l'] if not vlink.startswith('/'): vlink = self.getVrsEncodeCode(vlink) self.vlinks.append(vlink) self.key_roots.append(vlink.split("/")[-1].split(".")[0]) url = "http://data.video.qiyi.com/t?tn=" + str(random()) moonplayer.get_url(url, self.parse_key, options)
def parse_cb(page, data): options = data[0] url = data[1] match = cantonese_re.search(page) if match and not '_lang=1' in moonplayer.final_url: if moonplayer.question('是否解析为粤语版?'): url = match.group(1) if not url.startswith('http://'): url = 'http://www.flvcd.com/' + url url += '&go=1' moonplayer.get_url(url, parse_cb, data) return result = parse_flvcd_page(page, None) if len(result) == 0: moonplayer.warn('Cannot parse this video:\n' + url) elif options & moonplayer.OPT_DOWNLOAD: moonplayer.download(result, result[0]) else: moonplayer.play(result)
def parse_cb(page, options): # Check errors try: data = json.loads(page)['data'] except: moonplayer.warn('Video not found!') return if 'error' in data: moonplayer.warn('Error: ' + data['error']['note'].encode('utf-8')) return # Get title, ep, ip, vid title = data['video']['title'].encode('utf-8') vid = data['video']['encodeid'] ep = data['security']['encrypt_string'] ip = data['security']['ip'] # Sort streams' info streamlangs = {} for stream in data['stream']: lang = stream['audio_lang'] if not lang in streamlangs: streamlangs[lang] = [None] * 4 if stream['stream_type'] in ('flv', 'flvhd'): streamlangs[lang][QL_NORMAL] = stream elif stream['stream_type'] in ('mp4', 'mp4hd'): streamlangs[lang][QL_HIGH] = stream elif stream['stream_type'] in ('hd2', 'mp4hd2'): streamlangs[lang][QL_SUPER] = stream elif stream['stream_type'] in ('hd3', 'mp4hd3'): streamlangs[lang][QL_1080P] = stream # Select video's language try: for audiolang in data['dvd']['audiolang']: if audiolang['vid'] != vid: if moonplayer.question('是否切换至:' + audiolang['lang'].encode('utf-8')): url = 'http://play.youku.com/play/get.json?vid=%s&ct=12' % audiolang['vid'] moonplayer.get_url(url, parse_cb, options, 'http://static.youku.com') return else: lang = audiolang['langcode'] except KeyError: lang = streamlangs.keys()[0] streams = streamlangs[lang] # Select video quality if options & moonplayer.OPT_QL_SUPER and streams[QL_SUPER]: stream = streams[QL_SUPER] st = 'flv' elif options & (moonplayer.OPT_QL_SUPER|moonplayer.OPT_QL_HIGH) and streams[QL_HIGH]: stream = streams[QL_HIGH] st = 'mp4' else: stream = streams[QL_NORMAL] st = 'flv' if options & moonplayer.OPT_DOWNLOAD and streams[QL_1080P]: if moonplayer.question('下载1080P版本吗?'): stream = streams[QL_1080P] st = 'flv' # Parse sid, token = trans_e('becaf9be', base64.b64decode(ep)).split('_') segs = stream['segs'] result = [] for i in xrange(len(segs)): name = '%s_%d.%s' % (title, i, st) hex_id = hex(i)[2:].upper().zfill(2) fileid = stream['stream_fileid'][0:8] + hex_id + stream['stream_fileid'][10:] url = 'http://k.youku.com/player/getFlvPath/sid/%s_%s/st/%s/fileid/%s?' % \ (sid, hex_id, st, fileid) param = { 'K': segs[i]['key'], 'ctype': 12, 'ev': 1, 'oip': ip, 'token': token, 'ep': generate_ep(sid, fileid, token), 'ymovie': 1, 'xfsize': segs[i]['size']} url += urlencode(param) result.append(name) result.append(url) if options & moonplayer.OPT_DOWNLOAD: moonplayer.download(result, title + '.' + st) else: moonplayer.play(result)
def parse_cb(page, data): options, fallback_sid, fallback_token = data # Check errors try: data = json.loads(page)['data'] except: moonplayer.warn('Video not found!') return if 'error' in data: moonplayer.warn('Error: ' + data['error']['note'].encode('utf-8')) return # Get title, ep, ip, vid title = data['video']['title'].encode('utf-8') vid = data['video']['encodeid'] ep = data['security']['encrypt_string'] ip = data['security']['ip'] # Sort streams' info streamlangs = {} for stream in data['stream']: lang = stream['audio_lang'] if not lang in streamlangs: streamlangs[lang] = [None] * 4 if stream['stream_type'] in ('flv', 'flvhd'): streamlangs[lang][QL_NORMAL] = stream elif stream['stream_type'] in ('mp4', 'mp4hd'): streamlangs[lang][QL_HIGH] = stream elif stream['stream_type'] in ('hd2', 'mp4hd2'): streamlangs[lang][QL_SUPER] = stream elif stream['stream_type'] in ('hd3', 'mp4hd3'): streamlangs[lang][QL_1080P] = stream # Select video's language try: for audiolang in data['dvd']['audiolang']: if audiolang['vid'] != vid: if moonplayer.question('是否切换至:' + audiolang['lang'].encode('utf-8')): url = 'http://play.youku.com/play/get.json?vid=%s&ct=12' % audiolang['vid'] moonplayer.get_url(url, parse_cb, (options, None, None), 'http://static.youku.com') return else: lang = audiolang['langcode'] except KeyError: lang = streamlangs.keys()[0] streams = streamlangs[lang] # Select video quality if options & moonplayer.OPT_QL_1080P and streams[QL_1080P]: stream = streams[QL_1080P] st = 'flv' if options & moonplayer.OPT_QL_SUPER and streams[QL_SUPER]: stream = streams[QL_SUPER] st = 'flv' elif options & moonplayer.OPT_QL_HIGH and streams[QL_HIGH]: stream = streams[QL_HIGH] st = 'mp4' else: stream = streams[QL_NORMAL] st = 'flv' # Parse if fallback_sid: sid = fallback_sid token = fallback_token else: sid, token = trans_e('becaf9be', base64.b64decode(ep)).split('_') segs = stream['segs'] result = [] for i in xrange(len(segs)): name = '%s_%d.%s' % (title, i, st) hex_id = hex(i)[2:].upper().zfill(2) fileid = stream['stream_fileid'][0:8] + hex_id + stream['stream_fileid'][10:] url = 'http://k.youku.com/player/getFlvPath/sid/%s_%s/st/%s/fileid/%s?' % \ (sid, hex_id, st, fileid) param = { 'K': segs[i]['key'], 'ctype': 12, 'ev': 1, 'oip': ip, 'token': token, 'ep': unquote(generate_ep(sid, fileid, token)), 'ymovie': 1, 'xfsize': segs[i]['size']} url += urlencode(param) result.append(name) result.append(url) # Check whether the parsed url is suit for your location. if fallback_sid == None: print 'Checking' try: url = result[1].replace('ymovie=', 'yxon=') req = urllib2.Request(url) req.add_header('User-Agnet', 'moonplayer') response = urllib2.urlopen(req, timeout=5) except urllib2.HTTPError, e: # Use fallback meta url = 'http://play.youku.com/play/get.json?vid=%s&ct=10' % vid moonplayer.get_url(url, parse_cb, (options, sid, token), 'http://static.youku.com') return