From 828abd71d875ef52857c3756549e7795c64553b2 Mon Sep 17 00:00:00 2001 From: MaxwellGoblin Date: Tue, 8 Aug 2017 03:38:34 +0800 Subject: [PATCH] [qq qie_video]support QiE video --- src/you_get/extractors/qie_video.py | 76 +++++++++++++++++++++++++++++ src/you_get/extractors/qq.py | 6 ++- 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/you_get/extractors/qie_video.py diff --git a/src/you_get/extractors/qie_video.py b/src/you_get/extractors/qie_video.py new file mode 100644 index 00000000..c5d96e70 --- /dev/null +++ b/src/you_get/extractors/qie_video.py @@ -0,0 +1,76 @@ +from ..common import * +from ..extractor import VideoExtractor +from ..util.log import * + +import json +import math + +class QieVideo(VideoExtractor): + name = 'QiE Video' + vid_patt = r'"stream_name":"(\d+)"' + title_patt = r'"title":"([^\"]+)"' + cdn = 'http://qietv-play.wcs.8686c.com/' + ep = 'http://api.qiecdn.com/api/v1/video/stream/{}' + stream_types = [ + {'id':'720p', 'video_profile':'1280x720', 'container':'m3u8'}, + {'id':'480p', 'video_profile':'853x480', 'container':'m3u8'} + ] + + def get_vid_from_url(self): + hit = re.search(self.__class__.vid_patt, self.page) + if hit is None: + log.wtf('Cannot get stream_id') + return hit.group(1) + + def get_title(self): + hit = re.search(self.__class__.title_patt, self.page) + if hit is None: + return self.vid + return hit.group(1).strip() + + def prepare(self, **kwargs): + self.page = get_content(self.url) + if self.vid is None: + self.vid = self.get_vid_from_url() + self.title = self.get_title() + meta = json.loads(get_content(self.__class__.ep.format(self.vid))) + if meta['code'] != 200: + log.wtf(meta['message']) + for video in meta['result']['videos']: + height = video['height'] + url = self.__class__.cdn + video['key'] + stream_meta = dict(m3u8_url=url, size=0, container='m3u8') + video_profile = '{}x{}'.format(video['width'], video['height']) + stream_meta['video_profile'] = video_profile + for stream_type in self.__class__.stream_types: + if height // 10 == int(stream_type['id'][:-1]) // 10: +# width 481, 482... 489 are all 480p here + stream_id = stream_type['id'] + self.streams[stream_id] = stream_meta + + def extract(self, **kwargs): + for stream_id in self.streams: + self.streams[stream_id]['src'], dur = general_m3u8_extractor(self.streams[stream_id]['m3u8_url']) + self.streams[stream_id]['video_profile'] += ', Duration: {}s'.format(math.floor(dur)) + +def general_m3u8_extractor(url): + dur = 0 + base_url = url[:url.rfind('/')] + m3u8_content = get_content(url).split('\n') + result = [] + for line in m3u8_content: + trimmed = line.strip() + if len(trimmed) > 0: + if trimmed.startswith('#'): + if trimmed.startswith('#EXTINF'): + t_str = re.search(r'(\d+\.\d+)', trimmed).group(1) + dur += float(t_str) + else: + if trimmed.startswith('http'): + result.append(trimmed) + else: + result.append(base_url + '/' + trimmed) + return result, dur + +site = QieVideo() +download_by_url = site.download_by_url diff --git a/src/you_get/extractors/qq.py b/src/you_get/extractors/qq.py index d62362be..fedaf5f9 100644 --- a/src/you_get/extractors/qq.py +++ b/src/you_get/extractors/qq.py @@ -5,6 +5,7 @@ __all__ = ['qq_download'] from ..common import * from ..util.log import * from .qie import download as qieDownload +from .qie_video import download_by_url as qie_video_download from urllib.parse import urlparse,parse_qs def qq_download_by_vid(vid, title, output_dir='.', merge=True, info_only=False): @@ -92,7 +93,10 @@ def qq_download(url, output_dir='.', merge=True, info_only=False, **kwargs): return if 'live.qq.com' in url: - qieDownload(url, output_dir=output_dir, merge=merge, info_only=info_only) + if 'live.qq.com/video/v' in url: + qie_video_download(url, output_dir=output_dir, merge=merge, info_only=info_only, **kwargs) + else: + qieDownload(url, output_dir=output_dir, merge=merge, info_only=info_only) return if 'mp.weixin.qq.com/s?' in url: