text: # coding: utf-8
  from __future__ import unicode_literals
  
  from ..compat import compat_str
  from ..utils import ExtractorError, int_or_none, urljoin
  from .common import InfoExtractor
  
  
  class ShowRoomLiveIE(InfoExtractor):
      _VALID_URL = r"https?://(?:www\.)?showroom-live\.com/(?!onlive|timetable|event|campaign|news|ranking|room)(?P<id>[^/?#&]+)"
      _TEST = {
          "url": "https://www.showroom-live.com/48_Nana_Okada",
          "only_matching": True,
      }
  
      def _real_extract(self, url):
          broadcaster_id = self._match_id(url)
  
          webpage = self._download_webpage(url, broadcaster_id)
  
          room_id = self._search_regex(
              (r"SrGlobal\.roomId\s*=\s*(\d+)", r"(?:profile|room)\?room_id\=(\d+)"),
              webpage,
              "room_id",
          )
  
          room = self._download_json(
              urljoin(url, "/api/room/profile?room_id=%s" % room_id), broadcaster_id
          )
  
          is_live = room.get("is_onlive")
          if is_live is not True:
              raise ExtractorError("%s is offline" % broadcaster_id, expected=True)
  
          uploader = room.get("performer_name") or broadcaster_id
          title = room.get("room_name") or room.get("main_name") or uploader
  
          streaming_url_list = self._download_json(
              urljoin(url, "/api/live/streaming_url?room_id=%s" % room_id), broadcaster_id
          )["streaming_url_list"]
  
          formats = []
          for stream in streaming_url_list:
              stream_url = stream.get("url")
              if not stream_url:
                  continue
              stream_type = stream.get("type")
              if stream_type == "hls":
                  m3u8_formats = self._extract_m3u8_formats(
                      stream_url, broadcaster_id, ext="mp4", m3u8_id="hls", live=True
                  )
                  for f in m3u8_formats:
                      f["quality"] = int_or_none(stream.get("quality", 100))
                  formats.extend(m3u8_formats)
              elif stream_type == "rtmp":
                  stream_name = stream.get("stream_name")
                  if not stream_name:
                      continue
                  formats.append(
                      {
                          "url": stream_url,
                          "play_path": stream_name,
                          "page_url": url,
                          "player_url": "https://www.showroom-live.com/assets/swf/v3/ShowRoomLive.swf",
                          "rtmp_live": True,
                          "ext": "flv",
                          "format_id": "rtmp",
                          "format_note": stream.get("label"),
                          "quality": int_or_none(stream.get("quality", 100)),
                      }
                  )
          self._sort_formats(formats)
  
          return {
              "id": compat_str(room.get("live_id") or broadcaster_id),
              "title": self._live_title(title),
              "description": room.get("description"),
              "timestamp": int_or_none(room.get("current_live_started_at")),
              "uploader": uploader,
              "uploader_id": broadcaster_id,
              "view_count": int_or_none(room.get("view_num")),
              "formats": formats,
              "is_live": True,
          }
  