1 from .common
import InfoExtractor
9 class ShowRoomLiveIE(InfoExtractor
):
10 _VALID_URL
= r
'https?://(?:www\.)?showroom-live\.com/(?!onlive|timetable|event|campaign|news|ranking|room)(?P<id>[^/?#&]+)'
12 'url': 'https://www.showroom-live.com/48_Nana_Okada',
13 'only_matching': True,
16 def _real_extract(self
, url
):
17 broadcaster_id
= self
._match
_id
(url
)
19 webpage
= self
._download
_webpage
(url
, broadcaster_id
)
21 room_id
= self
._search
_regex
(
22 (r
'SrGlobal\.roomId\s*=\s*(\d+)',
23 r
'(?:profile|room)\?room_id\=(\d+)'), webpage
, 'room_id')
25 room
= self
._download
_json
(
26 urljoin(url
, f
'/api/room/profile?room_id={room_id}'),
29 is_live
= room
.get('is_onlive')
30 if is_live
is not True:
31 raise ExtractorError(f
'{broadcaster_id} is offline', expected
=True)
33 uploader
= room
.get('performer_name') or broadcaster_id
34 title
= room
.get('room_name') or room
.get('main_name') or uploader
36 streaming_url_list
= self
._download
_json
(
37 urljoin(url
, f
'/api/live/streaming_url?room_id={room_id}'),
38 broadcaster_id
)['streaming_url_list']
41 for stream
in streaming_url_list
:
42 stream_url
= stream
.get('url')
45 stream_type
= stream
.get('type')
46 if stream_type
== 'hls':
47 m3u8_formats
= self
._extract
_m
3u8_formats
(
48 stream_url
, broadcaster_id
, ext
='mp4', m3u8_id
='hls',
50 for f
in m3u8_formats
:
51 f
['quality'] = int_or_none(stream
.get('quality', 100))
52 formats
.extend(m3u8_formats
)
53 elif stream_type
== 'rtmp':
54 stream_name
= stream
.get('stream_name')
59 'play_path': stream_name
,
61 'player_url': 'https://www.showroom-live.com/assets/swf/v3/ShowRoomLive.swf',
65 'format_note': stream
.get('label'),
66 'quality': int_or_none(stream
.get('quality', 100)),
70 'id': str(room
.get('live_id') or broadcaster_id
),
72 'description': room
.get('description'),
73 'timestamp': int_or_none(room
.get('current_live_started_at')),
75 'uploader_id': broadcaster_id
,
76 'view_count': int_or_none(room
.get('view_num')),