Browse Source

[showroomlive] Add extractor

totalwebcasting
Arjan Verwer 8 years ago
committed by Sergey M․
parent
commit
963bd5ecfc
No known key found for this signature in database GPG Key ID: 2C393E0F18A9236D
2 changed files with 81 additions and 0 deletions
  1. +1
    -0
      youtube_dl/extractor/extractors.py
  2. +80
    -0
      youtube_dl/extractor/showroomlive.py

+ 1
- 0
youtube_dl/extractor/extractors.py 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 (


+ 80
- 0
youtube_dl/extractor/showroomlive.py 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

Loading…
Cancel
Save