We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
plugins.showroom: streamlink unable to download any live streams from showroom.com
### Checklist

- [X] This is a [plugin issue](https://streamlink.github.io/plugins.html) and not [a different kind of issue](https://github.com/streamlink/streamlink/issues/new/choose)
- [X] [I have read the contribution guidelines](https://github.com/streamlink/streamlink/blob/master/CONTRIBUTING.md#contributing-to-streamlink)
- [X] [I have checked the list of open and recently closed plugin issues](https://github.com/streamlink/streamlink/issues?q=is%3Aissue+label%3A%22plugin+issue%22)
- [X] [I have checked the commit log of the master branch](https://github.com/streamlink/streamlink/commits/master)

### Streamlink version

streamlink 6.7.2

### Description

On 2024.03.29, showroom.com made some changes to their site.

When I try to use streamlink to record a showroom url that is online, for eg. https://www.showroom-live.com/r/48_KOJIMA_AIKO

>    streamlink --loglevel debug https://www.showroom-live.com/r/48_KOJIMA_AIKO best -o testing.ts

the expected behavior is that it should return this:

>  [cli][info] Found matching plugin showroom for URL https://www.showroom-live.com/r/48_KOJIMA_AIKO
    [utils.l10n][debug] Language code: en_US
    [cli][info] Available streams: 144p (worst), 360p (best)
 [cli][info] Opening stream: 360p (hls)
 [cli][info] Writing output to D:\testing.ts
 [cli][debug] Checking file output
 [stream.hls][debug] Reloading playlist
 [cli][debug] Pre-buffering 8192 bytes
 [stream.hls][debug] First Sequence: 1; Last Sequence: 4
 [stream.hls][debug] Start offset: 0; Duration: None; Start Sequence: 3; End Sequence: None
 [stream.hls][debug] Adding segment 3 to queue
 [stream.hls][debug] Adding segment 4 to queue

However, when I tried recording a showroom stream on 2024.03.29, I got an error stating that the stream is restricted.

> L:\>streamlink --loglevel debug https://www.showroom-live.com/r/48_KOJIMA_AIKO best -o sample.ts
[session][debug] Loading plugin: showroom
[cli][debug] OS:         Windows 10
[cli][debug] Python:     3.10.6
[cli][debug] OpenSSL:    OpenSSL 1.1.1n  15 Mar 2022
[cli][debug] Streamlink: 6.7.2
[cli][debug] Dependencies:
[cli][debug]  certifi: 2022.6.15
[cli][debug]  exceptiongroup: 1.2.0
[cli][debug]  isodate: 0.6.1
[cli][debug]  lxml: 4.9.1
[cli][debug]  pycountry: 22.3.5
[cli][debug]  pycryptodome: 3.16.0
[cli][debug]  PySocks: 1.7.1
[cli][debug]  requests: 2.28.2
[cli][debug]  trio: 0.25.0
[cli][debug]  trio-websocket: 0.11.1
[cli][debug]  typing-extensions: 4.5.0
[cli][debug]  urllib3: 1.26.12
[cli][debug]  websocket-client: 1.4.0
[cli][debug] Arguments:
[cli][debug]  url=https://www.showroom-live.com/r/48_KOJIMA_AIKO
[cli][debug]  stream=['best']
[cli][debug]  --loglevel=debug
[cli][debug]  --output=sample.ts
[cli][info] Found matching plugin showroom for URL https://www.showroom-live.com/r/48_KOJIMA_AIKO
[plugins.showroom][debug] Room ID: 270117
[plugins.showroom][error] This stream is restricted
error: No playable streams found on this URL: https://www.showroom-live.com/r/48_KOJIMA_AIKO

- I tried downloading 12 different showroom live streams, but received the same error for all of them.
- I tried changing my IP address using a VPN to a Japan/Hong Kong/Singapore/Germany/USA IP, but the same problem persist.
- Next, I tried to locate the m3u8 address of the showroom stream using stream detector addon (Firefox) and use the .m3u8 address directly in streamlink:

> streamlink --loglevel debug https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8 best -o testing.ts

Streamlink was able to work as normal and download successfully:

> D:\>streamlink --loglevel debug https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8 best -o testing.ts

> [session][debug] Loading plugin: hls
[cli][debug] OS:         Windows 10
[cli][debug] Python:     3.10.6
[cli][debug] OpenSSL:    OpenSSL 1.1.1n  15 Mar 2022
[cli][debug] Streamlink: 6.7.2
[cli][debug] Dependencies:
[cli][debug]  certifi: 2022.6.15
[cli][debug]  exceptiongroup: 1.2.0
[cli][debug]  isodate: 0.6.1
[cli][debug]  lxml: 4.9.1
[cli][debug]  pycountry: 22.3.5
[cli][debug]  pycryptodome: 3.16.0
[cli][debug]  PySocks: 1.7.1
[cli][debug]  requests: 2.28.2
[cli][debug]  trio: 0.25.0
[cli][debug]  trio-websocket: 0.11.1
[cli][debug]  typing-extensions: 4.5.0
[cli][debug]  urllib3: 1.26.12
[cli][debug]  websocket-client: 1.4.0
[cli][debug] Arguments:
[cli][debug]  url=https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8
[cli][debug]  stream=['best']
[cli][debug]  --loglevel=debug
[cli][debug]  --output=testing.ts
[cli][info] Found matching plugin hls for URL https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8
[plugins.hls][debug] URL=https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8; params={}
[utils.l10n][debug] Language code: en_US
[cli][info] Available streams: live (worst, best)
[cli][info] Opening stream: live (hls)
[cli][info] Writing output to
D:\testing.ts
[cli][debug] Checking file output
[stream.hls][debug] Reloading playlist
[cli][debug] Pre-buffering 8192 bytes
[stream.hls][debug] First Sequence: 8904; Last Sequence: 8906
[stream.hls][debug] Start offset: 0; Duration: None; Start Sequence: 8904; End Sequence: None
[stream.hls][debug] Adding segment 8904 to queue
[stream.hls][debug] Adding segment 8905 to queue
[stream.hls][debug] Adding segment 8906 to queue
[stream.hls][debug] Writing segment 8904 to output
[stream.hls][debug] Segment 8904 complete
[cli][debug] Writing stream to output
[download] Written 538.66 KiB to L:\testing.ts (0s)                                                                    [stream.hls][debug] Writing segment 8905 to output
[stream.hls][debug] Segment 8905 complete
[download] Written 1.17 MiB to L:\testing.ts (0s)                                                                      [stream.hls][debug] Writing segment 8906 to output
[stream.hls][debug] Segment 8906 complete
[download] Written 1.73 MiB to L:\testing.ts (1s)                                                                      [stream.hls][debug] Reloading playlist

I was thinking that this might be a streamlink plugin issue and not Showroom disabling their API, because I tried testing with a Japanese GUI ffmpeg based showroom downloader, called ショールーム録画っち (https://www.skypower.xyz/showroom_rokugatch.html). I was able to download streams successfully by just entering the showroom url.





### Debug log

```text
L:\>streamlink --loglevel debug https://www.showroom-live.com/r/48_KOJIMA_AIKO best -o sample.ts
[session][debug] Loading plugin: showroom
[cli][debug] OS:         Windows 10
[cli][debug] Python:     3.10.6
[cli][debug] OpenSSL:    OpenSSL 1.1.1n  15 Mar 2022
[cli][debug] Streamlink: 6.7.2
[cli][debug] Dependencies:
[cli][debug]  certifi: 2022.6.15
[cli][debug]  exceptiongroup: 1.2.0
[cli][debug]  isodate: 0.6.1
[cli][debug]  lxml: 4.9.1
[cli][debug]  pycountry: 22.3.5
[cli][debug]  pycryptodome: 3.16.0
[cli][debug]  PySocks: 1.7.1
[cli][debug]  requests: 2.28.2
[cli][debug]  trio: 0.25.0
[cli][debug]  trio-websocket: 0.11.1
[cli][debug]  typing-extensions: 4.5.0
[cli][debug]  urllib3: 1.26.12
[cli][debug]  websocket-client: 1.4.0
[cli][debug] Arguments:
[cli][debug]  url=https://www.showroom-live.com/r/48_KOJIMA_AIKO
[cli][debug]  stream=['best']
[cli][debug]  --loglevel=debug
[cli][debug]  --output=sample.ts
[cli][info] Found matching plugin showroom for URL https://www.showroom-live.com/r/48_KOJIMA_AIKO
[plugins.showroom][debug] Room ID: 270117
[plugins.showroom][error] This stream is restricted
error: No playable streams found on this URL: https://www.showroom-live.com/r/48_KOJIMA_AIKO
```


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/streamlink/plugins/showroom.py`
Content:
```
1 """
2 $description Japanese live-streaming service used primarily by Japanese idols & voice actors and their fans.
3 $url showroom-live.com
4 $type live
5 $metadata title
6 """
7 
8 import logging
9 import re
10 from urllib.parse import parse_qsl, urlparse
11 
12 from streamlink.plugin import Plugin, pluginmatcher
13 from streamlink.plugin.api import validate
14 from streamlink.stream.hls import HLSStream
15 
16 
17 log = logging.getLogger(__name__)
18 
19 
20 @pluginmatcher(re.compile(
21     r"https?://(?:\w+\.)?showroom-live\.com/",
22 ))
23 class Showroom(Plugin):
24     LIVE_STATUS = 2
25 
26     def __init__(self, *args, **kwargs):
27         super().__init__(*args, **kwargs)
28         self.session.set_option("hls-playlist-reload-time", "segment")
29 
30     def _get_streams(self):
31         room_id = self.session.http.get(
32             self.url,
33             schema=validate.Schema(
34                 validate.parse_html(),
35                 validate.xml_xpath_string(".//nav//a[contains(@href,'/room/profile?')]/@href"),
36                 validate.none_or_all(
37                     validate.transform(lambda _url_profile: dict(parse_qsl(urlparse(_url_profile).query))),
38                     validate.get("room_id"),
39                 ),
40             ),
41         )
42         if not room_id:
43             return
44 
45         log.debug(f"Room ID: {room_id}")
46 
47         live_status, self.title = self.session.http.get(
48             "https://www.showroom-live.com/api/live/live_info",
49             params={
50                 "room_id": room_id,
51             },
52             schema=validate.Schema(
53                 validate.parse_json(),
54                 {
55                     "live_status": int,
56                     "room_name": str,
57                 },
58                 validate.union_get(
59                     "live_status",
60                     "room_name",
61                 ),
62             ),
63         )
64         if live_status != self.LIVE_STATUS:
65             log.info("This stream is currently offline")
66             return
67 
68         url = self.session.http.get(
69             "https://www.showroom-live.com/api/live/streaming_url",
70             params={
71                 "room_id": room_id,
72                 "abr_available": 1,
73             },
74             schema=validate.Schema(
75                 validate.parse_json(),
76                 {"streaming_url_list": [{
77                     "type": str,
78                     "url": validate.url(),
79                 }]},
80                 validate.get("streaming_url_list"),
81                 validate.filter(lambda p: p["type"] == "hls_all"),
82                 validate.get((0, "url")),
83             ),
84         )
85 
86         res = self.session.http.get(url, acceptable_status=(200, 403, 404))
87         if res.headers["Content-Type"] != "application/x-mpegURL":
88             log.error("This stream is restricted")
89             return
90 
91         return HLSStream.parse_variant_playlist(self.session, url)
92 
93 
94 __plugin__ = Showroom
95
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/streamlink/plugins/showroom.py b/src/streamlink/plugins/showroom.py
--- a/src/streamlink/plugins/showroom.py
+++ b/src/streamlink/plugins/showroom.py
@@ -84,7 +84,7 @@
         )
 
         res = self.session.http.get(url, acceptable_status=(200, 403, 404))
-        if res.headers["Content-Type"] != "application/x-mpegURL":
+        if res.headers["Content-Type"] not in ("application/x-mpegURL", "application/vnd.apple.mpegurl"):
             log.error("This stream is restricted")
             return

{"golden_diff": "diff --git a/src/streamlink/plugins/showroom.py b/src/streamlink/plugins/showroom.py\n--- a/src/streamlink/plugins/showroom.py\n+++ b/src/streamlink/plugins/showroom.py\n@@ -84,7 +84,7 @@\n         )\n \n         res = self.session.http.get(url, acceptable_status=(200, 403, 404))\n-        if res.headers[\"Content-Type\"] != \"application/x-mpegURL\":\n+        if res.headers[\"Content-Type\"] not in (\"application/x-mpegURL\", \"application/vnd.apple.mpegurl\"):\n             log.error(\"This stream is restricted\")\n             return\n", "issue": "plugins.showroom: streamlink unable to download any live streams from showroom.com\n### Checklist\r\n\r\n- [X] This is a [plugin issue](https://streamlink.github.io/plugins.html) and not [a different kind of issue](https://github.com/streamlink/streamlink/issues/new/choose)\r\n- [X] [I have read the contribution guidelines](https://github.com/streamlink/streamlink/blob/master/CONTRIBUTING.md#contributing-to-streamlink)\r\n- [X] [I have checked the list of open and recently closed plugin issues](https://github.com/streamlink/streamlink/issues?q=is%3Aissue+label%3A%22plugin+issue%22)\r\n- [X] [I have checked the commit log of the master branch](https://github.com/streamlink/streamlink/commits/master)\r\n\r\n### Streamlink version\r\n\r\nstreamlink 6.7.2\r\n\r\n### Description\r\n\r\nOn 2024.03.29, showroom.com made some changes to their site.\r\n\r\nWhen I try to use streamlink to record a showroom url that is online, for eg. https://www.showroom-live.com/r/48_KOJIMA_AIKO\r\n\r\n>    streamlink --loglevel debug https://www.showroom-live.com/r/48_KOJIMA_AIKO best -o testing.ts\r\n\r\nthe expected behavior is that it should return this:\r\n\r\n>  [cli][info] Found matching plugin showroom for URL https://www.showroom-live.com/r/48_KOJIMA_AIKO\r\n    [utils.l10n][debug] Language code: en_US\r\n    [cli][info] Available streams: 144p (worst), 360p (best)\r\n [cli][info] Opening stream: 360p (hls)\r\n [cli][info] Writing output to D:\\testing.ts\r\n [cli][debug] Checking file output\r\n [stream.hls][debug] Reloading playlist\r\n [cli][debug] Pre-buffering 8192 bytes\r\n [stream.hls][debug] First Sequence: 1; Last Sequence: 4\r\n [stream.hls][debug] Start offset: 0; Duration: None; Start Sequence: 3; End Sequence: None\r\n [stream.hls][debug] Adding segment 3 to queue\r\n [stream.hls][debug] Adding segment 4 to queue\r\n\r\nHowever, when I tried recording a showroom stream on 2024.03.29, I got an error stating that the stream is restricted.\r\n\r\n> L:\\>streamlink --loglevel debug https://www.showroom-live.com/r/48_KOJIMA_AIKO best -o sample.ts\r\n[session][debug] Loading plugin: showroom\r\n[cli][debug] OS:         Windows 10\r\n[cli][debug] Python:     3.10.6\r\n[cli][debug] OpenSSL:    OpenSSL 1.1.1n  15 Mar 2022\r\n[cli][debug] Streamlink: 6.7.2\r\n[cli][debug] Dependencies:\r\n[cli][debug]  certifi: 2022.6.15\r\n[cli][debug]  exceptiongroup: 1.2.0\r\n[cli][debug]  isodate: 0.6.1\r\n[cli][debug]  lxml: 4.9.1\r\n[cli][debug]  pycountry: 22.3.5\r\n[cli][debug]  pycryptodome: 3.16.0\r\n[cli][debug]  PySocks: 1.7.1\r\n[cli][debug]  requests: 2.28.2\r\n[cli][debug]  trio: 0.25.0\r\n[cli][debug]  trio-websocket: 0.11.1\r\n[cli][debug]  typing-extensions: 4.5.0\r\n[cli][debug]  urllib3: 1.26.12\r\n[cli][debug]  websocket-client: 1.4.0\r\n[cli][debug] Arguments:\r\n[cli][debug]  url=https://www.showroom-live.com/r/48_KOJIMA_AIKO\r\n[cli][debug]  stream=['best']\r\n[cli][debug]  --loglevel=debug\r\n[cli][debug]  --output=sample.ts\r\n[cli][info] Found matching plugin showroom for URL https://www.showroom-live.com/r/48_KOJIMA_AIKO\r\n[plugins.showroom][debug] Room ID: 270117\r\n[plugins.showroom][error] This stream is restricted\r\nerror: No playable streams found on this URL: https://www.showroom-live.com/r/48_KOJIMA_AIKO\r\n\r\n- I tried downloading 12 different showroom live streams, but received the same error for all of them.\r\n- I tried changing my IP address using a VPN to a Japan/Hong Kong/Singapore/Germany/USA IP, but the same problem persist.\r\n- Next, I tried to locate the m3u8 address of the showroom stream using stream detector addon (Firefox) and use the .m3u8 address directly in streamlink:\r\n\r\n> streamlink --loglevel debug https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8 best -o testing.ts\r\n\r\nStreamlink was able to work as normal and download successfully:\r\n\r\n> D:\\>streamlink --loglevel debug https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8 best -o testing.ts\r\n\r\n> [session][debug] Loading plugin: hls\r\n[cli][debug] OS:         Windows 10\r\n[cli][debug] Python:     3.10.6\r\n[cli][debug] OpenSSL:    OpenSSL 1.1.1n  15 Mar 2022\r\n[cli][debug] Streamlink: 6.7.2\r\n[cli][debug] Dependencies:\r\n[cli][debug]  certifi: 2022.6.15\r\n[cli][debug]  exceptiongroup: 1.2.0\r\n[cli][debug]  isodate: 0.6.1\r\n[cli][debug]  lxml: 4.9.1\r\n[cli][debug]  pycountry: 22.3.5\r\n[cli][debug]  pycryptodome: 3.16.0\r\n[cli][debug]  PySocks: 1.7.1\r\n[cli][debug]  requests: 2.28.2\r\n[cli][debug]  trio: 0.25.0\r\n[cli][debug]  trio-websocket: 0.11.1\r\n[cli][debug]  typing-extensions: 4.5.0\r\n[cli][debug]  urllib3: 1.26.12\r\n[cli][debug]  websocket-client: 1.4.0\r\n[cli][debug] Arguments:\r\n[cli][debug]  url=https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8\r\n[cli][debug]  stream=['best']\r\n[cli][debug]  --loglevel=debug\r\n[cli][debug]  --output=testing.ts\r\n[cli][info] Found matching plugin hls for URL https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8\r\n[plugins.hls][debug] URL=https://hls-css.live.showroom-live.com/live/66f871b4d33f747c738e608bfab98e9fef1aa2d402df70ee64ae4c3fcc1357b1_sourceabr.m3u8; params={}\r\n[utils.l10n][debug] Language code: en_US\r\n[cli][info] Available streams: live (worst, best)\r\n[cli][info] Opening stream: live (hls)\r\n[cli][info] Writing output to\r\nD:\\testing.ts\r\n[cli][debug] Checking file output\r\n[stream.hls][debug] Reloading playlist\r\n[cli][debug] Pre-buffering 8192 bytes\r\n[stream.hls][debug] First Sequence: 8904; Last Sequence: 8906\r\n[stream.hls][debug] Start offset: 0; Duration: None; Start Sequence: 8904; End Sequence: None\r\n[stream.hls][debug] Adding segment 8904 to queue\r\n[stream.hls][debug] Adding segment 8905 to queue\r\n[stream.hls][debug] Adding segment 8906 to queue\r\n[stream.hls][debug] Writing segment 8904 to output\r\n[stream.hls][debug] Segment 8904 complete\r\n[cli][debug] Writing stream to output\r\n[download] Written 538.66 KiB to L:\\testing.ts (0s)                                                                    [stream.hls][debug] Writing segment 8905 to output\r\n[stream.hls][debug] Segment 8905 complete\r\n[download] Written 1.17 MiB to L:\\testing.ts (0s)                                                                      [stream.hls][debug] Writing segment 8906 to output\r\n[stream.hls][debug] Segment 8906 complete\r\n[download] Written 1.73 MiB to L:\\testing.ts (1s)                                                                      [stream.hls][debug] Reloading playlist\r\n\r\nI was thinking that this might be a streamlink plugin issue and not Showroom disabling their API, because I tried testing with a Japanese GUI ffmpeg based showroom downloader, called \u30b7\u30e7\u30fc\u30eb\u30fc\u30e0\u9332\u753b\u3063\u3061 (https://www.skypower.xyz/showroom_rokugatch.html). I was able to download streams successfully by just entering the showroom url.\r\n\r\n\r\n\r\n\r\n\r\n### Debug log\r\n\r\n```text\r\nL:\\>streamlink --loglevel debug https://www.showroom-live.com/r/48_KOJIMA_AIKO best -o sample.ts\r\n[session][debug] Loading plugin: showroom\r\n[cli][debug] OS:         Windows 10\r\n[cli][debug] Python:     3.10.6\r\n[cli][debug] OpenSSL:    OpenSSL 1.1.1n  15 Mar 2022\r\n[cli][debug] Streamlink: 6.7.2\r\n[cli][debug] Dependencies:\r\n[cli][debug]  certifi: 2022.6.15\r\n[cli][debug]  exceptiongroup: 1.2.0\r\n[cli][debug]  isodate: 0.6.1\r\n[cli][debug]  lxml: 4.9.1\r\n[cli][debug]  pycountry: 22.3.5\r\n[cli][debug]  pycryptodome: 3.16.0\r\n[cli][debug]  PySocks: 1.7.1\r\n[cli][debug]  requests: 2.28.2\r\n[cli][debug]  trio: 0.25.0\r\n[cli][debug]  trio-websocket: 0.11.1\r\n[cli][debug]  typing-extensions: 4.5.0\r\n[cli][debug]  urllib3: 1.26.12\r\n[cli][debug]  websocket-client: 1.4.0\r\n[cli][debug] Arguments:\r\n[cli][debug]  url=https://www.showroom-live.com/r/48_KOJIMA_AIKO\r\n[cli][debug]  stream=['best']\r\n[cli][debug]  --loglevel=debug\r\n[cli][debug]  --output=sample.ts\r\n[cli][info] Found matching plugin showroom for URL https://www.showroom-live.com/r/48_KOJIMA_AIKO\r\n[plugins.showroom][debug] Room ID: 270117\r\n[plugins.showroom][error] This stream is restricted\r\nerror: No playable streams found on this URL: https://www.showroom-live.com/r/48_KOJIMA_AIKO\r\n```\r\n\n", "before_files": [{"content": "\"\"\"\n$description Japanese live-streaming service used primarily by Japanese idols & voice actors and their fans.\n$url showroom-live.com\n$type live\n$metadata title\n\"\"\"\n\nimport logging\nimport re\nfrom urllib.parse import parse_qsl, urlparse\n\nfrom streamlink.plugin import Plugin, pluginmatcher\nfrom streamlink.plugin.api import validate\nfrom streamlink.stream.hls import HLSStream\n\n\nlog = logging.getLogger(__name__)\n\n\n@pluginmatcher(re.compile(\n    r\"https?://(?:\\w+\\.)?showroom-live\\.com/\",\n))\nclass Showroom(Plugin):\n    LIVE_STATUS = 2\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.session.set_option(\"hls-playlist-reload-time\", \"segment\")\n\n    def _get_streams(self):\n        room_id = self.session.http.get(\n            self.url,\n            schema=validate.Schema(\n                validate.parse_html(),\n                validate.xml_xpath_string(\".//nav//a[contains(@href,'/room/profile?')]/@href\"),\n                validate.none_or_all(\n                    validate.transform(lambda _url_profile: dict(parse_qsl(urlparse(_url_profile).query))),\n                    validate.get(\"room_id\"),\n                ),\n            ),\n        )\n        if not room_id:\n            return\n\n        log.debug(f\"Room ID: {room_id}\")\n\n        live_status, self.title = self.session.http.get(\n            \"https://www.showroom-live.com/api/live/live_info\",\n            params={\n                \"room_id\": room_id,\n            },\n            schema=validate.Schema(\n                validate.parse_json(),\n                {\n                    \"live_status\": int,\n                    \"room_name\": str,\n                },\n                validate.union_get(\n                    \"live_status\",\n                    \"room_name\",\n                ),\n            ),\n        )\n        if live_status != self.LIVE_STATUS:\n            log.info(\"This stream is currently offline\")\n            return\n\n        url = self.session.http.get(\n            \"https://www.showroom-live.com/api/live/streaming_url\",\n            params={\n                \"room_id\": room_id,\n                \"abr_available\": 1,\n            },\n            schema=validate.Schema(\n                validate.parse_json(),\n                {\"streaming_url_list\": [{\n                    \"type\": str,\n                    \"url\": validate.url(),\n                }]},\n                validate.get(\"streaming_url_list\"),\n                validate.filter(lambda p: p[\"type\"] == \"hls_all\"),\n                validate.get((0, \"url\")),\n            ),\n        )\n\n        res = self.session.http.get(url, acceptable_status=(200, 403, 404))\n        if res.headers[\"Content-Type\"] != \"application/x-mpegURL\":\n            log.error(\"This stream is restricted\")\n            return\n\n        return HLSStream.parse_variant_playlist(self.session, url)\n\n\n__plugin__ = Showroom\n", "path": "src/streamlink/plugins/showroom.py"}], "after_files": [{"content": "\"\"\"\n$description Japanese live-streaming service used primarily by Japanese idols & voice actors and their fans.\n$url showroom-live.com\n$type live\n$metadata title\n\"\"\"\n\nimport logging\nimport re\nfrom urllib.parse import parse_qsl, urlparse\n\nfrom streamlink.plugin import Plugin, pluginmatcher\nfrom streamlink.plugin.api import validate\nfrom streamlink.stream.hls import HLSStream\n\n\nlog = logging.getLogger(__name__)\n\n\n@pluginmatcher(re.compile(\n    r\"https?://(?:\\w+\\.)?showroom-live\\.com/\",\n))\nclass Showroom(Plugin):\n    LIVE_STATUS = 2\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.session.set_option(\"hls-playlist-reload-time\", \"segment\")\n\n    def _get_streams(self):\n        room_id = self.session.http.get(\n            self.url,\n            schema=validate.Schema(\n                validate.parse_html(),\n                validate.xml_xpath_string(\".//nav//a[contains(@href,'/room/profile?')]/@href\"),\n                validate.none_or_all(\n                    validate.transform(lambda _url_profile: dict(parse_qsl(urlparse(_url_profile).query))),\n                    validate.get(\"room_id\"),\n                ),\n            ),\n        )\n        if not room_id:\n            return\n\n        log.debug(f\"Room ID: {room_id}\")\n\n        live_status, self.title = self.session.http.get(\n            \"https://www.showroom-live.com/api/live/live_info\",\n            params={\n                \"room_id\": room_id,\n            },\n            schema=validate.Schema(\n                validate.parse_json(),\n                {\n                    \"live_status\": int,\n                    \"room_name\": str,\n                },\n                validate.union_get(\n                    \"live_status\",\n                    \"room_name\",\n                ),\n            ),\n        )\n        if live_status != self.LIVE_STATUS:\n            log.info(\"This stream is currently offline\")\n            return\n\n        url = self.session.http.get(\n            \"https://www.showroom-live.com/api/live/streaming_url\",\n            params={\n                \"room_id\": room_id,\n                \"abr_available\": 1,\n            },\n            schema=validate.Schema(\n                validate.parse_json(),\n                {\"streaming_url_list\": [{\n                    \"type\": str,\n                    \"url\": validate.url(),\n                }]},\n                validate.get(\"streaming_url_list\"),\n                validate.filter(lambda p: p[\"type\"] == \"hls_all\"),\n                validate.get((0, \"url\")),\n            ),\n        )\n\n        res = self.session.http.get(url, acceptable_status=(200, 403, 404))\n        if res.headers[\"Content-Type\"] not in (\"application/x-mpegURL\", \"application/vnd.apple.mpegurl\"):\n            log.error(\"This stream is restricted\")\n            return\n\n        return HLSStream.parse_variant_playlist(self.session, url)\n\n\n__plugin__ = Showroom\n", "path": "src/streamlink/plugins/showroom.py"}]}