[douyutv] Improve and extract all formats

pull/5230/head
Sergey M․ 2015-03-17 22:27:33 +06:00
parent 674fb0fcc5
commit 2ca1c5aa9f
2 changed files with 46 additions and 28 deletions

View File

@ -107,7 +107,7 @@ from .dctp import DctpTvIE
from .deezer import DeezerPlaylistIE from .deezer import DeezerPlaylistIE
from .dfb import DFBIE from .dfb import DFBIE
from .dotsub import DotsubIE from .dotsub import DotsubIE
from .douyutv import DouyutvIE from .douyutv import DouyuTVIE
from .dreisat import DreiSatIE from .dreisat import DreiSatIE
from .drbonanza import DRBonanzaIE from .drbonanza import DRBonanzaIE
from .drtuber import DrTuberIE from .drtuber import DrTuberIE

View File

@ -2,58 +2,76 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from .common import InfoExtractor from .common import InfoExtractor
from ..utils import ExtractorError
from ..utils import (
ExtractorError,
)
class DouyutvIE(InfoExtractor): class DouyuTVIE(InfoExtractor):
_VALID_URL = r'http://(?:www\.)?douyutv\.com/(?P<id>[A-Za-z0-9]+)' _VALID_URL = r'http://(?:www\.)?douyutv\.com/(?P<id>[A-Za-z0-9]+)'
'''
show_status: 1 直播中 2 没有直播
'''
_TEST = { _TEST = {
'url': 'http://www.douyutv.com/iseven', 'url': 'http://www.douyutv.com/iseven',
'info_dict': { 'info_dict': {
'id': 'iseven', 'id': 'iseven',
'title': '清晨醒脑T-ara根本停不下来',
'ext': 'flv', 'ext': 'flv',
'title': 're:^清晨醒脑T-ara根本停不下来 [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$',
'description': 'md5:9e525642c25a0a24302869937cf69d17',
'thumbnail': 're:^https?://.*\.jpg$', 'thumbnail': 're:^https?://.*\.jpg$',
'uploader': '7师傅',
'uploader_id': '431925',
'is_live': True, 'is_live': True,
},
'params': {
'skip_download': True,
} }
} }
def _real_extract(self, url): def _real_extract(self, url):
video_id = self._match_id(url) video_id = self._match_id(url)
info_url = 'http://www.douyutv.com/api/client/room/' + video_id
config = self._download_json(info_url, video_id) config = self._download_json(
'http://www.douyutv.com/api/client/room/%s' % video_id, video_id)
error_code = config.get('error') data = config['data']
show_status = config['data'].get('show_status')
error_code = config.get('error', 0)
show_status = data.get('show_status')
if error_code is not 0: if error_code is not 0:
raise ExtractorError('Server reported error %i' % error_code, raise ExtractorError(
expected=True) 'Server reported error %i' % error_code, expected=True)
# 1 = live, 2 = offline
if show_status == '2': if show_status == '2':
raise ExtractorError('The live show has not yet started', raise ExtractorError(
expected=True) 'Live stream is offline', expected=True)
title = config['data'].get('room_name') base_url = data['rtmp_url']
rtmp_url = config['data'].get('rtmp_url') live_path = data['rtmp_live']
rtmp_live = config['data'].get('rtmp_live')
thumbnail = config['data'].get('room_src')
url = rtmp_url+'/'+rtmp_live title = self._live_title(data['room_name'])
description = data.get('show_details')
thumbnail = data.get('room_src')
uploader = data.get('nickname')
uploader_id = data.get('owner_uid')
multi_formats = data.get('rtmp_multi_bitrate')
if not isinstance(multi_formats, dict):
multi_formats = {}
multi_formats['live'] = live_path
formats = [{
'url': '%s/%s' % (base_url, format_path),
'format_id': format_id,
'preference': 1 if format_id == 'live' else 0,
} for format_id, format_path in multi_formats.items()]
self._sort_formats(formats)
return { return {
'id': video_id, 'id': video_id,
'title': title, 'title': title,
'ext':'flv', 'description': description,
'url': url,
'thumbnail': thumbnail, 'thumbnail': thumbnail,
'uploader': uploader,
'uploader_id': uploader_id,
'formats': formats,
'is_live': True, 'is_live': True,
# TODO more properties (see youtube_dl/extractor/common.py)
} }