mirror of
https://github.com/soimort/you-get.git
synced 2025-02-03 00:33:58 +03:00
Merge branch 'develop' of https://github.com/GuanFoxyier/you-get into GuanFoxyier-develop
This commit is contained in:
commit
42b2f1afaa
@ -9,13 +9,16 @@ import base64, hashlib, urllib, time, re
|
|||||||
|
|
||||||
from ..common import *
|
from ..common import *
|
||||||
|
|
||||||
#@DEPRECATED
|
|
||||||
|
# @DEPRECATED
|
||||||
def get_timestamp():
|
def get_timestamp():
|
||||||
tn = random.random()
|
tn = random.random()
|
||||||
url = 'http://api.letv.com/time?tn={}'.format(tn)
|
url = 'http://api.letv.com/time?tn={}'.format(tn)
|
||||||
result = get_content(url)
|
result = get_content(url)
|
||||||
return json.loads(result)['stime']
|
return json.loads(result)['stime']
|
||||||
#@DEPRECATED
|
|
||||||
|
|
||||||
|
# @DEPRECATED
|
||||||
def get_key(t):
|
def get_key(t):
|
||||||
for s in range(0, 8):
|
for s in range(0, 8):
|
||||||
e = 1 & t
|
e = 1 & t
|
||||||
@ -24,42 +27,40 @@ def get_key(t):
|
|||||||
t += e
|
t += e
|
||||||
return t ^ 185025305
|
return t ^ 185025305
|
||||||
|
|
||||||
|
|
||||||
def calcTimeKey(t):
|
def calcTimeKey(t):
|
||||||
ror = lambda val, r_bits, : ((val & (2**32-1)) >> r_bits%32) | (val << (32-(r_bits%32)) & (2**32-1))
|
ror = lambda val, r_bits,: ((val & (2 ** 32 - 1)) >> r_bits % 32) | (val << (32 - (r_bits % 32)) & (2 ** 32 - 1))
|
||||||
magic = 185025305
|
magic = 185025305
|
||||||
return ror(t, magic % 17) ^ magic
|
return ror(t, magic % 17) ^ magic
|
||||||
#return ror(ror(t,773625421%13)^773625421,773625421%17)
|
# return ror(ror(t,773625421%13)^773625421,773625421%17)
|
||||||
|
|
||||||
|
|
||||||
def decode(data):
|
def decode(data):
|
||||||
version = data[0:5]
|
version = data[0:5]
|
||||||
if version.lower() == b'vc_01':
|
if version.lower() == b'vc_01':
|
||||||
#get real m3u8
|
# get real m3u8
|
||||||
loc2 = data[5:]
|
loc2 = data[5:]
|
||||||
length = len(loc2)
|
length = len(loc2)
|
||||||
loc4 = [0]*(2*length)
|
loc4 = [0] * (2 * length)
|
||||||
for i in range(length):
|
for i in range(length):
|
||||||
loc4[2*i] = loc2[i] >> 4
|
loc4[2 * i] = loc2[i] >> 4
|
||||||
loc4[2*i+1]= loc2[i] & 15;
|
loc4[2 * i + 1] = loc2[i] & 15;
|
||||||
loc6 = loc4[len(loc4)-11:]+loc4[:len(loc4)-11]
|
loc6 = loc4[len(loc4) - 11:] + loc4[:len(loc4) - 11]
|
||||||
loc7 = [0]*length
|
loc7 = [0] * length
|
||||||
for i in range(length):
|
for i in range(length):
|
||||||
loc7[i] = (loc6[2 * i] << 4) +loc6[2*i+1]
|
loc7[i] = (loc6[2 * i] << 4) + loc6[2 * i + 1]
|
||||||
return ''.join([chr(i) for i in loc7])
|
return ''.join([chr(i) for i in loc7])
|
||||||
else:
|
else:
|
||||||
# directly return
|
# directly return
|
||||||
return data
|
return str(data)
|
||||||
|
|
||||||
|
|
||||||
|
def video_info(vid, **kwargs):
|
||||||
|
url = 'http://player-pc.le.com/mms/out/video/playJson?id={}&platid=1&splatid=105&format=1&tkey={}&domain=www.le.com®ion=cn&source=1000&accesyx=1'.format(vid, calcTimeKey(int(time.time())))
|
||||||
def video_info(vid,**kwargs):
|
|
||||||
url = 'http://player-pc.le.com/mms/out/video/playJson?id={}&platid=1&splatid=101&format=1&tkey={}&domain=www.le.com®ion=cn&source=1000&accesyx=1'.format(vid,calcTimeKey(int(time.time())))
|
|
||||||
r = get_content(url, decoded=False)
|
r = get_content(url, decoded=False)
|
||||||
info=json.loads(str(r,"utf-8"))
|
info = json.loads(str(r, "utf-8"))
|
||||||
info = info['msgs']
|
info = info['msgs']
|
||||||
|
|
||||||
|
|
||||||
stream_id = None
|
stream_id = None
|
||||||
support_stream_id = info["playurl"]["dispatch"].keys()
|
support_stream_id = info["playurl"]["dispatch"].keys()
|
||||||
if "stream_id" in kwargs and kwargs["stream_id"].lower() in support_stream_id:
|
if "stream_id" in kwargs and kwargs["stream_id"].lower() in support_stream_id:
|
||||||
@ -70,27 +71,28 @@ def video_info(vid,**kwargs):
|
|||||||
elif "720p" in support_stream_id:
|
elif "720p" in support_stream_id:
|
||||||
stream_id = '720p'
|
stream_id = '720p'
|
||||||
else:
|
else:
|
||||||
stream_id =sorted(support_stream_id,key= lambda i: int(i[1:]))[-1]
|
stream_id = sorted(support_stream_id, key=lambda i: int(i[1:]))[-1]
|
||||||
|
|
||||||
url =info["playurl"]["domain"][0]+info["playurl"]["dispatch"][stream_id][0]
|
url = info["playurl"]["domain"][0] + info["playurl"]["dispatch"][stream_id][0]
|
||||||
uuid = hashlib.sha1(url.encode('utf8')).hexdigest() + '_0'
|
uuid = hashlib.sha1(url.encode('utf8')).hexdigest() + '_0'
|
||||||
ext = info["playurl"]["dispatch"][stream_id][1].split('.')[-1]
|
ext = info["playurl"]["dispatch"][stream_id][1].split('.')[-1]
|
||||||
url = url.replace('tss=0', 'tss=ios')
|
url = url.replace('tss=0', 'tss=ios')
|
||||||
url+="&m3v=1&termid=1&format=1&hwtype=un&ostype=MacOS10.12.4&p1=1&p2=10&p3=-&expect=3&tn={}&vid={}&uuid={}&sign=letv".format(random.random(), vid, uuid)
|
url += "&m3v=1&termid=1&format=1&hwtype=un&ostype=MacOS10.12.4&p1=1&p2=10&p3=-&expect=3&tn={}&vid={}&uuid={}&sign=letv".format(random.random(), vid, uuid)
|
||||||
|
|
||||||
r2=get_content(url,decoded=False)
|
r2 = get_content(url, decoded=False)
|
||||||
info2=json.loads(str(r2,"utf-8"))
|
info2 = json.loads(str(r2, "utf-8"))
|
||||||
|
|
||||||
# hold on ! more things to do
|
# hold on ! more things to do
|
||||||
# to decode m3u8 (encoded)
|
# to decode m3u8 (encoded)
|
||||||
suffix = '&r=' + str(int(time.time() * 1000)) + '&appid=500'
|
suffix = '&r=' + str(int(time.time() * 1000)) + '&appid=500'
|
||||||
m3u8 = get_content(info2["location"]+suffix,decoded=False)
|
m3u8 = get_content(info2["location"] + suffix, decoded=False)
|
||||||
m3u8_list = decode(m3u8)
|
m3u8_list = decode(m3u8)
|
||||||
urls = re.findall(r'^[^#][^\r]*',m3u8_list,re.MULTILINE)
|
urls = re.findall(r'(http.*?)#', m3u8_list, re.MULTILINE)
|
||||||
return ext,urls
|
return ext, urls
|
||||||
|
|
||||||
def letv_download_by_vid(vid,title, output_dir='.', merge=True, info_only=False,**kwargs):
|
|
||||||
ext , urls = video_info(vid,**kwargs)
|
def letv_download_by_vid(vid, title, output_dir='.', merge=True, info_only=False, **kwargs):
|
||||||
|
ext, urls = video_info(vid, **kwargs)
|
||||||
size = 0
|
size = 0
|
||||||
for i in urls:
|
for i in urls:
|
||||||
_, _, tmp = url_info(i)
|
_, _, tmp = url_info(i)
|
||||||
@ -100,27 +102,29 @@ def letv_download_by_vid(vid,title, output_dir='.', merge=True, info_only=False,
|
|||||||
if not info_only:
|
if not info_only:
|
||||||
download_urls(urls, title, ext, size, output_dir=output_dir, merge=merge)
|
download_urls(urls, title, ext, size, output_dir=output_dir, merge=merge)
|
||||||
|
|
||||||
|
|
||||||
def letvcloud_download_by_vu(vu, uu, title=None, output_dir='.', merge=True, info_only=False):
|
def letvcloud_download_by_vu(vu, uu, title=None, output_dir='.', merge=True, info_only=False):
|
||||||
#ran = float('0.' + str(random.randint(0, 9999999999999999))) # For ver 2.1
|
# ran = float('0.' + str(random.randint(0, 9999999999999999))) # For ver 2.1
|
||||||
#str2Hash = 'cfflashformatjsonran{ran}uu{uu}ver2.2vu{vu}bie^#@(%27eib58'.format(vu = vu, uu = uu, ran = ran) #Magic!/ In ver 2.1
|
# str2Hash = 'cfflashformatjsonran{ran}uu{uu}ver2.2vu{vu}bie^#@(%27eib58'.format(vu = vu, uu = uu, ran = ran) #Magic!/ In ver 2.1
|
||||||
argumet_dict ={'cf' : 'flash', 'format': 'json', 'ran': str(int(time.time())), 'uu': str(uu),'ver': '2.2', 'vu': str(vu), }
|
argumet_dict = {'cf': 'flash', 'format': 'json', 'ran': str(int(time.time())), 'uu': str(uu), 'ver': '2.2', 'vu': str(vu), }
|
||||||
sign_key = '2f9d6924b33a165a6d8b5d3d42f4f987' #ALL YOUR BASE ARE BELONG TO US
|
sign_key = '2f9d6924b33a165a6d8b5d3d42f4f987' # ALL YOUR BASE ARE BELONG TO US
|
||||||
str2Hash = ''.join([i + argumet_dict[i] for i in sorted(argumet_dict)]) + sign_key
|
str2Hash = ''.join([i + argumet_dict[i] for i in sorted(argumet_dict)]) + sign_key
|
||||||
sign = hashlib.md5(str2Hash.encode('utf-8')).hexdigest()
|
sign = hashlib.md5(str2Hash.encode('utf-8')).hexdigest()
|
||||||
request_info = urllib.request.Request('http://api.letvcloud.com/gpc.php?' + '&'.join([i + '=' + argumet_dict[i] for i in argumet_dict]) + '&sign={sign}'.format(sign = sign))
|
request_info = urllib.request.Request('http://api.letvcloud.com/gpc.php?' + '&'.join([i + '=' + argumet_dict[i] for i in argumet_dict]) + '&sign={sign}'.format(sign=sign))
|
||||||
response = urllib.request.urlopen(request_info)
|
response = urllib.request.urlopen(request_info)
|
||||||
data = response.read()
|
data = response.read()
|
||||||
info = json.loads(data.decode('utf-8'))
|
info = json.loads(data.decode('utf-8'))
|
||||||
type_available = []
|
type_available = []
|
||||||
for video_type in info['data']['video_info']['media']:
|
for video_type in info['data']['video_info']['media']:
|
||||||
type_available.append({'video_url': info['data']['video_info']['media'][video_type]['play_url']['main_url'], 'video_quality': int(info['data']['video_info']['media'][video_type]['play_url']['vtype'])})
|
type_available.append({'video_url': info['data']['video_info']['media'][video_type]['play_url']['main_url'], 'video_quality': int(info['data']['video_info']['media'][video_type]['play_url']['vtype'])})
|
||||||
urls = [base64.b64decode(sorted(type_available, key = lambda x:x['video_quality'])[-1]['video_url']).decode("utf-8")]
|
urls = [base64.b64decode(sorted(type_available, key=lambda x: x['video_quality'])[-1]['video_url']).decode("utf-8")]
|
||||||
size = urls_size(urls)
|
size = urls_size(urls)
|
||||||
ext = 'mp4'
|
ext = 'mp4'
|
||||||
print_info(site_info, title, ext, size)
|
print_info(site_info, title, ext, size)
|
||||||
if not info_only:
|
if not info_only:
|
||||||
download_urls(urls, title, ext, size, output_dir=output_dir, merge=merge)
|
download_urls(urls, title, ext, size, output_dir=output_dir, merge=merge)
|
||||||
|
|
||||||
|
|
||||||
def letvcloud_download(url, output_dir='.', merge=True, info_only=False):
|
def letvcloud_download(url, output_dir='.', merge=True, info_only=False):
|
||||||
qs = parse.urlparse(url).query
|
qs = parse.urlparse(url).query
|
||||||
vu = match1(qs, r'vu=([\w]+)')
|
vu = match1(qs, r'vu=([\w]+)')
|
||||||
@ -128,7 +132,8 @@ def letvcloud_download(url, output_dir='.', merge=True, info_only=False):
|
|||||||
title = "LETV-%s" % vu
|
title = "LETV-%s" % vu
|
||||||
letvcloud_download_by_vu(vu, uu, title=title, output_dir=output_dir, merge=merge, info_only=info_only)
|
letvcloud_download_by_vu(vu, uu, title=title, output_dir=output_dir, merge=merge, info_only=info_only)
|
||||||
|
|
||||||
def letv_download(url, output_dir='.', merge=True, info_only=False ,**kwargs):
|
|
||||||
|
def letv_download(url, output_dir='.', merge=True, info_only=False, **kwargs):
|
||||||
url = url_locations([url])[0]
|
url = url_locations([url])[0]
|
||||||
if re.match(r'http://yuntv.letv.com/', url):
|
if re.match(r'http://yuntv.letv.com/', url):
|
||||||
letvcloud_download(url, output_dir=output_dir, merge=merge, info_only=info_only)
|
letvcloud_download(url, output_dir=output_dir, merge=merge, info_only=info_only)
|
||||||
@ -136,14 +141,15 @@ def letv_download(url, output_dir='.', merge=True, info_only=False ,**kwargs):
|
|||||||
html = get_content(url)
|
html = get_content(url)
|
||||||
vid = match1(url, r'video/(\d+)\.html')
|
vid = match1(url, r'video/(\d+)\.html')
|
||||||
title = match1(html, r'<h2 class="title">([^<]+)</h2>')
|
title = match1(html, r'<h2 class="title">([^<]+)</h2>')
|
||||||
letv_download_by_vid(vid, title=title, output_dir=output_dir, merge=merge, info_only=info_only,**kwargs)
|
letv_download_by_vid(vid, title=title, output_dir=output_dir, merge=merge, info_only=info_only, **kwargs)
|
||||||
else:
|
else:
|
||||||
html = get_content(url)
|
html = get_content(url)
|
||||||
vid = match1(url, r'http://www.letv.com/ptv/vplay/(\d+).html') or \
|
vid = match1(url, r'http://www.letv.com/ptv/vplay/(\d+).html') or \
|
||||||
match1(url, r'http://www.le.com/ptv/vplay/(\d+).html') or \
|
match1(url, r'http://www.le.com/ptv/vplay/(\d+).html') or \
|
||||||
match1(html, r'vid="(\d+)"')
|
match1(html, r'vid="(\d+)"')
|
||||||
title = match1(html,r'name="irTitle" content="(.*?)"')
|
title = match1(html, r'name="irTitle" content="(.*?)"')
|
||||||
letv_download_by_vid(vid, title=title, output_dir=output_dir, merge=merge, info_only=info_only,**kwargs)
|
letv_download_by_vid(vid, title=title, output_dir=output_dir, merge=merge, info_only=info_only, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
site_info = "Le.com"
|
site_info = "Le.com"
|
||||||
download = letv_download
|
download = letv_download
|
||||||
|
Loading…
Reference in New Issue
Block a user