streamlink 6.7.2__tar.gz → 6.7.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {streamlink-6.7.2 → streamlink-6.7.3}/CHANGELOG.md +18 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/PKG-INFO +1 -1
- {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/test_onbuild.py +7 -1
- {streamlink-6.7.2 → streamlink-6.7.3}/dev-requirements.txt +2 -2
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_build/man/streamlink.1 +1 -1
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/changelog.md +18 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/install.rst +1 -1
- {streamlink-6.7.2 → streamlink-6.7.3}/setup.py +1 -1
- streamlink-6.7.3/src/streamlink/_version.py +1 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/useragents.py +6 -6
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/_validators.py +5 -1
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mangomolo.py +5 -2
- streamlink-6.7.3/src/streamlink/plugins/pluto.py +230 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/showroom.py +1 -1
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/twitch.py +6 -8
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vkplay.py +4 -4
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/webbrowser.py +9 -7
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/PKG-INFO +1 -1
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/formatter.py +5 -4
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/path.py +26 -4
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/test_formatter.py +17 -0
- streamlink-6.7.3/tests/cli/utils/test_path.py +193 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mangomolo.py +8 -0
- streamlink-6.7.3/tests/plugins/test_pluto.py +32 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vkplay.py +3 -1
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_api_validate.py +9 -2
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/test_webbrowser.py +21 -3
- streamlink-6.7.2/src/streamlink/_version.py +0 -1
- streamlink-6.7.2/src/streamlink/plugins/pluto.py +0 -189
- streamlink-6.7.2/tests/cli/utils/test_path.py +0 -81
- streamlink-6.7.2/tests/plugins/test_pluto.py +0 -60
- {streamlink-6.7.2 → streamlink-6.7.3}/AUTHORS +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/LICENSE +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/MANIFEST.in +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/README.md +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/commands.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/onbuild.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/plugins_json.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/test_build_backend.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/test_plugins_json.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/completions/bash/streamlink +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/completions/zsh/_streamlink +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/Makefile +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_man.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/apple-touch-icon.png +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/favicon-16x16.png +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/favicon-32x32.png +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/favicon.ico +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/icon-ffmpeg.svg +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/icon-python.svg +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/icon.svg +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/opengraph-image.png +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/site.webmanifest +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/styles/custom.css +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_templates/base.html +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_templates/page.html +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_templates/sidebar/brand.html +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/_templates/sidebar/github-buttons.html +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/cache.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/exceptions.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/options.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/plugin.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/session.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/stream.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/streamlink.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/validate.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/webbrowser.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api_guide/quickstart.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api_guide/validate.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/api_guide.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/applications.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/config.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/metadata.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/plugin-sideloading.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/plugins/crunchyroll.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/plugins/twitch.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/plugins.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/protocols.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/proxy.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/tutorial.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/conf.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/deprecations.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/developing.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/docutils.conf +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/donate.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_argparse.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_github.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_html_template_vars.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_plugins.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_releaseref.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/index.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/migrations.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/players.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/plugins.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs/thirdparty.rst +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/docs-requirements.txt +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/icon.svg +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/pyproject.toml +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/script/build-shell-completions.sh +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/setup.cfg +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/__main__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/api.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/buffers.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/cache.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/compat.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/exceptions.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/logger.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/options.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/packages/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/packages/requests_file.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/http_session.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/_exception.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/_schemas.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/_validate.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/websocket.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/plugin.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/abematv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/adultswim.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/afreeca.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/albavision.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/aloula.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/app17.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ard_live.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ard_mediathek.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/artetv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/atpchallenger.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/atresplayer.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bbciplayer.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bfmtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bigo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bilibili.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/blazetv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bloomberg.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/booyah.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/brightcove.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/btv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cbsnews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cdnbg.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ceskatelevize.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cinergroup.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/clubbingtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cmmedia.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cnews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/crunchyroll.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dailymotion.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dash.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/delfi.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/deutschewelle.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dlive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dogan.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dogus.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/drdk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/earthcam.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/euronews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/facebook.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/filmon.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/galatasaraytv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/goltelevision.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/goodgame.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/googledrive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/gulli.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/hiplayer.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/hls.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/http.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/htv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/huajiao.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/huya.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/idf1.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/indihometv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/invintus.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/kugou.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/linelive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/livestream.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/lnk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/lrt.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ltv_lsm_lv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mdstrm.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mediaklikk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mediavitrina.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mildom.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mitele.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mixcloud.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mjunoon.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mrtmk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/n13tv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nasaplus.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nhkworld.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nicolive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nimotv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nos.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nownews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nowtvtr.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nrk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/okru.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/olympicchannel.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/oneplusone.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/onetv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/openrectv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/pandalive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/piaulizaportal.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/picarto.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/piczel.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/pixiv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/pluzz.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/radiko.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/radionet.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/raiplay.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/reuters.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/rtpa.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/rtpplay.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/rtve.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/rtvs.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ruv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/sbscokr.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/sportal.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/sportschau.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ssh101.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/stadium.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/steam.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/streamable.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/streann.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/stv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/svtplay.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/swisstxt.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/telefe.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/telemadrid.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tf1.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/trovo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/turkuvaz.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv360.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv3cat.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv4play.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv5monde.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv8.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv999.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvibo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tviplayer.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvp.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvrby.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvrplus.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvtoya.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/twitcasting.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ustreamtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ustvnow.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vidio.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vimeo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vinhlongtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vtvgo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/webtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/welt.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/wwenetwork.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/youtube.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/yupptv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zattoo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zdf_mediathek.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zeenews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zengatv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zhanqi.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/py.typed +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/http.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/http.pyi +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/options.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/plugins.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/session.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/dash/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/dash/dash.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/dash/manifest.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/dash/segment.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/ffmpegmux.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/file.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/filtered.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/hls/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/hls/hls.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/hls/m3u8.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/hls/segment.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/http.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/segmented/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/segmented/concurrent.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/segmented/segment.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/segmented/segmented.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/stream.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/wrappers.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/user_input.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/args.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/cache.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/crypto.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/data.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/formatter.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/l10n.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/module.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/named_pipe.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/parse.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/path.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/processoutput.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/random.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/socket.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/times.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/url.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/client.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/connection.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/browser.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/debugger.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/dom.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/emulation.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/fetch.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/input_.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/inspector.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/io.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/network.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/page.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/runtime.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/security.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/target.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/util.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/exceptions.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/chromium.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/exceptions.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/SOURCES.txt +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/dependency_links.txt +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/entry_points.txt +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/requires.txt +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/top_level.txt +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/__main__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/_parser.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/argparser.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/compat.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/console.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/constants.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/main.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/abc.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/file.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/http.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/player.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/py.typed +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/streamrunner.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/player.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/progress.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/versioncheck.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/output/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/output/test_file.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/output/test_player.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_argparser.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_cmdline.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_cmdline_title.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_console.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main_check_file_output.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main_formatter.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main_logging.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main_setup_config_args.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_plugin_args_and_options.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_streamrunner.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/test_player.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/test_progress.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/test_versioncheck.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/conftest.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/mixins/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/mixins/stream_hls.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/override/testplugin.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/testplugin.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/testplugin_invalid.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/testplugin_missing.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/conftest.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_abematv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_adultswim.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_afreeca.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_albavision.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_aloula.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_app17.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ard_live.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ard_mediathek.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_artetv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_atpchallenger.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_atresplayer.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bbciplayer.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bfmtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bigo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bilibili.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_blazetv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bloomberg.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_booyah.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_brightcove.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_btv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cbsnews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cdnbg.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ceskatelevize.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cinergroup.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_clubbingtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cmmedia.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cnews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_crunchyroll.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dailymotion.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dash.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_delfi.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_deutschewelle.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dlive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dogan.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dogus.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_drdk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_earthcam.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_euronews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_facebook.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_filmon.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_galatasaraytv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_goltelevision.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_goodgame.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_googledrive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_gulli.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_hiplayer.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_hls.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_http.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_htv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_huajiao.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_huya.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_idf1.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_indihometv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_invintus.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_kugou.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_linelive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_livestream.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_lnk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_lrt.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ltv_lsm_lv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mdstrm.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mediaklikk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mediavitrina.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mildom.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mitele.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mixcloud.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mjunoon.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mrtmk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_n13tv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nasaplus.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nhkworld.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nicolive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nimotv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nos.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nownews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nowtvtr.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nrk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_okru.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_olympicchannel.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_oneplusone.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_onetv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_openrectv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_pandalive.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_piaulizaportal.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_picarto.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_piczel.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_pixiv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_pluzz.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_radiko.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_radionet.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_raiplay.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_reuters.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_rtpa.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_rtpplay.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_rtve.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_rtvs.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ruv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_sbscokr.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_showroom.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_sportal.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_sportschau.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ssh101.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_stadium.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_steam.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_streamable.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_streann.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_stv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_svtplay.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_swisstxt.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_telefe.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_telemadrid.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tf1.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_trovo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_turkuvaz.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv360.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv3cat.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv4play.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv5monde.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv8.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv999.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvibo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tviplayer.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvp.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvrby.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvrplus.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvtoya.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_twitcasting.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_twitch.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ustreamtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ustvnow.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vidio.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vimeo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vinhlongtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vk.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vtvgo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_webtv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_welt.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_wwenetwork.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_youtube.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_yupptv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zattoo.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zdf_mediathek.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zeenews.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zengatv.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zhanqi.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/custom +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/primary +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/primary.testplugin +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/secondary +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/secondary.testplugin +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_1.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_10.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_11_static.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_2.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_3.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_8.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_9.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_no_duration.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p1.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p2.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p3.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p4.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p5.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_timeline_continued_p1.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_timeline_continued_p2.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_nested_baseurls.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_no_segment_list_or_template.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_segment_list.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_segments_byterange.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_segments_dynamic_number.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_static_no_publish_time.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_suggested_presentation_delay.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_timeline_ids.mpd +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_1.m3u8 +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_2.m3u8 +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_date.m3u8 +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_master.m3u8 +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_master_twitch_vod.m3u8 +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_multivariant_bandwidth.m3u8 +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/test_http.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/test_options.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/test_plugins.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/test_session.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/dash/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/dash/test_dash.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/dash/test_manifest.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/hls/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/hls/test_hls.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/hls/test_hls_filtered.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/hls/test_m3u8.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_ffmpegmux.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_file.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_segmented.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_stream_json.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_stream_to_url.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_stream_wrappers.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_api_websocket.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_buffers.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_cache.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_compat.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_logger.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_options.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_plugin.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_plugin_userinput.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_plugins.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_streamlink_api.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/testutils/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/testutils/handshake.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/testutils/test_handshake.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_args.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_cache.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_crypto.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_data.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_formatter.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_l10n.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_module.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_named_pipe.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_parse.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_path.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_processoutput.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_random.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_times.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_url.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/cdp/__init__.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/cdp/conftest.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/cdp/test_client.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/cdp/test_connection.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/conftest.py +0 -0
- {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/test_chromium.py +0 -0
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## streamlink 6.7.3 (2024-04-14)
|
|
4
|
+
|
|
5
|
+
Patch release:
|
|
6
|
+
|
|
7
|
+
- Fixed: file output paths being able to exceed max file/directory name length ([#5921](https://github.com/streamlink/streamlink/pull/5921), [#5925](https://github.com/streamlink/streamlink/pull/5925))
|
|
8
|
+
- Fixed: propagation of `KeyboardInterrupt`/`SystemExit` in `streamlink.webbrowser` ([#5930](https://github.com/streamlink/streamlink/pull/5930))
|
|
9
|
+
- Fixed: compatibility with `exceptiongroup<=1.1.1` ([#5930](https://github.com/streamlink/streamlink/pull/5930))
|
|
10
|
+
- Fixed: `plugin.api.validate.parse_qsd` input type validation ([#5932](https://github.com/streamlink/streamlink/pull/5932))
|
|
11
|
+
- Updated plugins:
|
|
12
|
+
- mangomolo: fixed missing referer header and updated URL matcher ([#5923](https://github.com/streamlink/streamlink/pull/5923), [#5926](https://github.com/streamlink/streamlink/pull/5926))
|
|
13
|
+
- pluto: rewritten plugin ([#5910](https://github.com/streamlink/streamlink/pull/5910))
|
|
14
|
+
- showroom: fixed geo-block check preventing stream access ([#5911](https://github.com/streamlink/streamlink/pull/5911))
|
|
15
|
+
- vkplay: updated URL matcher ([#5908](https://github.com/streamlink/streamlink/pull/5908))
|
|
16
|
+
- Tests: fixed test failure when running tests from the `bdist` build directory ([#5933](https://github.com/streamlink/streamlink/pull/5933))
|
|
17
|
+
|
|
18
|
+
[Full changelog](https://github.com/streamlink/streamlink/compare/6.7.2...6.7.3)
|
|
19
|
+
|
|
20
|
+
|
|
3
21
|
## streamlink 6.7.2 (2024-03-23)
|
|
4
22
|
|
|
5
23
|
Patch release:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: streamlink
|
|
3
|
-
Version: 6.7.
|
|
3
|
+
Version: 6.7.3
|
|
4
4
|
Summary: Streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of choice.
|
|
5
5
|
Author: Streamlink
|
|
6
6
|
Author-email: streamlink@protonmail.com
|
|
@@ -38,7 +38,13 @@ def build(request: pytest.FixtureRequest, tmp_path: Path, template_fields: dict)
|
|
|
38
38
|
(pkg_dir / "streamlink").mkdir(parents=True)
|
|
39
39
|
shutil.copy(PROJECT_ROOT / "pyproject.toml", tmp_path / "pyproject.toml")
|
|
40
40
|
shutil.copy(PROJECT_ROOT / "setup.py", tmp_path / "setup.py")
|
|
41
|
-
|
|
41
|
+
|
|
42
|
+
# Lookup for the path from the root source directory
|
|
43
|
+
if Path(PROJECT_ROOT / "src" / "streamlink" / "_version.py").exists():
|
|
44
|
+
shutil.copy(PROJECT_ROOT / "src" / "streamlink" / "_version.py", pkg_dir / "streamlink" / "_version.py")
|
|
45
|
+
else: # pragma: no cover
|
|
46
|
+
# We didn't find it, use the build location
|
|
47
|
+
shutil.copy(PROJECT_ROOT / "streamlink" / "_version.py", pkg_dir / "streamlink" / "_version.py")
|
|
42
48
|
|
|
43
49
|
options = dict(
|
|
44
50
|
is_source=is_source,
|
|
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|
|
27
27
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|
28
28
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
|
29
29
|
..
|
|
30
|
-
.TH "STREAMLINK" "1" "
|
|
30
|
+
.TH "STREAMLINK" "1" "Apr 14, 2024" "6.7.3" "Streamlink"
|
|
31
31
|
.SH NAME
|
|
32
32
|
streamlink \- extracts streams from various services and pipes them into a video player of choice
|
|
33
33
|
.SH SYNOPSIS
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## streamlink 6.7.3 (2024-04-14)
|
|
4
|
+
|
|
5
|
+
Patch release:
|
|
6
|
+
|
|
7
|
+
- Fixed: file output paths being able to exceed max file/directory name length ([#5921](https://github.com/streamlink/streamlink/pull/5921), [#5925](https://github.com/streamlink/streamlink/pull/5925))
|
|
8
|
+
- Fixed: propagation of `KeyboardInterrupt`/`SystemExit` in `streamlink.webbrowser` ([#5930](https://github.com/streamlink/streamlink/pull/5930))
|
|
9
|
+
- Fixed: compatibility with `exceptiongroup<=1.1.1` ([#5930](https://github.com/streamlink/streamlink/pull/5930))
|
|
10
|
+
- Fixed: `plugin.api.validate.parse_qsd` input type validation ([#5932](https://github.com/streamlink/streamlink/pull/5932))
|
|
11
|
+
- Updated plugins:
|
|
12
|
+
- mangomolo: fixed missing referer header and updated URL matcher ([#5923](https://github.com/streamlink/streamlink/pull/5923), [#5926](https://github.com/streamlink/streamlink/pull/5926))
|
|
13
|
+
- pluto: rewritten plugin ([#5910](https://github.com/streamlink/streamlink/pull/5910))
|
|
14
|
+
- showroom: fixed geo-block check preventing stream access ([#5911](https://github.com/streamlink/streamlink/pull/5911))
|
|
15
|
+
- vkplay: updated URL matcher ([#5908](https://github.com/streamlink/streamlink/pull/5908))
|
|
16
|
+
- Tests: fixed test failure when running tests from the `bdist` build directory ([#5933](https://github.com/streamlink/streamlink/pull/5933))
|
|
17
|
+
|
|
18
|
+
[Full changelog](https://github.com/streamlink/streamlink/compare/6.7.2...6.7.3)
|
|
19
|
+
|
|
20
|
+
|
|
3
21
|
## streamlink 6.7.2 (2024-03-23)
|
|
4
22
|
|
|
5
23
|
Patch release:
|
|
@@ -262,7 +262,7 @@ Package availability
|
|
|
262
262
|
--------------------
|
|
263
263
|
|
|
264
264
|
Packaging is not done by the Streamlink maintainers themselves except for
|
|
265
|
-
the `PyPI package <
|
|
265
|
+
the `PyPI package <pypi-package-and-source-code_>`_,
|
|
266
266
|
the `Windows installers + portable builds <Windows binaries_>`_,
|
|
267
267
|
and the `Linux AppImages <Linux AppImages_>`_.
|
|
268
268
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "6.7.3"
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
ANDROID = "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
|
|
2
|
-
CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
|
|
1
|
+
ANDROID = "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.80 Mobile Safari/537.36"
|
|
2
|
+
CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
|
|
3
3
|
CHROME_OS = "Mozilla/5.0 (X11; CrOS x86_64 15633.69.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.212 Safari/537.36"
|
|
4
|
-
FIREFOX = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:
|
|
4
|
+
FIREFOX = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0"
|
|
5
5
|
IE_11 = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
|
|
6
|
-
IPHONE = "Mozilla/5.0 (iPhone; CPU iPhone OS
|
|
7
|
-
OPERA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
|
|
8
|
-
SAFARI = "Mozilla/5.0 (Macintosh; Intel Mac OS X
|
|
6
|
+
IPHONE = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Mobile/15E148 Safari/604.1"
|
|
7
|
+
OPERA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0"
|
|
8
|
+
SAFARI = "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Safari/605.1.15"
|
|
9
9
|
|
|
10
10
|
# Backwards compatibility
|
|
11
11
|
EDGE = CHROME
|
|
@@ -651,4 +651,8 @@ def validator_parse_qsd(*args, **kwargs) -> TransformSchema:
|
|
|
651
651
|
:raise ValidationError: On parsing error
|
|
652
652
|
"""
|
|
653
653
|
|
|
654
|
-
|
|
654
|
+
def parser(*_args, **_kwargs):
|
|
655
|
+
validate(AnySchema(str, bytes), _args[0])
|
|
656
|
+
return _parse_qsd(*_args, **_kwargs, exception=ValidationError, schema=None)
|
|
657
|
+
|
|
658
|
+
return TransformSchema(parser, *args, **kwargs)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""
|
|
2
2
|
$description OTT video platform owned by Alpha Technology Group
|
|
3
|
+
$url player.mangomolo.com
|
|
3
4
|
$url media.gov.kw
|
|
4
5
|
$type live
|
|
5
6
|
"""
|
|
@@ -23,7 +24,7 @@ log = logging.getLogger(__name__)
|
|
|
23
24
|
)
|
|
24
25
|
@pluginmatcher(
|
|
25
26
|
name="mediagovkw",
|
|
26
|
-
pattern=re.compile(r"https?://media\.gov\.kw/"),
|
|
27
|
+
pattern=re.compile(r"https?://(www\.)?media\.gov\.kw/"),
|
|
27
28
|
)
|
|
28
29
|
class Mangomolo(Plugin):
|
|
29
30
|
def _get_player_url(self):
|
|
@@ -38,10 +39,12 @@ class Mangomolo(Plugin):
|
|
|
38
39
|
self.url = update_scheme("https://", player_url)
|
|
39
40
|
|
|
40
41
|
def _get_streams(self):
|
|
42
|
+
headers = {}
|
|
41
43
|
if not self.matches["mangomoloplayer"]:
|
|
44
|
+
headers["Referer"] = self.url
|
|
42
45
|
self._get_player_url()
|
|
43
46
|
|
|
44
|
-
hls_url = self.session.http.get(self.url, schema=validate.Schema(
|
|
47
|
+
hls_url = self.session.http.get(self.url, headers=headers, schema=validate.Schema(
|
|
45
48
|
re.compile(r"src\s*:\s*(?P<q>[\"'])(?P<url>https?://\S+?\.m3u8\S*?)(?P=q)"),
|
|
46
49
|
validate.none_or_all(validate.get("url")),
|
|
47
50
|
))
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"""
|
|
2
|
+
$description Live TV and video on-demand service owned by Paramount Streaming.
|
|
3
|
+
$url pluto.tv
|
|
4
|
+
$type live, vod
|
|
5
|
+
$metadata id
|
|
6
|
+
$metadata author
|
|
7
|
+
$metadata category
|
|
8
|
+
$metadata title
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
import re
|
|
13
|
+
from urllib.parse import parse_qsl, urljoin
|
|
14
|
+
from uuid import uuid4
|
|
15
|
+
|
|
16
|
+
from streamlink.exceptions import PluginError
|
|
17
|
+
from streamlink.plugin import Plugin, pluginmatcher
|
|
18
|
+
from streamlink.plugin.api import useragents, validate
|
|
19
|
+
from streamlink.stream.hls import HLSStream, HLSStreamReader, HLSStreamWriter
|
|
20
|
+
from streamlink.utils.url import update_qsd
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
log = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class PlutoHLSStreamWriter(HLSStreamWriter):
|
|
27
|
+
ad_re = re.compile(r"_ad/creative/|creative/\d+_ad/|dai\.google\.com|Pluto_TV_OandO/.*(Bumper|plutotv_filler)")
|
|
28
|
+
|
|
29
|
+
def should_filter_segment(self, segment):
|
|
30
|
+
return self.ad_re.search(segment.uri) is not None or super().should_filter_segment(segment)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class PlutoHLSStreamReader(HLSStreamReader):
|
|
34
|
+
__writer__ = PlutoHLSStreamWriter
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class PlutoHLSStream(HLSStream):
|
|
38
|
+
__shortname__ = "hls-pluto"
|
|
39
|
+
__reader__ = PlutoHLSStreamReader
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@pluginmatcher(
|
|
43
|
+
name="live",
|
|
44
|
+
pattern=re.compile(
|
|
45
|
+
r"https?://(?:www\.)?pluto\.tv/(?:\w{2}/)?live-tv/(?P<id>[^/]+)/?$",
|
|
46
|
+
),
|
|
47
|
+
)
|
|
48
|
+
@pluginmatcher(
|
|
49
|
+
name="series",
|
|
50
|
+
pattern=re.compile(
|
|
51
|
+
r"https?://(?:www\.)?pluto\.tv/(?:\w{2}/)?on-demand/series/(?P<id_s>[^/]+)(?:/season/\d+)?/episode/(?P<id_e>[^/]+)/?$",
|
|
52
|
+
),
|
|
53
|
+
)
|
|
54
|
+
@pluginmatcher(
|
|
55
|
+
name="movies",
|
|
56
|
+
pattern=re.compile(
|
|
57
|
+
r"https?://(?:www\.)?pluto\.tv/(?:\w{2}/)?on-demand/movies/(?P<id>[^/]+)/?$",
|
|
58
|
+
),
|
|
59
|
+
)
|
|
60
|
+
class Pluto(Plugin):
|
|
61
|
+
def __init__(self, *args, **kwargs):
|
|
62
|
+
super().__init__(*args, **kwargs)
|
|
63
|
+
self.session.http.headers.update({"User-Agent": useragents.FIREFOX})
|
|
64
|
+
self._app_version = None
|
|
65
|
+
self._device_version = re.search(r"Firefox/(\d+(?:\.\d+)*)", useragents.FIREFOX)[1]
|
|
66
|
+
self._client_id = str(uuid4())
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def app_version(self):
|
|
70
|
+
if self._app_version:
|
|
71
|
+
return self._app_version
|
|
72
|
+
|
|
73
|
+
self._app_version = self.session.http.get(
|
|
74
|
+
self.url,
|
|
75
|
+
schema=validate.Schema(
|
|
76
|
+
validate.parse_html(),
|
|
77
|
+
validate.xml_xpath_string(".//head/meta[@name='appVersion']/@content"),
|
|
78
|
+
validate.any(None, str),
|
|
79
|
+
),
|
|
80
|
+
)
|
|
81
|
+
if not self._app_version:
|
|
82
|
+
raise PluginError("Could not find pluto app version")
|
|
83
|
+
|
|
84
|
+
log.debug(f"{self._app_version=}")
|
|
85
|
+
|
|
86
|
+
return self._app_version
|
|
87
|
+
|
|
88
|
+
def _get_api_data(self, request):
|
|
89
|
+
log.debug(f"_get_api_data: {request=}")
|
|
90
|
+
|
|
91
|
+
schema_paths = validate.any(
|
|
92
|
+
validate.all(
|
|
93
|
+
{
|
|
94
|
+
"paths": [
|
|
95
|
+
validate.all(
|
|
96
|
+
{
|
|
97
|
+
"type": str,
|
|
98
|
+
"path": str,
|
|
99
|
+
},
|
|
100
|
+
validate.union_get("type", "path"),
|
|
101
|
+
),
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
validate.get("paths"),
|
|
105
|
+
),
|
|
106
|
+
validate.all(
|
|
107
|
+
{
|
|
108
|
+
"path": str,
|
|
109
|
+
},
|
|
110
|
+
validate.transform(lambda obj: [("hls", obj["path"])]),
|
|
111
|
+
),
|
|
112
|
+
)
|
|
113
|
+
schema_live = [{
|
|
114
|
+
"name": str,
|
|
115
|
+
"id": str,
|
|
116
|
+
"slug": str,
|
|
117
|
+
"stitched": schema_paths,
|
|
118
|
+
}]
|
|
119
|
+
schema_vod = [{
|
|
120
|
+
"name": str,
|
|
121
|
+
"id": str,
|
|
122
|
+
"slug": str,
|
|
123
|
+
"genre": str,
|
|
124
|
+
"stitched": validate.any(schema_paths, {}),
|
|
125
|
+
validate.optional("seasons"): [{
|
|
126
|
+
"episodes": [{
|
|
127
|
+
"name": str,
|
|
128
|
+
"_id": str,
|
|
129
|
+
"slug": str,
|
|
130
|
+
"stitched": schema_paths,
|
|
131
|
+
}],
|
|
132
|
+
}],
|
|
133
|
+
}]
|
|
134
|
+
|
|
135
|
+
return self.session.http.get(
|
|
136
|
+
"https://boot.pluto.tv/v4/start",
|
|
137
|
+
params={
|
|
138
|
+
"appName": "web",
|
|
139
|
+
"appVersion": self.app_version,
|
|
140
|
+
"deviceVersion": self._device_version,
|
|
141
|
+
"deviceModel": "web",
|
|
142
|
+
"deviceMake": "firefox",
|
|
143
|
+
"deviceType": "web",
|
|
144
|
+
"clientID": self._client_id,
|
|
145
|
+
"clientModelNumber": "1.0.0",
|
|
146
|
+
**request,
|
|
147
|
+
},
|
|
148
|
+
schema=validate.Schema(
|
|
149
|
+
validate.parse_json(),
|
|
150
|
+
{
|
|
151
|
+
"servers": {
|
|
152
|
+
"stitcher": validate.url(),
|
|
153
|
+
},
|
|
154
|
+
"stitcherParams": str,
|
|
155
|
+
"sessionToken": str,
|
|
156
|
+
validate.optional("EPG"): schema_live,
|
|
157
|
+
validate.optional("VOD"): schema_vod,
|
|
158
|
+
},
|
|
159
|
+
),
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def _get_streams_live(self):
|
|
163
|
+
data = self._get_api_data({"channelSlug": self.match["id"]})
|
|
164
|
+
epg = data.get("EPG", [])
|
|
165
|
+
media = next((e for e in epg if e["id"] == self.match["id"]), None)
|
|
166
|
+
if not media:
|
|
167
|
+
return
|
|
168
|
+
|
|
169
|
+
self.id = media["id"]
|
|
170
|
+
self.title = media["name"]
|
|
171
|
+
|
|
172
|
+
return data, media["stitched"]
|
|
173
|
+
|
|
174
|
+
def _get_streams_series(self):
|
|
175
|
+
data = self._get_api_data({"seriesIDs": self.match["id_s"]})
|
|
176
|
+
vod = data.get("VOD", [])
|
|
177
|
+
media = next((v for v in vod if v["id"] == self.match["id_s"]), None)
|
|
178
|
+
if not media:
|
|
179
|
+
return
|
|
180
|
+
seasons = media.get("seasons", [])
|
|
181
|
+
episode = next((e for s in seasons for e in s["episodes"] if e["_id"] == self.match["id_e"]), None)
|
|
182
|
+
if not episode:
|
|
183
|
+
return
|
|
184
|
+
|
|
185
|
+
self.id = episode["_id"]
|
|
186
|
+
self.author = media["name"]
|
|
187
|
+
self.category = media["genre"]
|
|
188
|
+
self.title = episode["name"]
|
|
189
|
+
|
|
190
|
+
return data, episode["stitched"]
|
|
191
|
+
|
|
192
|
+
def _get_streams_movies(self):
|
|
193
|
+
data = self._get_api_data({"seriesIDs": self.match["id"]})
|
|
194
|
+
vod = data.get("VOD", [])
|
|
195
|
+
media = next((v for v in vod if v["id"] == self.match["id"]), None)
|
|
196
|
+
if not media:
|
|
197
|
+
return
|
|
198
|
+
|
|
199
|
+
self.id = media["id"]
|
|
200
|
+
self.category = media["genre"]
|
|
201
|
+
self.title = media["name"]
|
|
202
|
+
|
|
203
|
+
return data, media["stitched"]
|
|
204
|
+
|
|
205
|
+
def _get_streams(self):
|
|
206
|
+
res = None
|
|
207
|
+
if self.matches["live"]:
|
|
208
|
+
res = self._get_streams_live()
|
|
209
|
+
elif self.matches["series"]:
|
|
210
|
+
res = self._get_streams_series()
|
|
211
|
+
elif self.matches["movies"]:
|
|
212
|
+
res = self._get_streams_movies()
|
|
213
|
+
|
|
214
|
+
if not res:
|
|
215
|
+
return
|
|
216
|
+
|
|
217
|
+
data, paths = res
|
|
218
|
+
for mediatype, path in paths:
|
|
219
|
+
if mediatype != "hls":
|
|
220
|
+
continue
|
|
221
|
+
|
|
222
|
+
params = dict(parse_qsl(data["stitcherParams"]))
|
|
223
|
+
params["jwt"] = data["sessionToken"]
|
|
224
|
+
url = urljoin(data["servers"]["stitcher"], path)
|
|
225
|
+
url = update_qsd(url, params)
|
|
226
|
+
|
|
227
|
+
return PlutoHLSStream.parse_variant_playlist(self.session, url)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
__plugin__ = Pluto
|
|
@@ -84,7 +84,7 @@ class Showroom(Plugin):
|
|
|
84
84
|
)
|
|
85
85
|
|
|
86
86
|
res = self.session.http.get(url, acceptable_status=(200, 403, 404))
|
|
87
|
-
if res.headers["Content-Type"]
|
|
87
|
+
if res.headers["Content-Type"] not in ("application/x-mpegURL", "application/vnd.apple.mpegurl"):
|
|
88
88
|
log.error("This stream is restricted")
|
|
89
89
|
return
|
|
90
90
|
|
|
@@ -541,7 +541,7 @@ class TwitchClientIntegrity:
|
|
|
541
541
|
headers: Mapping[str, str],
|
|
542
542
|
device_id: str,
|
|
543
543
|
) -> Optional[Tuple[str, int]]:
|
|
544
|
-
from exceptiongroup import BaseExceptionGroup
|
|
544
|
+
from exceptiongroup import BaseExceptionGroup # noqa: PLC0415, I001
|
|
545
545
|
from streamlink.webbrowser.cdp import CDPClient, CDPClientSession, devtools # noqa: PLC0415
|
|
546
546
|
|
|
547
547
|
url = f"https://www.twitch.tv/{channel}"
|
|
@@ -565,19 +565,17 @@ class TwitchClientIntegrity:
|
|
|
565
565
|
await client_session.loaded(frame_id)
|
|
566
566
|
return await client_session.evaluate(js_get_integrity_token, timeout=eval_timeout)
|
|
567
567
|
|
|
568
|
-
|
|
569
|
-
for err in exc_grp.exceptions:
|
|
570
|
-
log.error(f"{type(err).__name__}: {err}")
|
|
571
|
-
|
|
572
|
-
with catch({ # type: ignore[dict-item] # bug in exceptiongroup==1.2.0
|
|
573
|
-
Exception: handle_error, # type: ignore[dict-item] # bug in exceptiongroup==1.2.0
|
|
574
|
-
}):
|
|
568
|
+
try:
|
|
575
569
|
client_integrity = CDPClient.launch(
|
|
576
570
|
session,
|
|
577
571
|
acquire_client_integrity_token,
|
|
578
572
|
# headless mode gets detected by Twitch, so we have to disable it regardless the user config
|
|
579
573
|
headless=False,
|
|
580
574
|
)
|
|
575
|
+
except BaseExceptionGroup:
|
|
576
|
+
log.exception("Failed acquiring client integrity token")
|
|
577
|
+
except Exception as err:
|
|
578
|
+
log.error(err)
|
|
581
579
|
|
|
582
580
|
if not client_integrity:
|
|
583
581
|
return None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""
|
|
2
2
|
$description Russian live-streaming platform for gaming and esports, owned by VKontakte.
|
|
3
|
-
$url vkplay.
|
|
3
|
+
$url live.vkplay.ru
|
|
4
4
|
$type live
|
|
5
5
|
$metadata id
|
|
6
6
|
$metadata author
|
|
@@ -20,13 +20,13 @@ log = logging.getLogger(__name__)
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
@pluginmatcher(re.compile(
|
|
23
|
-
r"https?://vkplay\.live/(?P<channel_name>\w+)/?$",
|
|
23
|
+
r"https?://(?:live\.vkplay\.ru|vkplay\.live)/(?P<channel_name>\w+)/?$",
|
|
24
24
|
))
|
|
25
25
|
class VKplay(Plugin):
|
|
26
|
-
API_URL = "https://api.vkplay.
|
|
26
|
+
API_URL = "https://api.live.vkplay.ru/v1"
|
|
27
27
|
|
|
28
28
|
def _get_streams(self):
|
|
29
|
-
self.author = self.match
|
|
29
|
+
self.author = self.match["channel_name"]
|
|
30
30
|
log.debug(f"Channel name: {self.author}")
|
|
31
31
|
|
|
32
32
|
data = self.session.http.get(
|
|
@@ -8,7 +8,7 @@ from subprocess import DEVNULL
|
|
|
8
8
|
from typing import AsyncContextManager, AsyncGenerator, Generator, List, Optional, Union
|
|
9
9
|
|
|
10
10
|
import trio
|
|
11
|
-
from exceptiongroup import BaseExceptionGroup
|
|
11
|
+
from exceptiongroup import BaseExceptionGroup
|
|
12
12
|
|
|
13
13
|
from streamlink.utils.path import resolve_executable
|
|
14
14
|
from streamlink.webbrowser.exceptions import WebbrowserError
|
|
@@ -80,12 +80,7 @@ class _WebbrowserLauncher:
|
|
|
80
80
|
|
|
81
81
|
@asynccontextmanager
|
|
82
82
|
async def launch(self) -> AsyncGenerator[trio.Nursery, None]:
|
|
83
|
-
|
|
84
|
-
raise exc_grp.exceptions[0] from exc_grp.exceptions[0].__context__
|
|
85
|
-
|
|
86
|
-
with catch({ # type: ignore[dict-item] # bug in exceptiongroup==1.2.0
|
|
87
|
-
(KeyboardInterrupt, SystemExit): handle_baseexception, # type: ignore[dict-item] # bug in exceptiongroup==1.2.0
|
|
88
|
-
}):
|
|
83
|
+
try:
|
|
89
84
|
async with trio.open_nursery() as nursery:
|
|
90
85
|
log.info(f"Launching web browser: {self.executable}")
|
|
91
86
|
# the process is run in a separate task
|
|
@@ -113,6 +108,13 @@ class _WebbrowserLauncher:
|
|
|
113
108
|
log.debug("Waiting for web browser process to terminate")
|
|
114
109
|
# once the application logic is done, cancel the entire task group and terminate/kill the process
|
|
115
110
|
nursery.cancel_scope.cancel()
|
|
111
|
+
except BaseExceptionGroup as exc_grp: # TODO: py310 support end: use except*
|
|
112
|
+
exc: Union[BaseException, BaseExceptionGroup, None] = exc_grp.subgroup((KeyboardInterrupt, SystemExit))
|
|
113
|
+
if not exc: # not a KeyboardInterrupt or SystemExit
|
|
114
|
+
raise
|
|
115
|
+
while isinstance(exc, BaseExceptionGroup): # get the first actual exception in the potentially nested groups
|
|
116
|
+
exc = exc.exceptions[0]
|
|
117
|
+
raise exc from exc.__context__
|
|
116
118
|
|
|
117
119
|
async def _task_process_watcher(self, process: trio.Process, nursery: trio.Nursery) -> None:
|
|
118
120
|
"""Task for cancelling the launch task group if the user closes the browser or if it exits early on its own"""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: streamlink
|
|
3
|
-
Version: 6.7.
|
|
3
|
+
Version: 6.7.3
|
|
4
4
|
Summary: Streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of choice.
|
|
5
5
|
Author: Streamlink
|
|
6
6
|
Author-email: streamlink@protonmail.com
|
|
@@ -2,17 +2,18 @@ from pathlib import Path
|
|
|
2
2
|
from typing import Optional
|
|
3
3
|
|
|
4
4
|
from streamlink.utils.formatter import Formatter as _BaseFormatter
|
|
5
|
-
from streamlink_cli.utils.path import replace_chars, replace_path
|
|
5
|
+
from streamlink_cli.utils.path import replace_chars, replace_path, truncate_path
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class Formatter(_BaseFormatter):
|
|
9
9
|
title = _BaseFormatter.format
|
|
10
10
|
|
|
11
|
-
def path(self, pathlike: str, charmap: Optional[str] = None) -> Path:
|
|
11
|
+
def path(self, pathlike: str, charmap: Optional[str] = None, max_filename_length: int = 255) -> Path:
|
|
12
12
|
def mapper(s):
|
|
13
13
|
return replace_chars(s, charmap)
|
|
14
14
|
|
|
15
|
-
def format_part(part):
|
|
16
|
-
|
|
15
|
+
def format_part(part: str, isfile: bool) -> str:
|
|
16
|
+
formatted = self._format(part, mapper, {})
|
|
17
|
+
return truncate_path(formatted, max_filename_length, keep_extension=isfile)
|
|
17
18
|
|
|
18
19
|
return replace_path(pathlike, format_part)
|
|
@@ -35,9 +35,31 @@ def replace_chars(path: str, charmap: Optional[str] = None, replacement: str = R
|
|
|
35
35
|
return pattern.sub(replacement, path)
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
# This method does not take care of unicode modifier characters when truncating
|
|
39
|
+
def truncate_path(path: str, length: int = 255, keep_extension: bool = True) -> str:
|
|
40
|
+
parts = path.rsplit(".", 1)
|
|
41
|
+
|
|
42
|
+
# no file name extension (no dot separator in path or file name extension too long):
|
|
43
|
+
# truncate the whole thing
|
|
44
|
+
if not keep_extension or len(parts) == 1 or len(parts[1]) > 10:
|
|
45
|
+
encoded = path.encode("utf-8")
|
|
46
|
+
truncated = encoded[:length]
|
|
47
|
+
decoded = truncated.decode("utf-8", errors="ignore")
|
|
48
|
+
return decoded
|
|
49
|
+
|
|
50
|
+
# truncate file name, but keep file name extension
|
|
51
|
+
encoded = parts[0].encode("utf-8")
|
|
52
|
+
truncated = encoded[:length - len(parts[1]) - 1]
|
|
53
|
+
decoded = truncated.decode("utf-8", errors="ignore")
|
|
54
|
+
return f"{decoded}.{parts[1]}"
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def replace_path(pathlike: Union[str, Path], mapper: Callable[[str, bool], str]) -> Path:
|
|
58
|
+
def get_part(part: str, isfile: bool) -> str:
|
|
59
|
+
newpart = mapper(part, isfile)
|
|
41
60
|
return REPLACEMENT if part != newpart and newpart in SPECIAL_PATH_PARTS else newpart
|
|
42
61
|
|
|
43
|
-
|
|
62
|
+
parts = Path(pathlike).expanduser().parts
|
|
63
|
+
last = len(parts) - 1
|
|
64
|
+
|
|
65
|
+
return Path(*(get_part(part, i == last) for i, part in enumerate(parts)))
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
2
|
from os.path import sep
|
|
3
3
|
from pathlib import Path
|
|
4
|
+
from string import ascii_letters as alphabet
|
|
4
5
|
from unittest.mock import Mock, call, patch
|
|
5
6
|
|
|
6
7
|
import pytest
|
|
@@ -79,3 +80,19 @@ class TestCLIFormatter:
|
|
|
79
80
|
path = formatter.path(f"{{current}}{sep}{{parent}}{sep}{{dots}}{sep}{{separator}}{sep}foo{sep}.{sep}..{sep}bar")
|
|
80
81
|
assert path == Path("_", "_", "...", "_", "foo", ".", "..", "bar"), \
|
|
81
82
|
"Formats the path's parts separately and ignores current and parent directories in substitutions only"
|
|
83
|
+
|
|
84
|
+
def test_path_truncation_ascii(self, formatter: Formatter):
|
|
85
|
+
formatter.mapping.update({
|
|
86
|
+
"dir": lambda: alphabet * 10,
|
|
87
|
+
"file": lambda: alphabet * 10,
|
|
88
|
+
})
|
|
89
|
+
path = formatter.path(f"{{dir}}.fakeext{sep}{{file}}.ext")
|
|
90
|
+
assert path == Path((alphabet * 10)[:255], f"{(alphabet * 10)[:251]}.ext")
|
|
91
|
+
|
|
92
|
+
def test_path_truncation_unicode(self, formatter: Formatter):
|
|
93
|
+
formatter.mapping.update({
|
|
94
|
+
"dir": lambda: "🐻" * 512,
|
|
95
|
+
"file": lambda: "🐻" * 512,
|
|
96
|
+
})
|
|
97
|
+
path = formatter.path(f"{{dir}}.fakeext{sep}{{file}}.ext")
|
|
98
|
+
assert path == Path("🐻" * 63, f"{'🐻' * 62}.ext")
|