Repository: streamlink/streamlink

Issue:
plugins.ntv:  it have dead today 
### 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.2.1+23.ga39816fb

### Description

Yet yesterday it was working but now it has reached its end of life due to site changing. Fortunately, it works with static URL:

`http://cdn.ntv.ru/ntv-msk_hd/index.m3u8`

I have constructed this URL from very similar URLs taken from under the hood of the site.

So, we have 3 options:

1. Remove the plugin.
2. Mark it as broken.
3. Incorporate this static URL into plugin code as what to be  returned.

I guess all of those decisions would be temporary.

### Debug log

```text
streamlink --loglevel=debug http://www.ntv.ru/air/
[cli][debug] OS:         Linux-6.5.0-2-amd64-x86_64-with-glibc2.37
[cli][debug] Python:     3.11.6
[cli][debug] OpenSSL:    OpenSSL 3.0.11 19 Sep 2023
[cli][debug] Streamlink: 6.2.1+23.ga39816fb
[cli][debug] Dependencies:
[cli][debug]  certifi: 2023.7.22
[cli][debug]  isodate: 0.6.1
[cli][debug]  lxml: 4.9.3
[cli][debug]  pycountry: 22.3.5
[cli][debug]  pycryptodome: 3.16.0
[cli][debug]  PySocks: 1.7.1
[cli][debug]  requests: 2.31.0
[cli][debug]  trio: 0.22.2
[cli][debug]  trio-websocket: 0.10.3
[cli][debug]  typing-extensions: 4.7.1
[cli][debug]  urllib3: 1.26.17
[cli][debug]  websocket-client: 1.2.3
[cli][debug] Arguments:
[cli][debug]  url=http://www.ntv.ru/air/
[cli][debug]  --loglevel=debug
[cli][debug]  --player=mpv
[cli][debug]  --player-args=--quiet
[cli][debug]  --default-stream=['best']
[cli][info] Found matching plugin ntv for URL http://www.ntv.ru/air/
error: No playable streams found on this URL: http://www.ntv.ru/air/
```



Discussion:

Resolving patch:
diff --git a/src/streamlink/plugins/ntv.py b/src/streamlink/plugins/ntv.py
deleted file mode 100644
--- a/src/streamlink/plugins/ntv.py
+++ /dev/null
@@ -1,31 +0,0 @@
-"""
-$description Russian live TV channel owned by Gazprom Media.
-$url ntv.ru
-$type live
-"""
-
-import re
-
-from streamlink.plugin import Plugin, pluginmatcher
-from streamlink.stream.hls import HLSStream
-
-
-@pluginmatcher(re.compile(
-    r"https?://www\.ntv\.ru/air/",
-))
-class NTV(Plugin):
-    def _get_streams(self):
-        body = self.session.http.get(self.url).text
-        mrl = None
-        match = re.search(r"var camHlsURL = \'(.*)\'", body)
-        if match:
-            mrl = f"http:{match.group(1)}"
-        else:
-            match = re.search(r"var hlsURL = \'(.*)\'", body)
-            if match:
-                mrl = match.group(1)
-        if mrl:
-            return HLSStream.parse_variant_playlist(self.session, mrl)
-
-
-__plugin__ = NTV


Test patch:
diff --git a/tests/plugins/test_ntv.py b/tests/plugins/test_ntv.py
deleted file mode 100644
--- a/tests/plugins/test_ntv.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from streamlink.plugins.ntv import NTV
-from tests.plugins import PluginCanHandleUrl
-
-
-class TestPluginCanHandleUrlNTV(PluginCanHandleUrl):
-    __plugin__ = NTV
-
-    should_match = [
-        "https://www.ntv.ru/air/",
-        "http://www.ntv.ru/air/",
-    ]
-
-    should_not_match = [
-        "https://www.ntv.ru/",
-        "http://www.ntv.ru/",
-    ]