mirror of
https://github.com/soimort/you-get.git
synced 2025-02-03 16:53:56 +03:00
99 lines
3.5 KiB
Python
99 lines
3.5 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from ..common import *
|
|
from ..extractor import VideoExtractor
|
|
from ..util.log import *
|
|
|
|
from json import loads
|
|
|
|
class QiE(VideoExtractor):
|
|
name = "QiE (企鹅直播)"
|
|
|
|
# Last updated: 2015-11-24
|
|
stream_types = [
|
|
{'id': 'normal', 'container': 'flv', 'video_profile': '标清'},
|
|
{'id': 'middle', 'container': 'flv', 'video_profile': '550'},
|
|
{'id': 'middle2', 'container': 'flv', 'video_profile': '900'},
|
|
]
|
|
|
|
id_dic = {i['video_profile']:(i['id']) for i in stream_types}
|
|
|
|
api_endpoint = 'http://www.qie.tv/api/v1/room/{room_id}'
|
|
game_ep = 'http://live.qq.com/game/game_details/get_game_details_info/'
|
|
|
|
def get_room_id_from_url(self, match_id):
|
|
meta = json.loads(get_content(self.game_ep + str(match_id)))
|
|
if meta['error'] != 0:
|
|
log.wtf('Error happens when accessing game_details api')
|
|
rooms = meta['data']['anchor_data']
|
|
for room in rooms:
|
|
if room['is_use_room']:
|
|
return room['room_id']
|
|
log.wtf('No room available for match {}'.format(match_id))
|
|
|
|
def get_vid_from_url(self, url):
|
|
"""Extracts video ID from live.qq.com.
|
|
"""
|
|
hit = re.search(r'live.qq.com/(\d+)', url)
|
|
if hit is not None:
|
|
return hit.group(1)
|
|
hit = re.search(r'live.qq.com/directory/match/(\d+)', url)
|
|
if hit is not None:
|
|
return self.get_room_id_from_url(hit.group(1))
|
|
html = get_content(url)
|
|
room_id = match1(html, r'room_id\":(\d+)')
|
|
if room_id is None:
|
|
log.wtf('Unknown page {}'.format(url))
|
|
return room_id
|
|
|
|
def download_playlist_by_url(self, url, **kwargs):
|
|
pass
|
|
|
|
def prepare(self, **kwargs):
|
|
if self.url:
|
|
self.vid = self.get_vid_from_url(self.url)
|
|
|
|
content = get_content(self.api_endpoint.format(room_id = self.vid))
|
|
content = loads(content)
|
|
self.title = content['data']['room_name']
|
|
rtmp_url = content['data']['rtmp_url']
|
|
#stream_avalable = [i['name'] for i in content['data']['stream']]
|
|
stream_available = {}
|
|
stream_available['normal'] = rtmp_url + '/' + content['data']['rtmp_live']
|
|
if len(content['data']['rtmp_multi_bitrate']) > 0:
|
|
for k , v in content['data']['rtmp_multi_bitrate'].items():
|
|
stream_available[k] = rtmp_url + '/' + v
|
|
|
|
for s in self.stream_types:
|
|
if s['id'] in stream_available.keys():
|
|
quality_id = s['id']
|
|
url = stream_available[quality_id]
|
|
self.streams[quality_id] = {
|
|
'container': 'flv',
|
|
'video_profile': s['video_profile'],
|
|
'size': 0,
|
|
'url': url
|
|
}
|
|
|
|
def extract(self, **kwargs):
|
|
for i in self.streams:
|
|
s = self.streams[i]
|
|
s['src'] = [s['url']]
|
|
if 'stream_id' in kwargs and kwargs['stream_id']:
|
|
# Extract the stream
|
|
stream_id = kwargs['stream_id']
|
|
|
|
if stream_id not in self.streams:
|
|
log.e('[Error] Invalid video format.')
|
|
log.e('Run \'-i\' command with no specific video format to view all available formats.')
|
|
exit(2)
|
|
else:
|
|
# Extract stream with the best quality
|
|
stream_id = self.streams_sorted[0]['id']
|
|
s['src'] = [s['url']]
|
|
|
|
site = QiE()
|
|
download = site.download_by_url
|
|
download_playlist = playlist_not_supported('QiE')
|