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
|