showroomlive.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from .common import InfoExtractor
  2. from ..utils import (
  3. ExtractorError,
  4. int_or_none,
  5. urljoin,
  6. )
  7. class ShowRoomLiveIE(InfoExtractor):
  8. _VALID_URL = r'https?://(?:www\.)?showroom-live\.com/(?!onlive|timetable|event|campaign|news|ranking|room)(?P<id>[^/?#&]+)'
  9. _TEST = {
  10. 'url': 'https://www.showroom-live.com/48_Nana_Okada',
  11. 'only_matching': True,
  12. }
  13. def _real_extract(self, url):
  14. broadcaster_id = self._match_id(url)
  15. webpage = self._download_webpage(url, broadcaster_id)
  16. room_id = self._search_regex(
  17. (r'SrGlobal\.roomId\s*=\s*(\d+)',
  18. r'(?:profile|room)\?room_id\=(\d+)'), webpage, 'room_id')
  19. room = self._download_json(
  20. urljoin(url, f'/api/room/profile?room_id={room_id}'),
  21. broadcaster_id)
  22. is_live = room.get('is_onlive')
  23. if is_live is not True:
  24. raise ExtractorError(f'{broadcaster_id} is offline', expected=True)
  25. uploader = room.get('performer_name') or broadcaster_id
  26. title = room.get('room_name') or room.get('main_name') or uploader
  27. streaming_url_list = self._download_json(
  28. urljoin(url, f'/api/live/streaming_url?room_id={room_id}'),
  29. broadcaster_id)['streaming_url_list']
  30. formats = []
  31. for stream in streaming_url_list:
  32. stream_url = stream.get('url')
  33. if not stream_url:
  34. continue
  35. stream_type = stream.get('type')
  36. if stream_type == 'hls':
  37. m3u8_formats = self._extract_m3u8_formats(
  38. stream_url, broadcaster_id, ext='mp4', m3u8_id='hls',
  39. live=True)
  40. for f in m3u8_formats:
  41. f['quality'] = int_or_none(stream.get('quality', 100))
  42. formats.extend(m3u8_formats)
  43. elif stream_type == 'rtmp':
  44. stream_name = stream.get('stream_name')
  45. if not stream_name:
  46. continue
  47. formats.append({
  48. 'url': stream_url,
  49. 'play_path': stream_name,
  50. 'page_url': url,
  51. 'player_url': 'https://www.showroom-live.com/assets/swf/v3/ShowRoomLive.swf',
  52. 'rtmp_live': True,
  53. 'ext': 'flv',
  54. 'format_id': 'rtmp',
  55. 'format_note': stream.get('label'),
  56. 'quality': int_or_none(stream.get('quality', 100)),
  57. })
  58. return {
  59. 'id': str(room.get('live_id') or broadcaster_id),
  60. 'title': title,
  61. 'description': room.get('description'),
  62. 'timestamp': int_or_none(room.get('current_live_started_at')),
  63. 'uploader': uploader,
  64. 'uploader_id': broadcaster_id,
  65. 'view_count': int_or_none(room.get('view_num')),
  66. 'formats': formats,
  67. 'is_live': True,
  68. }