fix support for iqiyi #334

some explanation:
    1.Download work should be complete in 10 minutes because urls are generated before downloading and the key may be expired after 10 minutes.You may retry to continue downloading
This commit is contained in:
jackyzy823 2014-09-01 20:19:42 +08:00 committed by Mort Yao
parent d371fd440e
commit f2b9bed346

View File

@ -3,8 +3,62 @@
__all__ = ['iqiyi_download']
from ..common import *
from uuid import uuid4
from random import random,randint
import json
from math import floor
import hashlib
'''
com.qiyi.player.core.model.def.DefinitonEnum
bid meaning for quality
0 none
1 standard
2 high
3 super
4 suprt-high
5 fullhd
10 4k
96 topspeed
'''
def getVRSXORCode(arg1,arg2):
loc3=arg2 %3
if loc3 == 1:
return arg1^121
if loc3 == 2:
return arg1^72
return arg1^103
def getVrsEncodeCode(vlink):
loc6=0
loc2=''
loc3=vlink.split("-")
loc4=len(loc3)
# loc5=loc4-1
for i in range(loc4-1,-1,-1):
loc6=getVRSXORCode(int(loc3[loc4-i-1],16),i)
loc2+=chr(loc6)
return loc2[::-1]
def getVMS(tvid,vid,uid):
tm=randint(1000,2000)
vmsreq='http://cache.video.qiyi.com/vms?key=fvip&src=p'+"&tvId="+tvid+"&vid="+vid+"&vinfo=1&tm="+str(tm)+"&enc="+hashlib.new('md5',bytes('ts56gh'+str(tm)+tvid,"utf-8")).hexdigest()+"&qyid="+uid+"&tn="+str(random())
return json.loads(get_content(vmsreq))
def getDispathKey(rid):
tp=")(*&^flash@#$%a" #magic from swf
time=json.loads(get_content("http://data.video.qiyi.com/t?tn="+str(random())))["t"]
t=str(int(floor(int(time)/(10*60.0))))
return hashlib.new("md5",bytes(t+tp+rid,"utf-8")).hexdigest()
def iqiyi_download(url, output_dir = '.', merge = True, info_only = False):
gen_uid=uuid4().hex
html = get_html(url)
tvid = r1(r'data-player-tvid="([^"]+)"', html)
@ -12,26 +66,38 @@ def iqiyi_download(url, output_dir = '.', merge = True, info_only = False):
assert tvid
assert videoid
info_url = 'http://cache.video.qiyi.com/vj/%s/%s/' % (tvid, videoid)
info = get_html(info_url)
raise NotImplementedError('iqiyi')
info = getVMS(tvid,videoid,gen_uid)
from xml.dom.minidom import parseString
doc = parseString(info_xml)
title = doc.getElementsByTagName('title')[0].firstChild.nodeValue
size = int(doc.getElementsByTagName('totalBytes')[0].firstChild.nodeValue)
urls = [n.firstChild.nodeValue for n in doc.getElementsByTagName('file')]
assert urls[0].endswith('.f4v'), urls[0]
title = info["data"]["vi"]["vn"]
for i in range(len(urls)):
temp_url = "http://data.video.qiyi.com/%s" % urls[i].split("/")[-1].split(".")[0] + ".ts"
try:
response = request.urlopen(temp_url)
except request.HTTPError as e:
key = r1(r'key=(.*)', e.geturl())
assert key
urls[i] += "?key=%s" % key
#for highest qualities
bid=0
for i in info["data"]["vp"]["tkl"][0]["vs"]:
if int(i["bid"])<=10 and int(i["bid"])>=bid:
bid=int(i["bid"])
video_links=i["fs"]
#todo support choose quality with cmdline
urls=[]
size=0
for i in video_links:
vlink=i["l"]
# print(vlink)
if not vlink.startswith("/"):
#vlink is encode
vlink=getVrsEncodeCode(vlink)
assert vlink.endswith(".f4v")
size+=i["b"]
key=getDispathKey(vlink.split("/")[-1].split(".")[0])
baseurl=info["data"]["vp"]["du"].split("/")
baseurl.insert(-1,key)
url="/".join(baseurl)+vlink+'?su='+gen_uid+'&client=&z=&bt=&ct=&tn='+str(randint(10000,20000))
urls.append(json.loads(get_content(url))["l"])
#download should be complete in 10 minutes
#because the url is generated before start downloading
#and the key may be expired after 10 minutes
print_info(site_info, title, 'flv', size)
if not info_only:
download_urls(urls, title, 'flv', size, output_dir = output_dir, merge = merge)