File: test_vk.py

package info (click to toggle)
streamlink 8.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,564 kB
  • sloc: python: 51,188; sh: 184; makefile: 152
file content (108 lines) | stat: -rw-r--r-- 4,058 bytes parent folder | download | duplicates (2)
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from __future__ import annotations

from contextlib import nullcontext
from typing import TYPE_CHECKING

import pytest

from streamlink.exceptions import NoStreamsError
from streamlink.plugins.vk import VK
from tests.plugins import PluginCanHandleUrl


if TYPE_CHECKING:
    import requests_mock as rm

    from streamlink import Streamlink


does_not_raise = nullcontext()


class TestPluginCanHandleUrlVK(PluginCanHandleUrl):
    __plugin__ = VK

    should_match_groups = [
        # vod
        (("video", "https://vk.com/video-9944999_456239622"), {"id": "-9944999_456239622"}),
        (("video", "https://vk.ru/video-9944999_456239622"), {"id": "-9944999_456239622"}),
        # live
        (("video", "https://www.vk.com/video-143491903_456240010"), {"id": "-143491903_456240010"}),
        (("video", "https://www.vk.ru/video-143491903_456240010"), {"id": "-143491903_456240010"}),
        # video ID without leading dash
        (("video", "https://vk.com/video132886594_167211693"), {"id": "132886594_167211693"}),
        # video with required list param
        (("video", "https://vk.com/video-122792749_456242046?list=ln-YXS9u57K48LhkU6C3X"), {"id": "-122792749_456242046"}),
        # video/lives
        (("default", "https://vk.com/video/lives?z=video-143491903_456240010"), {}),
        # other paths / formats
        (("default", "https://vk.com/videos-24136539?z=video-24136539_456241155%2Fpl_-24136539_-2"), {}),
        (("default", "https://vk.com/video/@vesti?z=video-24136539_456241155%2Fpl_-24136539_-2"), {}),
        (("default", "https://vk.com/video?z=video-15755094_456245149%2Fpl_cat_lives"), {}),
        (("default", "https://vk.com/video?z=video132886594_167211693%2Fpl_cat_8"), {}),
        # search
        (("default", "https://vk.com/dota2?w=wall-126093223_1057924"), {}),
        (("default", "https://vk.com/search?c%5Bq%5D=dota&c%5Bsection%5D=auto&z=video295508334_171402661"), {}),
    ]

    should_not_match = [
        "https://vk.com/",
        "https://vk.ru/",
    ]


@pytest.mark.parametrize(
    ("url", "newurl", "raises"),
    [
        pytest.param(
            "https://vk.com/video-24136539_456241176",
            "https://vk.com/video-24136539_456241176",
            does_not_raise,
            id="canonical-video-url",
        ),
        pytest.param(
            "https://vk.com/videos-24136539?z=video-24136539_456241181%2Fpl_-24136539_-2",
            "https://vk.com/video-24136539_456241181",
            does_not_raise,
            id="z-querystring-parameter-with-pl",
        ),
        pytest.param(
            "https://vk.com/videos132886594?z=video132886594_167211693",
            "https://vk.com/video132886594_167211693",
            does_not_raise,
            id="z-querystring-parameter",
        ),
        pytest.param(
            "https://vk.com/search?c%5Bq%5D=dota&c%5Bsection%5D=auto&z=video295508334_171402661",
            "https://vk.com/video295508334_171402661",
            does_not_raise,
            id="search-z-querystring-parameter",
        ),
        pytest.param(
            "https://vk.com/dota2?w=wall-126093223_1057924",
            "https://vk.com/video-126093223_1057924",
            does_not_raise,
            id="from-meta-og-url",
        ),
        # no video ID
        pytest.param(
            "https://vk.com/videos-0123456789?z=",
            "",
            pytest.raises(NoStreamsError),
            id="no-streams-1",
        ),
        pytest.param(
            "https://vk.com/video/for_kids?z=video%2Fpl_-22277933_51053000",
            "",
            pytest.raises(NoStreamsError),
            id="no-streams-2",
        ),
    ],
)
def test_url_redirect(requests_mock: rm.Mocker, session: Streamlink, url: str, newurl: str, raises: nullcontext):
    # noinspection PyTypeChecker
    plugin: VK = VK(session, url)
    requests_mock.get(url, text=f"""<!DOCTYPE html><html><head><meta property="og:url" content="{newurl}"/></head></html>""")
    with raises:
        plugin.follow_vk_redirect()
        assert plugin.url == newurl