Ejemplo n.º 1
0
 def test_failure_schema(self):
     with pytest.raises(validate.ValidationError) as cm:
         validate.validate(validate.startswith("invalid"), 1)
     assert_validationerror(
         cm.value, """
         ValidationError(type):
           Type of 1 should be str, but is int
     """)
Ejemplo n.º 2
0
 def test_failure(self):
     with pytest.raises(validate.ValidationError) as cm:
         validate.validate(validate.startswith("invalid"), "foo bar baz")
     assert_validationerror(
         cm.value, """
         ValidationError(startswith):
           'foo bar baz' does not start with 'invalid'
     """)
Ejemplo n.º 3
0
    def _get_streams(self):
        self._get_cookies()
        self.follow_vk_redirect()

        video_id = self.match.group("video_id")
        if not video_id:
            return

        log.debug(f"Video ID: {video_id}")
        try:
            data = self.session.http.post(
                self.API_URL,
                params={"act": "show"},
                data={
                    "act": "show",
                    "al": "1",
                    "video": video_id
                },
                headers={"Referer": self.url},
                schema=validate.Schema(
                    validate.transform(
                        lambda text: re.sub(r"^\s*<!--\s*", "", text)),
                    validate.parse_json(), {"payload": list},
                    validate.get(("payload", -1)), list, validate.get(-1),
                    {"player": {
                        "params": [dict]
                    }}, validate.get(("player", "params", 0)), {
                        validate.optional("hls"): validate.url(),
                        validate.optional("manifest"):
                        validate.startswith("<?xml"),
                        validate.optional("md_author"): validate.any(
                            str, None),
                        validate.optional("md_title"): validate.any(str, None),
                    }))
        except PluginError:
            log.error("Could not parse API response")
            return

        self.id = video_id
        self.author = data.get("md_author")
        self.title = data.get("md_title")

        hls = data.get("hls")
        if hls:
            return HLSStream.parse_variant_playlist(self.session, hls)

        dash_manifest = data.get("manifest")
        if dash_manifest:
            return DASHStream.parse_manifest(self.session, dash_manifest)
Ejemplo n.º 4
0
_swf_player_re = re.compile(
    r'swfobject.embedSWF\("(/\d+/swf/[0-9A-Za-z]+\.swf)"')

_schema = validate.Schema(
    validate.any(
        validate.all(u"<error></error>", validate.transform(lambda x: None)),
        validate.all(
            validate.transform(lambda s: s.split(";")), validate.length(3),
            validate.union({
                "server":
                validate.all(validate.get(0), validate.text),
                "token":
                validate.all(
                    validate.get(1), validate.text,
                    validate.startswith(":mvnkey-"),
                    validate.transform(lambda s: s[len(":mvnkey-"):])),
                "ingest":
                validate.all(validate.get(2), validate.text)
            }))))


class VaughnLive(Plugin):
    @classmethod
    def can_handle_url(cls, url):
        return _url_re.match(url)

    def _get_streams(self):
        res = http.get(self.url)
        match = _swf_player_re.search(res.text)
        if match is None:
Ejemplo n.º 5
0
 def test_startswith(self):
     assert validate(startswith("abc"), "abcedf")
Ejemplo n.º 6
0
class SeeTV(Plugin):
    _url_re = re.compile(r"""(http://seetv.tv/vse-tv-online/.*?)(#|$)""")
    _api_url = "http://seetv.tv/get/player/{0}"
    _main_source_re = re.compile(r'stream-active-main" rel="(\d+)"')
    api_schema = validate.Schema(validate.any(
        {
            "status": False,
            "text": validate.text
        },
        {
            "status": True,
            "file": validate.any(
                validate.all(validate.url(), validate.transform(lambda x: x.replace("%3F", "?"))),
                validate.all(validate.text, validate.startswith("<"))
            ),
            "height": validate.text,
        }
    ))

    @classmethod
    def can_handle_url(cls, url):
        return cls._url_re.match(url) is not None

    @property
    def referer(self):
        return self._url_re.match(self.url).group(1)

    def _get_tv_link(self):
        res = self.session.http.get(self.url)
        link_m = self._main_source_re.search(res.text)
        return link_m and link_m.group(1)

    def _get_streams(self):
        self.session.http.headers.update({"User-Agent": useragents.CHROME,
                             "Referer": self.referer})
        fragment = dict(parse_qsl(urlparse(self.url).fragment))
        link = fragment.get("link")
        if not link:
            link = self._get_tv_link()

        if not link:
            self.logger.error("Missing link fragment: stream unavailable")
            return

        player_url = self._api_url.format(link)
        self.logger.debug("Requesting player API: {0} (referer={1})", player_url, self.referer)
        res = self.session.http.get(player_url,
                       params={"_": int(time.time() * 1000)},
                       headers={"X-Requested-With": "XMLHttpRequest"})

        try:
            data = self.session.http.json(res, schema=self.api_schema)
        except PluginError as e:
            print(e)
            self.logger.error("Cannot play this stream type")
        else:
            if data["status"]:
                if data["file"].startswith("<"):
                    self.logger.error("Cannot play embedded streams")
                else:
                    return HLSStream.parse_variant_playlist(self.session, data["file"])
            else:
                self.logger.error(data["text"])
Ejemplo n.º 7
0
 def test_startswith(self):
     assert validate(startswith("abc"), "abcedf")
Ejemplo n.º 8
0
 def test_success(self):
     assert validate.validate(validate.startswith("foo"), "foo bar baz")