1
0
Fork 0
mirror of https://github.com/ytdl-org/youtube-dl.git synced 2024-11-28 21:22:13 +00:00

[showroomlive] Add extractor

This commit is contained in:
Arjan Verwer 2016-12-14 21:43:54 +01:00 committed by Sergey M․
parent 51378d359e
commit 963bd5ecfc
No known key found for this signature in database
GPG key ID: 2C393E0F18A9236D
2 changed files with 81 additions and 0 deletions

View file

@ -825,6 +825,7 @@ from .shared import (
VivoIE, VivoIE,
) )
from .sharesix import ShareSixIE from .sharesix import ShareSixIE
from .showroomlive import ShowroomLiveIE
from .sina import SinaIE from .sina import SinaIE
from .sixplay import SixPlayIE from .sixplay import SixPlayIE
from .skynewsarabia import ( from .skynewsarabia import (

View file

@ -0,0 +1,80 @@
# coding: utf-8
from __future__ import unicode_literals
from .common import InfoExtractor
from ..utils import ExtractorError, compat_urlparse
class ShowroomLiveIE(InfoExtractor):
_VALID_URL = r'https?://(?:www\.)?showroom-live\.com/(?P<id>[0-9a-zA-Z_]+)'
_TEST = {
'url': 'https://www.showroom-live.com/48_Nana_Okada',
'skip': 'Only live broadcasts, can\'t predict test case.',
'info_dict': {
'id': '48_Nana_Okada',
'ext': 'mp4',
'uploader_id': '48_Nana_Okada',
}
}
def _real_extract(self, url):
broadcaster_id = self._match_id(url)
# There is no showroom on these pages.
if broadcaster_id in ['onlive', 'timetable', 'event', 'campaign', 'news', 'ranking']:
raise ExtractorError('URL %s does not contain a showroom' % url)
# Retrieve the information we need
webpage = self._download_webpage(url, broadcaster_id)
room_id = self._search_regex(r'profile\?room_id\=(\d+)', webpage, 'room_id')
room_url = compat_urlparse.urljoin(url, "/api/room/profile?room_id=%s") % room_id
room = self._download_json(room_url, broadcaster_id)
is_live = room.get('is_onlive')
if not is_live:
raise ExtractorError('%s their showroom is not live' % broadcaster_id)
# Prepare and return the information
uploader = room.get('performer_name') or broadcaster_id # performer_name can be an empty string.
title = room.get('room_name', room.get('main_name', "%s's Showroom" % uploader))
return {
'is_live': is_live,
'id': str(room.get('live_id')),
'timestamp': room.get('current_live_started_at'),
'uploader': uploader,
'uploader_id': broadcaster_id,
'title': title,
'description': room.get('description'),
'formats': self._extract_formats(url, broadcaster_id, room_id)
}
def _extract_formats(self, url, broadcaster_id, room_id):
formats = []
stream_url = compat_urlparse.urljoin(url, "/api/live/streaming_url?room_id=%s") % room_id
streaming_url_list = self._download_json(stream_url, broadcaster_id).get('streaming_url_list', [])
for stream in streaming_url_list:
if stream.get('type') == "hls":
formats.extend(self._extract_m3u8_formats(
stream.get('url'),
broadcaster_id,
ext='mp4',
m3u8_id='hls',
preference=stream.get('quality', 100),
live=True
))
elif stream.get('type') == 'rtmp':
url = stream.get('url') + '/' + stream.get('stream_name')
formats.append({
'url': url,
'format_id': 'rtmp',
'protocol': 'rtmp',
'ext': 'flv',
'preference': stream.get('quality', 100),
'format_note': stream.get('label')
})
self._sort_formats(formats)
return formats