forked from streamlink/streamlink
/
ard_live.py
80 lines (69 loc) · 2.54 KB
/
ard_live.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"""
$description Live TV channels and video on-demand service from ARD, a German public, independent broadcaster.
$url daserste.de
$type live, vod
$region Germany
"""
import logging
import re
from streamlink.compat import urljoin
from streamlink.plugin import Plugin, PluginError, pluginmatcher
from streamlink.plugin.api import validate
from streamlink.stream.hls import HLSStream
from streamlink.stream.http import HTTPStream
log = logging.getLogger(__name__)
@pluginmatcher(re.compile(
r"https?://((www|live)\.)?daserste\.de/"
))
class ARDLive(Plugin):
_URL_DATA_BASE = "https://www.daserste.de/"
_QUALITY_MAP = {
4: "1080p",
3: "720p",
2: "540p",
1: "270p",
0: "180p"
}
def _get_streams(self):
try:
data_url = self.session.http.get(self.url, schema=validate.Schema(
validate.parse_html(),
validate.xml_find(".//*[@data-ctrl-player]"),
validate.get("data-ctrl-player"),
validate.transform(lambda s: s.replace("'", "\"")),
validate.parse_json(),
{"url": validate.text},
validate.get("url")
))
except PluginError:
return
data_url = urljoin(self._URL_DATA_BASE, data_url)
log.debug("Player URL: '{0}'", data_url)
self.title, media = self.session.http.get(data_url, schema=validate.Schema(
validate.parse_json(name="MEDIAINFO"),
{"mc": {
validate.optional("_title"): validate.text,
"_mediaArray": [validate.all(
{
"_mediaStreamArray": [validate.all(
{
"_quality": validate.any(validate.text, int),
"_stream": [validate.url()],
},
validate.union_get("_quality", ("_stream", 0))
)]
},
validate.get("_mediaStreamArray"),
validate.transform(dict)
)]
}},
validate.get("mc"),
validate.union_get("_title", ("_mediaArray", 0))
))
if media.get("auto"):
for s in HLSStream.parse_variant_playlist(self.session, media.get("auto")).items():
yield s
else:
for quality, stream in media.items():
yield self._QUALITY_MAP.get(quality, quality), HTTPStream(self.session, stream)
__plugin__ = ARDLive