mirror of
https://github.com/soimort/you-get.git
synced 2025-01-24 05:55:02 +03:00
Merge pull request #2153 from rosynirvana/zhanqi
[common zhanqi]m3u8 code in common; rewrite zhanqi
This commit is contained in:
commit
c820f42af7
@ -161,6 +161,22 @@ def rc4(key, data):
|
|||||||
out_list.append(char ^ prn)
|
out_list.append(char ^ prn)
|
||||||
|
|
||||||
return bytes(out_list)
|
return bytes(out_list)
|
||||||
|
|
||||||
|
def general_m3u8_extractor(url):
|
||||||
|
path_len = len(url.split('/')[-1])
|
||||||
|
base_url = url[:-path_len]
|
||||||
|
|
||||||
|
m3u8_list = get_content(url).split('\n')
|
||||||
|
urls = []
|
||||||
|
for line in m3u8_list:
|
||||||
|
line = line.strip()
|
||||||
|
if line and not line.startswith('#'):
|
||||||
|
if line.startswith('http'):
|
||||||
|
urls.append(line)
|
||||||
|
else:
|
||||||
|
urls.append(base_url + line)
|
||||||
|
return urls
|
||||||
|
|
||||||
def maybe_print(*s):
|
def maybe_print(*s):
|
||||||
try: print(*s)
|
try: print(*s)
|
||||||
except: pass
|
except: pass
|
||||||
@ -1030,7 +1046,7 @@ def playlist_not_supported(name):
|
|||||||
raise NotImplementedError('Playlist is not supported for ' + name)
|
raise NotImplementedError('Playlist is not supported for ' + name)
|
||||||
return f
|
return f
|
||||||
|
|
||||||
def print_info(site_info, title, type, size):
|
def print_info(site_info, title, type, size, **kwargs):
|
||||||
if json_output:
|
if json_output:
|
||||||
json_output_.print_info(site_info=site_info, title=title, type=type, size=size)
|
json_output_.print_info(site_info=site_info, title=title, type=type, size=size)
|
||||||
return
|
return
|
||||||
@ -1097,14 +1113,22 @@ def print_info(site_info, title, type, size):
|
|||||||
type_info = "Portable Network Graphics (%s)" % type
|
type_info = "Portable Network Graphics (%s)" % type
|
||||||
elif type in ['image/gif']:
|
elif type in ['image/gif']:
|
||||||
type_info = "Graphics Interchange Format (%s)" % type
|
type_info = "Graphics Interchange Format (%s)" % type
|
||||||
|
elif type in ['m3u8']:
|
||||||
|
if 'm3u8_type' in kwargs:
|
||||||
|
if kwargs['m3u8_type'] == 'master':
|
||||||
|
type_info = 'M3U8 Master {}'.format(type)
|
||||||
|
else:
|
||||||
|
type_info = 'M3U8 Playlist {}'.format(type)
|
||||||
else:
|
else:
|
||||||
type_info = "Unknown type (%s)" % type
|
type_info = "Unknown type (%s)" % type
|
||||||
|
|
||||||
maybe_print("Site: ", site_info)
|
maybe_print("Site: ", site_info)
|
||||||
maybe_print("Title: ", unescape_html(tr(title)))
|
maybe_print("Title: ", unescape_html(tr(title)))
|
||||||
print("Type: ", type_info)
|
print("Type: ", type_info)
|
||||||
print("Size: ", round(size / 1048576, 2), "MiB (" + str(size) + " Bytes)")
|
if type != 'm3u8':
|
||||||
|
print("Size: ", round(size / 1048576, 2), "MiB (" + str(size) + " Bytes)")
|
||||||
|
if type == 'm3u8' and 'm3u8_url' in kwargs:
|
||||||
|
print('M3U8 Url: {}'.format(kwargs['m3u8_url']))
|
||||||
print()
|
print()
|
||||||
|
|
||||||
def mime_to_container(mime):
|
def mime_to_container(mime):
|
||||||
|
@ -4,53 +4,48 @@ __all__ = ['zhanqi_download']
|
|||||||
|
|
||||||
from ..common import *
|
from ..common import *
|
||||||
import json
|
import json
|
||||||
|
import base64
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
def zhanqi_download(url, output_dir = '.', merge = True, info_only = False, **kwargs):
|
def zhanqi_download(url, output_dir = '.', merge = True, info_only = False, **kwargs):
|
||||||
host_name = url.split('/')[2]
|
path = urlparse(url).path[1:]
|
||||||
first_folder_path = url.split('/')[3].split('?')[0]
|
|
||||||
|
|
||||||
if first_folder_path != 'videos': #url = "https://www.zhanqi.tv/huashan?param_s=1_0.2.0"
|
|
||||||
if first_folder_path == 'topic': #https://www.zhanqi.tv/topic/lyingman
|
|
||||||
first_folder_path = url.split('/')[4].split('?')[0]
|
|
||||||
api_url = "https://www.zhanqi.tv/api/static/v2.1/room/domain/" + first_folder_path + ".json"
|
|
||||||
api_json = json.loads(get_html(api_url))
|
|
||||||
data = api_json['data']
|
|
||||||
status = data['status']
|
|
||||||
if status != '4':
|
|
||||||
raise ValueError ("The live stream is not online!")
|
|
||||||
|
|
||||||
nickname = data['nickname']
|
|
||||||
title = nickname + ": " + data['title']
|
|
||||||
|
|
||||||
roomid = data['id']
|
|
||||||
videoId = data['videoId']
|
|
||||||
jump_url = "http://wshdl.load.cdn.zhanqi.tv/zqlive/" + videoId + ".flv?get_url=1"
|
|
||||||
jump_url = jump_url.strip('\r\n')
|
|
||||||
|
|
||||||
real_url = get_html(jump_url)
|
|
||||||
real_url = real_url.strip('\r\n')
|
|
||||||
site_info = "www.zhanqi.tv"
|
|
||||||
|
|
||||||
print_info(site_info, title, 'flv', float('inf'))
|
|
||||||
if not info_only:
|
|
||||||
download_url_ffmpeg(real_url, title, 'flv', {}, output_dir = output_dir, merge = merge)
|
|
||||||
|
|
||||||
|
if not path.startswith('videos'): #url = "https://www.zhanqi.tv/huashan?param_s=1_0.2.0"
|
||||||
|
path_list = path.split('/')
|
||||||
|
room_id = path_list[1] if path_list[0] == 'topic' else path_list[0]
|
||||||
|
zhanqi_live(room_id, merge=merge, output_dir=output_dir, info_only=info_only, **kwargs)
|
||||||
else: #url = 'https://www.zhanqi.tv/videos/Lyingman/2017/01/182308.html'
|
else: #url = 'https://www.zhanqi.tv/videos/Lyingman/2017/01/182308.html'
|
||||||
video_id = url.split('/')[-1].split('?')[0].split('.')[0]
|
video_id = path.split('.')[0].split('/')[-1]
|
||||||
assert video_id
|
zhanqi_video(video_id, merge=merge, output_dir=output_dir, info_only=info_only, **kwargs)
|
||||||
api_url = "https://www.zhanqi.tv/api/static/v2.1/video/" + video_id + ".json"
|
|
||||||
api_json = json.loads(get_html(api_url))
|
|
||||||
data = api_json['data']
|
|
||||||
|
|
||||||
title = data['title']
|
def zhanqi_live(room_id, merge=True, output_dir='.', info_only=False, **kwargs):
|
||||||
|
api_url = "https://www.zhanqi.tv/api/static/v2.1/room/domain/{}.json".format(room_id)
|
||||||
|
json_data = json.loads(get_content(api_url))['data']
|
||||||
|
status = json_data['status']
|
||||||
|
if status != '4':
|
||||||
|
raise Exception("The live stream is not online!")
|
||||||
|
|
||||||
video_url_id = data['flashvars']['VideoID']
|
nickname = json_data['nickname']
|
||||||
real_url = "http://dlvod.cdn.zhanqi.tv/" + video_url_id
|
title = nickname + ": " + json_data['title']
|
||||||
site_info = "www.zhanqi.tv/videos"
|
video_levels = base64.b64decode(json_data['flashvars']['VideoLevels']).decode('utf8')
|
||||||
|
m3u8_url = json.loads(video_levels)['streamUrl']
|
||||||
|
|
||||||
print_info(site_info, title, 'flv', float('inf'))
|
print_info(site_info, title, 'm3u8', 0, m3u8_url=m3u8_url, m3u8_type='master')
|
||||||
if not info_only:
|
if not info_only:
|
||||||
download_url_ffmpeg(real_url, title, 'flv', {}, output_dir = output_dir, merge = merge)
|
download_url_ffmpeg(m3u8_url, title, 'mp4', output_dir=output_dir, merge=merge)
|
||||||
|
|
||||||
|
def zhanqi_video(video_id, output_dir='.', info_only=False, merge=True, **kwargs):
|
||||||
|
api_url = 'https://www.zhanqi.tv/api/static/v2.1/video/{}.json'.format(video_id)
|
||||||
|
json_data = json.loads(get_content(api_url))['data']
|
||||||
|
|
||||||
|
title = json_data['title']
|
||||||
|
vid = json_data['flashvars']['VideoID']
|
||||||
|
m3u8_url = 'http://dlvod.cdn.zhanqi.tv/' + vid
|
||||||
|
urls = general_m3u8_extractor(m3u8_url)
|
||||||
|
print_info(site_info, title, 'm3u8', 0)
|
||||||
|
if not info_only:
|
||||||
|
download_urls(urls, title, 'ts', 0, output_dir=output_dir, merge=merge, **kwargs)
|
||||||
|
|
||||||
|
site_info = "www.zhanqi.tv"
|
||||||
download = zhanqi_download
|
download = zhanqi_download
|
||||||
download_playlist = playlist_not_supported('zhanqi')
|
download_playlist = playlist_not_supported('zhanqi')
|
Loading…
Reference in New Issue
Block a user