We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
sportschau plugin fails with "Unable to parse manifest XML" error

## Plugin Issue


- [x ] This is a plugin issue and I have read the contribution guidelines.


### Description

streamlink errors out when trying to watch a stream on sportschau.de, e.g. https://www.sportschau.de/tourdefrance/live/videostream-livestream---die--etappe-der-tour-de-france-nach-privas-100.html. It errors out with: "error: Unable to parse manifest XML: syntax error: line 1, column 0 (b'#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X ...)"

### Reproduction steps / Explicit stream URLs to test

1. streamlink "https://www.sportschau.de/tourdefrance/live/videostream-livestream---die--etappe-der-tour-de-france-nach-privas-100.html"


### Log output

```
[14:25:23,464][cli][debug] OS:         Linux-5.8.4-x86_64-with-glibc2.2.5
[14:25:23,464][cli][debug] Python:     3.8.5
[14:25:23,464][cli][debug] Streamlink: 1.5.0
[14:25:23,464][cli][debug] Requests(2.24.0), Socks(1.7.1), Websocket(0.57.0)
[14:25:23,465][cli][info] Found matching plugin sportschau for URL https://www.sportschau.de/tourdefrance/live/videostream-livestream---die--etappe-der-tour-de-france-nach-privas-100.html
[14:25:23,734][plugin.sportschau][info] Found player js http://deviceids-medp.wdr.de/ondemand/221/2214170.js
error: Unable to parse manifest XML: syntax error: line 1, column 0 (b'#EXTM3U\n#EXT-X-VERSION:3\n#EXT-X ...)
```


### Additional comments, screenshots, etc.

Not sure that I understand the cause of the error, especially as the problematic part seems truncated. This is what the .m3u file looks like:

```
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=5388416,AVERAGE-BANDWIDTH=4048000,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_3680.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5388416,AVERAGE-BANDWIDTH=4048000,CODECS="avc1.640020,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_3680.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2758800,AVERAGE-BANDWIDTH=2085600,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=960x540,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_1896.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2758800,AVERAGE-BANDWIDTH=2085600,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=960x540,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_1896.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1614976,AVERAGE-BANDWIDTH=1232000,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_1120.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1614976,AVERAGE-BANDWIDTH=1232000,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_1120.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=860288,AVERAGE-BANDWIDTH=668800,CODECS="avc1.77.30,mp4a.40.2",RESOLUTION=512x288,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_608.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=860288,AVERAGE-BANDWIDTH=668800,CODECS="avc1.77.30,mp4a.40.2",RESOLUTION=512x288,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_608.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=482944,AVERAGE-BANDWIDTH=387200,CODECS="avc1.66.30,mp4a.40.2",RESOLUTION=480x270,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_352.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=482944,AVERAGE-BANDWIDTH=387200,CODECS="avc1.66.30,mp4a.40.2",RESOLUTION=480x270,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_352.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=294272,AVERAGE-BANDWIDTH=246400,CODECS="avc1.42c015,mp4a.40.2",RESOLUTION=320x180,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_224.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=294272,AVERAGE-BANDWIDTH=246400,CODECS="avc1.42c015,mp4a.40.2",RESOLUTION=320x180,FRAME-RATE=50.000
https://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_224.m3u8
```

--- 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/sportschau.py`
Content:
```
1 import re
2 import json
3 
4 from streamlink.plugin import Plugin
5 from streamlink.stream import HDSStream
6 from streamlink.utils import update_scheme
7 
8 _url_re = re.compile(r"http(s)?://(\w+\.)?sportschau.de/")
9 _player_js = re.compile(r"https?://deviceids-medp.wdr.de/ondemand/.*\.js")
10 
11 
12 class sportschau(Plugin):
13     @classmethod
14     def can_handle_url(cls, url):
15         return _url_re.match(url)
16 
17     def _get_streams(self):
18         res = self.session.http.get(self.url)
19         match = _player_js.search(res.text)
20         if match:
21             player_js = match.group(0)
22             self.logger.info("Found player js {0}", player_js)
23         else:
24             self.logger.info("Didn't find player js. Probably this page doesn't contain a video")
25             return
26 
27         res = self.session.http.get(player_js)
28 
29         jsonp_start = res.text.find('(') + 1
30         jsonp_end = res.text.rfind(')')
31 
32         if jsonp_start <= 0 or jsonp_end <= 0:
33             self.logger.info("Couldn't extract json metadata from player.js: {0}", player_js)
34             return
35 
36         json_s = res.text[jsonp_start:jsonp_end]
37 
38         stream_metadata = json.loads(json_s)
39 
40         hds_url = stream_metadata['mediaResource']['dflt']['videoURL']
41         hds_url = update_scheme(self.url, hds_url)
42 
43         return HDSStream.parse_manifest(self.session, hds_url).items()
44 
45 
46 __plugin__ = sportschau
47
```
--- 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/sportschau.py b/src/streamlink/plugins/sportschau.py
--- a/src/streamlink/plugins/sportschau.py
+++ b/src/streamlink/plugins/sportschau.py
@@ -1,46 +1,52 @@
-import re
-import json
-
-from streamlink.plugin import Plugin
-from streamlink.stream import HDSStream
-from streamlink.utils import update_scheme
-
-_url_re = re.compile(r"http(s)?://(\w+\.)?sportschau.de/")
-_player_js = re.compile(r"https?://deviceids-medp.wdr.de/ondemand/.*\.js")
-
-
-class sportschau(Plugin):
-    @classmethod
-    def can_handle_url(cls, url):
-        return _url_re.match(url)
-
-    def _get_streams(self):
-        res = self.session.http.get(self.url)
-        match = _player_js.search(res.text)
-        if match:
-            player_js = match.group(0)
-            self.logger.info("Found player js {0}", player_js)
-        else:
-            self.logger.info("Didn't find player js. Probably this page doesn't contain a video")
-            return
-
-        res = self.session.http.get(player_js)
-
-        jsonp_start = res.text.find('(') + 1
-        jsonp_end = res.text.rfind(')')
-
-        if jsonp_start <= 0 or jsonp_end <= 0:
-            self.logger.info("Couldn't extract json metadata from player.js: {0}", player_js)
-            return
-
-        json_s = res.text[jsonp_start:jsonp_end]
-
-        stream_metadata = json.loads(json_s)
-
-        hds_url = stream_metadata['mediaResource']['dflt']['videoURL']
-        hds_url = update_scheme(self.url, hds_url)
-
-        return HDSStream.parse_manifest(self.session, hds_url).items()
-
-
-__plugin__ = sportschau
+import logging
+import re
+
+from streamlink.plugin import Plugin
+from streamlink.plugin.api import validate
+from streamlink.stream import HLSStream
+from streamlink.utils import parse_json, update_scheme
+
+log = logging.getLogger(__name__)
+
+
+class Sportschau(Plugin):
+    _re_url = re.compile(r"https?://(?:\w+\.)*sportschau.de/")
+
+    _re_player = re.compile(r"https?:(//deviceids-medp.wdr.de/ondemand/\S+\.js)")
+    _re_json = re.compile(r"\$mediaObject.jsonpHelper.storeAndPlay\(({.+})\);?")
+
+    _schema_player = validate.Schema(
+        validate.transform(_re_player.search),
+        validate.any(None, validate.Schema(
+            validate.get(1),
+            validate.transform(lambda url: update_scheme("https:", url))
+        ))
+    )
+    _schema_json = validate.Schema(
+        validate.transform(_re_json.match),
+        validate.get(1),
+        validate.transform(parse_json),
+        validate.get("mediaResource"),
+        validate.get("dflt"),
+        validate.get("videoURL"),
+        validate.transform(lambda url: update_scheme("https:", url))
+    )
+
+    @classmethod
+    def can_handle_url(cls, url):
+        return cls._re_url.match(url) is not None
+
+    def _get_streams(self):
+        player_js = self.session.http.get(self.url, schema=self._schema_player)
+        if not player_js:
+            return
+
+        log.debug("Found player js {0}".format(player_js))
+
+        hls_url = self.session.http.get(player_js, schema=self._schema_json)
+
+        for stream in HLSStream.parse_variant_playlist(self.session, hls_url).items():
+            yield stream
+
+
+__plugin__ = Sportschau

{"golden_diff": "diff --git a/src/streamlink/plugins/sportschau.py b/src/streamlink/plugins/sportschau.py\n--- a/src/streamlink/plugins/sportschau.py\n+++ b/src/streamlink/plugins/sportschau.py\n@@ -1,46 +1,52 @@\n-import re\r\n-import json\r\n-\r\n-from streamlink.plugin import Plugin\r\n-from streamlink.stream import HDSStream\r\n-from streamlink.utils import update_scheme\r\n-\r\n-_url_re = re.compile(r\"http(s)?://(\\w+\\.)?sportschau.de/\")\r\n-_player_js = re.compile(r\"https?://deviceids-medp.wdr.de/ondemand/.*\\.js\")\r\n-\r\n-\r\n-class sportschau(Plugin):\r\n-    @classmethod\r\n-    def can_handle_url(cls, url):\r\n-        return _url_re.match(url)\r\n-\r\n-    def _get_streams(self):\r\n-        res = self.session.http.get(self.url)\r\n-        match = _player_js.search(res.text)\r\n-        if match:\r\n-            player_js = match.group(0)\r\n-            self.logger.info(\"Found player js {0}\", player_js)\r\n-        else:\r\n-            self.logger.info(\"Didn't find player js. Probably this page doesn't contain a video\")\r\n-            return\r\n-\r\n-        res = self.session.http.get(player_js)\r\n-\r\n-        jsonp_start = res.text.find('(') + 1\r\n-        jsonp_end = res.text.rfind(')')\r\n-\r\n-        if jsonp_start <= 0 or jsonp_end <= 0:\r\n-            self.logger.info(\"Couldn't extract json metadata from player.js: {0}\", player_js)\r\n-            return\r\n-\r\n-        json_s = res.text[jsonp_start:jsonp_end]\r\n-\r\n-        stream_metadata = json.loads(json_s)\r\n-\r\n-        hds_url = stream_metadata['mediaResource']['dflt']['videoURL']\r\n-        hds_url = update_scheme(self.url, hds_url)\r\n-\r\n-        return HDSStream.parse_manifest(self.session, hds_url).items()\r\n-\r\n-\r\n-__plugin__ = sportschau\r\n+import logging\n+import re\n+\n+from streamlink.plugin import Plugin\n+from streamlink.plugin.api import validate\n+from streamlink.stream import HLSStream\n+from streamlink.utils import parse_json, update_scheme\n+\n+log = logging.getLogger(__name__)\n+\n+\n+class Sportschau(Plugin):\n+    _re_url = re.compile(r\"https?://(?:\\w+\\.)*sportschau.de/\")\n+\n+    _re_player = re.compile(r\"https?:(//deviceids-medp.wdr.de/ondemand/\\S+\\.js)\")\n+    _re_json = re.compile(r\"\\$mediaObject.jsonpHelper.storeAndPlay\\(({.+})\\);?\")\n+\n+    _schema_player = validate.Schema(\n+        validate.transform(_re_player.search),\n+        validate.any(None, validate.Schema(\n+            validate.get(1),\n+            validate.transform(lambda url: update_scheme(\"https:\", url))\n+        ))\n+    )\n+    _schema_json = validate.Schema(\n+        validate.transform(_re_json.match),\n+        validate.get(1),\n+        validate.transform(parse_json),\n+        validate.get(\"mediaResource\"),\n+        validate.get(\"dflt\"),\n+        validate.get(\"videoURL\"),\n+        validate.transform(lambda url: update_scheme(\"https:\", url))\n+    )\n+\n+    @classmethod\n+    def can_handle_url(cls, url):\n+        return cls._re_url.match(url) is not None\n+\n+    def _get_streams(self):\n+        player_js = self.session.http.get(self.url, schema=self._schema_player)\n+        if not player_js:\n+            return\n+\n+        log.debug(\"Found player js {0}\".format(player_js))\n+\n+        hls_url = self.session.http.get(player_js, schema=self._schema_json)\n+\n+        for stream in HLSStream.parse_variant_playlist(self.session, hls_url).items():\n+            yield stream\n+\n+\n+__plugin__ = Sportschau\n", "issue": "sportschau plugin fails with \"Unable to parse manifest XML\" error\n\r\n## Plugin Issue\r\n\r\n\r\n- [x ] This is a plugin issue and I have read the contribution guidelines.\r\n\r\n\r\n### Description\r\n\r\nstreamlink errors out when trying to watch a stream on sportschau.de, e.g. https://www.sportschau.de/tourdefrance/live/videostream-livestream---die--etappe-der-tour-de-france-nach-privas-100.html. It errors out with: \"error: Unable to parse manifest XML: syntax error: line 1, column 0 (b'#EXTM3U\\n#EXT-X-VERSION:3\\n#EXT-X ...)\"\r\n\r\n### Reproduction steps / Explicit stream URLs to test\r\n\r\n1. streamlink \"https://www.sportschau.de/tourdefrance/live/videostream-livestream---die--etappe-der-tour-de-france-nach-privas-100.html\"\r\n\r\n\r\n### Log output\r\n\r\n```\r\n[14:25:23,464][cli][debug] OS:         Linux-5.8.4-x86_64-with-glibc2.2.5\r\n[14:25:23,464][cli][debug] Python:     3.8.5\r\n[14:25:23,464][cli][debug] Streamlink: 1.5.0\r\n[14:25:23,464][cli][debug] Requests(2.24.0), Socks(1.7.1), Websocket(0.57.0)\r\n[14:25:23,465][cli][info] Found matching plugin sportschau for URL https://www.sportschau.de/tourdefrance/live/videostream-livestream---die--etappe-der-tour-de-france-nach-privas-100.html\r\n[14:25:23,734][plugin.sportschau][info] Found player js http://deviceids-medp.wdr.de/ondemand/221/2214170.js\r\nerror: Unable to parse manifest XML: syntax error: line 1, column 0 (b'#EXTM3U\\n#EXT-X-VERSION:3\\n#EXT-X ...)\r\n```\r\n\r\n\r\n### Additional comments, screenshots, etc.\r\n\r\nNot sure that I understand the cause of the error, especially as the problematic part seems truncated. This is what the .m3u file looks like:\r\n\r\n```\r\n#EXTM3U\r\n#EXT-X-VERSION:3\r\n#EXT-X-INDEPENDENT-SEGMENTS\r\n#EXT-X-STREAM-INF:BANDWIDTH=5388416,AVERAGE-BANDWIDTH=4048000,CODECS=\"avc1.640020,mp4a.40.2\",RESOLUTION=1280x720,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_3680.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=5388416,AVERAGE-BANDWIDTH=4048000,CODECS=\"avc1.640020,mp4a.40.2\",RESOLUTION=1280x720,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_3680.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=2758800,AVERAGE-BANDWIDTH=2085600,CODECS=\"avc1.4d401f,mp4a.40.2\",RESOLUTION=960x540,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_1896.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=2758800,AVERAGE-BANDWIDTH=2085600,CODECS=\"avc1.4d401f,mp4a.40.2\",RESOLUTION=960x540,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_1896.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=1614976,AVERAGE-BANDWIDTH=1232000,CODECS=\"avc1.4d401f,mp4a.40.2\",RESOLUTION=640x360,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_1120.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=1614976,AVERAGE-BANDWIDTH=1232000,CODECS=\"avc1.4d401f,mp4a.40.2\",RESOLUTION=640x360,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_1120.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=860288,AVERAGE-BANDWIDTH=668800,CODECS=\"avc1.77.30,mp4a.40.2\",RESOLUTION=512x288,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_608.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=860288,AVERAGE-BANDWIDTH=668800,CODECS=\"avc1.77.30,mp4a.40.2\",RESOLUTION=512x288,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_608.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=482944,AVERAGE-BANDWIDTH=387200,CODECS=\"avc1.66.30,mp4a.40.2\",RESOLUTION=480x270,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_352.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=482944,AVERAGE-BANDWIDTH=387200,CODECS=\"avc1.66.30,mp4a.40.2\",RESOLUTION=480x270,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_352.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=294272,AVERAGE-BANDWIDTH=246400,CODECS=\"avc1.42c015,mp4a.40.2\",RESOLUTION=320x180,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512/ardevent2_geo/master_224.m3u8\r\n#EXT-X-STREAM-INF:BANDWIDTH=294272,AVERAGE-BANDWIDTH=246400,CODECS=\"avc1.42c015,mp4a.40.2\",RESOLUTION=320x180,FRAME-RATE=50.000\r\nhttps://ardevent2.akamaized.net/hls/live/681512-b/ardevent2_geo/master_224.m3u8\r\n```\n", "before_files": [{"content": "import re\r\nimport json\r\n\r\nfrom streamlink.plugin import Plugin\r\nfrom streamlink.stream import HDSStream\r\nfrom streamlink.utils import update_scheme\r\n\r\n_url_re = re.compile(r\"http(s)?://(\\w+\\.)?sportschau.de/\")\r\n_player_js = re.compile(r\"https?://deviceids-medp.wdr.de/ondemand/.*\\.js\")\r\n\r\n\r\nclass sportschau(Plugin):\r\n    @classmethod\r\n    def can_handle_url(cls, url):\r\n        return _url_re.match(url)\r\n\r\n    def _get_streams(self):\r\n        res = self.session.http.get(self.url)\r\n        match = _player_js.search(res.text)\r\n        if match:\r\n            player_js = match.group(0)\r\n            self.logger.info(\"Found player js {0}\", player_js)\r\n        else:\r\n            self.logger.info(\"Didn't find player js. Probably this page doesn't contain a video\")\r\n            return\r\n\r\n        res = self.session.http.get(player_js)\r\n\r\n        jsonp_start = res.text.find('(') + 1\r\n        jsonp_end = res.text.rfind(')')\r\n\r\n        if jsonp_start <= 0 or jsonp_end <= 0:\r\n            self.logger.info(\"Couldn't extract json metadata from player.js: {0}\", player_js)\r\n            return\r\n\r\n        json_s = res.text[jsonp_start:jsonp_end]\r\n\r\n        stream_metadata = json.loads(json_s)\r\n\r\n        hds_url = stream_metadata['mediaResource']['dflt']['videoURL']\r\n        hds_url = update_scheme(self.url, hds_url)\r\n\r\n        return HDSStream.parse_manifest(self.session, hds_url).items()\r\n\r\n\r\n__plugin__ = sportschau\r\n", "path": "src/streamlink/plugins/sportschau.py"}], "after_files": [{"content": "import logging\nimport re\n\nfrom streamlink.plugin import Plugin\nfrom streamlink.plugin.api import validate\nfrom streamlink.stream import HLSStream\nfrom streamlink.utils import parse_json, update_scheme\n\nlog = logging.getLogger(__name__)\n\n\nclass Sportschau(Plugin):\n    _re_url = re.compile(r\"https?://(?:\\w+\\.)*sportschau.de/\")\n\n    _re_player = re.compile(r\"https?:(//deviceids-medp.wdr.de/ondemand/\\S+\\.js)\")\n    _re_json = re.compile(r\"\\$mediaObject.jsonpHelper.storeAndPlay\\(({.+})\\);?\")\n\n    _schema_player = validate.Schema(\n        validate.transform(_re_player.search),\n        validate.any(None, validate.Schema(\n            validate.get(1),\n            validate.transform(lambda url: update_scheme(\"https:\", url))\n        ))\n    )\n    _schema_json = validate.Schema(\n        validate.transform(_re_json.match),\n        validate.get(1),\n        validate.transform(parse_json),\n        validate.get(\"mediaResource\"),\n        validate.get(\"dflt\"),\n        validate.get(\"videoURL\"),\n        validate.transform(lambda url: update_scheme(\"https:\", url))\n    )\n\n    @classmethod\n    def can_handle_url(cls, url):\n        return cls._re_url.match(url) is not None\n\n    def _get_streams(self):\n        player_js = self.session.http.get(self.url, schema=self._schema_player)\n        if not player_js:\n            return\n\n        log.debug(\"Found player js {0}\".format(player_js))\n\n        hls_url = self.session.http.get(player_js, schema=self._schema_json)\n\n        for stream in HLSStream.parse_variant_playlist(self.session, hls_url).items():\n            yield stream\n\n\n__plugin__ = Sportschau\n", "path": "src/streamlink/plugins/sportschau.py"}]}