Repository: streamlink/streamlink

Issue:
plugins.wasd: service gone
### 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

6.4.2

### Description

A few days ago, the service [gone](https://mts.ru/personal/novosti/2023-12-05/vstrechajte-polzovatelskuyu-videoplatformu-nuum). Now this [nuum.ru](https://nuum.ru).

Though we could easily replace the plugin, but I'm not sure it's worth adding it to upstream, because it's a beta version.
<details>

```diff
diff --git a/src/streamlink/plugins/wasd.py b/src/streamlink/plugins/wasd.py
index 7d61304e..656a16eb 100644
--- a/src/streamlink/plugins/wasd.py
+++ b/src/streamlink/plugins/wasd.py
@@ -16,7 +16,7 @@ log = logging.getLogger(__name__)
 
 
 @pluginmatcher(re.compile(
-    r"https?://(?:www\.)?wasd\.tv/(?P<nickname>[^/]+)/?$",
+    r"https?://(?:www\.)?nuum\.ru/channel/(?P<nickname>[^/]+)/?$",
 ))
 class WASD(Plugin):
     _media_schema = validate.Schema({
@@ -53,11 +53,11 @@ class WASD(Plugin):
 
     def _get_streams(self):
         nickname = self.match.group("nickname")
-        res = self.session.http.get(f"https://wasd.tv/api/channels/nicknames/{nickname}")
+        res = self.session.http.get(f"https://nuum.ru/api/channels/nicknames/{nickname}")
         channel_id = self.session.http.json(res, schema=self._api_nicknames_schema)
 
         res = self.session.http.get(
-            "https://wasd.tv/api/v2/media-containers",
+            "https://nuum.ru/api/v2/media-containers",
             params={
                 "media_container_status": "RUNNING",
                 "limit": "1",
```
</details>

### Debug log




Discussion:

Resolving patch:
diff --git a/src/streamlink/plugins/wasd.py b/src/streamlink/plugins/wasd.py
deleted file mode 100644
--- a/src/streamlink/plugins/wasd.py
+++ /dev/null
@@ -1,87 +0,0 @@
-"""
-$description Russian live-streaming social platform.
-$url wasd.tv
-$type live
-"""
-
-import logging
-import re
-
-from streamlink.plugin import Plugin, PluginError, pluginmatcher
-from streamlink.plugin.api import validate
-from streamlink.stream.hls import HLSStream
-
-
-log = logging.getLogger(__name__)
-
-
-@pluginmatcher(re.compile(
-    r"https?://(?:www\.)?wasd\.tv/(?P<nickname>[^/]+)/?$",
-))
-class WASD(Plugin):
-    _media_schema = validate.Schema({
-        "user_id": int,
-        "media_container_online_status": str,
-        "media_container_status": str,
-        "media_container_streams": [{
-            "stream_media": [{
-                "media_id": int,
-                "media_meta": {
-                    "media_url": validate.any(str, None),
-                    "media_archive_url": validate.any(str, None),
-                },
-                "media_status": validate.any("STOPPED", "RUNNING"),
-                "media_type": "HLS",
-            }],
-        }],
-    })
-    _api_schema = validate.Schema({
-        "result":
-            validate.any(
-                _media_schema,
-                validate.all(list,
-                             validate.get(0),
-                             _media_schema),
-                [],
-            ),
-    }, validate.get("result"))
-    _api_nicknames_schema = validate.Schema({
-        "result": {
-            "channel_id": int,
-        },
-    }, validate.get("result"), validate.get("channel_id"))
-
-    def _get_streams(self):
-        nickname = self.match.group("nickname")
-        res = self.session.http.get(f"https://wasd.tv/api/channels/nicknames/{nickname}")
-        channel_id = self.session.http.json(res, schema=self._api_nicknames_schema)
-
-        res = self.session.http.get(
-            "https://wasd.tv/api/v2/media-containers",
-            params={
-                "media_container_status": "RUNNING",
-                "limit": "1",
-                "offset": "0",
-                "channel_id": channel_id,
-                "media_container_type": "SINGLE,COOP",
-            },
-        )
-
-        json_res = self.session.http.json(res, schema=self._api_schema)
-        log.trace("{0!r}".format(json_res))
-        if not json_res:
-            raise PluginError("No data returned from URL={0}".format(res.url))
-
-        for stream in json_res["media_container_streams"]:
-            log.debug("media_container_status: {0}, media_container_online_status: {1}".format(
-                json_res["media_container_status"], json_res["media_container_online_status"]))
-            for stream_media in stream["stream_media"]:
-                if stream_media["media_status"] == "STOPPED":
-                    hls_url = stream_media["media_meta"]["media_archive_url"]
-                else:
-                    hls_url = stream_media["media_meta"]["media_url"]
-
-                yield from HLSStream.parse_variant_playlist(self.session, hls_url).items()
-
-
-__plugin__ = WASD


Test patch:
diff --git a/tests/plugins/test_wasd.py b/tests/plugins/test_wasd.py
deleted file mode 100644
--- a/tests/plugins/test_wasd.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from streamlink.plugins.wasd import WASD
-from tests.plugins import PluginCanHandleUrl
-
-
-class TestPluginCanHandleUrlWasd(PluginCanHandleUrl):
-    __plugin__ = WASD
-
-    should_match = [
-        "https://wasd.tv/channel",
-        "https://wasd.tv/channel/",
-    ]
-
-    should_not_match = [
-        "https://wasd.tv/channel/12345",
-        "https://wasd.tv/channel/12345/videos/67890",
-        "https://wasd.tv/voodik/videos?record=123456",
-    ]