mirror of
https://github.com/soimort/you-get.git
synced 2025-02-03 16:53:56 +03:00
77 lines
2.8 KiB
Python
77 lines
2.8 KiB
Python
|
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
|