streamlink 7.2.0__tar.gz → 7.4.0__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.
Files changed (626) hide show
  1. {streamlink-7.2.0 → streamlink-7.4.0}/CHANGELOG.md +29 -0
  2. {streamlink-7.2.0 → streamlink-7.4.0}/PKG-INFO +2 -3
  3. {streamlink-7.2.0 → streamlink-7.4.0}/completions/bash/streamlink +5 -0
  4. {streamlink-7.2.0 → streamlink-7.4.0}/dev-requirements.txt +3 -2
  5. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_build/man/streamlink.1 +1 -1
  6. {streamlink-7.2.0 → streamlink-7.4.0}/docs/changelog.md +29 -0
  7. {streamlink-7.2.0 → streamlink-7.4.0}/docs/developing.rst +1 -1
  8. {streamlink-7.2.0 → streamlink-7.4.0}/docs/install.rst +9 -41
  9. {streamlink-7.2.0 → streamlink-7.4.0}/pyproject.toml +3 -6
  10. {streamlink-7.2.0 → streamlink-7.4.0}/setup.py +1 -1
  11. streamlink-7.4.0/src/streamlink/_version.py +1 -0
  12. streamlink-7.4.0/src/streamlink/plugins/blasttv.py +114 -0
  13. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/kick.py +79 -16
  14. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/nicolive.py +1 -0
  15. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/picarto.py +12 -19
  16. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tvp.py +70 -64
  17. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/twitcasting.py +32 -55
  18. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/session/http.py +4 -0
  19. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/session/http.pyi +7 -0
  20. streamlink-7.4.0/src/streamlink/session/http_useragents.py +16 -0
  21. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/dash/dash.py +16 -3
  22. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/dash/manifest.py +1 -0
  23. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/hls/hls.py +1 -1
  24. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/validate/__init__.py +1 -1
  25. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink.egg-info/PKG-INFO +2 -3
  26. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink.egg-info/SOURCES.txt +19 -6
  27. streamlink-7.4.0/src/streamlink_cli/console/__init__.py +3 -0
  28. {streamlink-7.2.0/src/streamlink_cli → streamlink-7.4.0/src/streamlink_cli/console}/console.py +39 -30
  29. {streamlink-7.2.0/src/streamlink_cli/utils → streamlink-7.4.0/src/streamlink_cli/console}/progress.py +19 -102
  30. streamlink-7.4.0/src/streamlink_cli/console/stream.py +163 -0
  31. streamlink-7.4.0/src/streamlink_cli/console/stream_wrapper.py +37 -0
  32. streamlink-7.4.0/src/streamlink_cli/console/stream_wrapper.pyi +14 -0
  33. streamlink-7.4.0/src/streamlink_cli/console/terminal.py +79 -0
  34. streamlink-7.4.0/src/streamlink_cli/console/user_input.py +17 -0
  35. streamlink-7.4.0/src/streamlink_cli/console/windows.py +200 -0
  36. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/constants.py +3 -0
  37. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/main.py +55 -18
  38. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/streamrunner.py +7 -22
  39. {streamlink-7.2.0/tests/cli → streamlink-7.4.0/tests/cli/console}/test_console.py +84 -29
  40. {streamlink-7.2.0/tests/cli/utils → streamlink-7.4.0/tests/cli/console}/test_progress.py +45 -78
  41. streamlink-7.4.0/tests/cli/console/test_stream.py +386 -0
  42. streamlink-7.4.0/tests/cli/console/test_stream_wrapper.py +58 -0
  43. streamlink-7.4.0/tests/cli/console/test_terminal.py +46 -0
  44. streamlink-7.4.0/tests/cli/console/test_windows.py +181 -0
  45. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/conftest.py +16 -0
  46. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_logging.py +28 -48
  47. streamlink-7.4.0/tests/cli/main/test_output_stream.py +197 -0
  48. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/test_streamrunner.py +31 -104
  49. streamlink-7.4.0/tests/plugins/test_blasttv.py +37 -0
  50. streamlink-7.4.0/tests/plugins/test_tvp.py +62 -0
  51. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/__init__.py +2 -3
  52. streamlink-7.4.0/tests/resources/dash/test_period_selection.mpd +50 -0
  53. {streamlink-7.2.0 → streamlink-7.4.0}/tests/session/test_http.py +71 -0
  54. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/dash/test_dash.py +36 -0
  55. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/hls/test_hls.py +8 -0
  56. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_cache.py +3 -4
  57. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_compat.py +5 -5
  58. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_validate.py +13 -6
  59. streamlink-7.4.0/tests/webbrowser/__init__.py +0 -0
  60. streamlink-7.2.0/src/streamlink/_version.py +0 -1
  61. streamlink-7.2.0/src/streamlink/plugins/vtvgo.py +0 -79
  62. streamlink-7.2.0/src/streamlink/session/http_useragents.py +0 -16
  63. streamlink-7.2.0/tests/cli/main/test_output_stream.py +0 -102
  64. streamlink-7.2.0/tests/plugins/test_tvp.py +0 -50
  65. streamlink-7.2.0/tests/plugins/test_vtvgo.py +0 -25
  66. {streamlink-7.2.0 → streamlink-7.4.0}/AUTHORS +0 -0
  67. {streamlink-7.2.0 → streamlink-7.4.0}/LICENSE +0 -0
  68. {streamlink-7.2.0 → streamlink-7.4.0}/MANIFEST.in +0 -0
  69. {streamlink-7.2.0 → streamlink-7.4.0}/README.md +0 -0
  70. {streamlink-7.2.0 → streamlink-7.4.0}/build_backend/__init__.py +0 -0
  71. {streamlink-7.2.0 → streamlink-7.4.0}/build_backend/commands.py +0 -0
  72. {streamlink-7.2.0 → streamlink-7.4.0}/build_backend/onbuild.py +0 -0
  73. {streamlink-7.2.0 → streamlink-7.4.0}/build_backend/plugins_json.py +0 -0
  74. {streamlink-7.2.0 → streamlink-7.4.0}/build_backend/test_build_backend.py +0 -0
  75. {streamlink-7.2.0 → streamlink-7.4.0}/build_backend/test_onbuild.py +0 -0
  76. {streamlink-7.2.0 → streamlink-7.4.0}/build_backend/test_plugins_json.py +0 -0
  77. {streamlink-7.2.0 → streamlink-7.4.0}/completions/zsh/_streamlink +0 -0
  78. {streamlink-7.2.0 → streamlink-7.4.0}/docs/Makefile +0 -0
  79. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_man.rst +0 -0
  80. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/apple-touch-icon.png +0 -0
  81. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/favicon-16x16.png +0 -0
  82. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/favicon-32x32.png +0 -0
  83. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/favicon.ico +0 -0
  84. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/icon-ffmpeg.svg +0 -0
  85. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/icon-python.svg +0 -0
  86. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/icon.svg +0 -0
  87. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/opengraph-image.png +0 -0
  88. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/site.webmanifest +0 -0
  89. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_static/styles/custom.css +0 -0
  90. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_templates/base.html +0 -0
  91. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_templates/page.html +0 -0
  92. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_templates/sidebar/brand.html +0 -0
  93. {streamlink-7.2.0 → streamlink-7.4.0}/docs/_templates/sidebar/github-buttons.html +0 -0
  94. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/cache.rst +0 -0
  95. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/exceptions.rst +0 -0
  96. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/options.rst +0 -0
  97. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/plugin.rst +0 -0
  98. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/session.rst +0 -0
  99. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/stream.rst +0 -0
  100. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/streamlink.rst +0 -0
  101. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/validate.rst +0 -0
  102. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api/webbrowser.rst +0 -0
  103. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api.rst +0 -0
  104. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api_guide/quickstart.rst +0 -0
  105. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api_guide/validate.rst +0 -0
  106. {streamlink-7.2.0 → streamlink-7.4.0}/docs/api_guide.rst +0 -0
  107. {streamlink-7.2.0 → streamlink-7.4.0}/docs/applications.rst +0 -0
  108. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli/config.rst +0 -0
  109. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli/metadata.rst +0 -0
  110. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli/plugin-sideloading.rst +0 -0
  111. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli/plugins/twitch.rst +0 -0
  112. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli/plugins.rst +0 -0
  113. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli/protocols.rst +0 -0
  114. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli/proxy.rst +0 -0
  115. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli/tutorial.rst +0 -0
  116. {streamlink-7.2.0 → streamlink-7.4.0}/docs/cli.rst +0 -0
  117. {streamlink-7.2.0 → streamlink-7.4.0}/docs/conf.py +0 -0
  118. {streamlink-7.2.0 → streamlink-7.4.0}/docs/deprecations.rst +0 -0
  119. {streamlink-7.2.0 → streamlink-7.4.0}/docs/docutils.conf +0 -0
  120. {streamlink-7.2.0 → streamlink-7.4.0}/docs/ext_argparse.py +0 -0
  121. {streamlink-7.2.0 → streamlink-7.4.0}/docs/ext_github.py +0 -0
  122. {streamlink-7.2.0 → streamlink-7.4.0}/docs/ext_html_template_vars.py +0 -0
  123. {streamlink-7.2.0 → streamlink-7.4.0}/docs/ext_plugins.py +0 -0
  124. {streamlink-7.2.0 → streamlink-7.4.0}/docs/ext_releaseref.py +0 -0
  125. {streamlink-7.2.0 → streamlink-7.4.0}/docs/index.rst +0 -0
  126. {streamlink-7.2.0 → streamlink-7.4.0}/docs/migrations.rst +0 -0
  127. {streamlink-7.2.0 → streamlink-7.4.0}/docs/players.rst +0 -0
  128. {streamlink-7.2.0 → streamlink-7.4.0}/docs/plugins.rst +0 -0
  129. {streamlink-7.2.0 → streamlink-7.4.0}/docs/support.rst +0 -0
  130. {streamlink-7.2.0 → streamlink-7.4.0}/docs/thirdparty.rst +0 -0
  131. {streamlink-7.2.0 → streamlink-7.4.0}/docs-requirements.txt +0 -0
  132. {streamlink-7.2.0 → streamlink-7.4.0}/icon.svg +0 -0
  133. {streamlink-7.2.0 → streamlink-7.4.0}/script/build-shell-completions.sh +0 -0
  134. {streamlink-7.2.0 → streamlink-7.4.0}/setup.cfg +0 -0
  135. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/__init__.py +0 -0
  136. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/__main__.py +0 -0
  137. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/api.py +0 -0
  138. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/buffers.py +0 -0
  139. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/cache.py +0 -0
  140. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/compat.py +0 -0
  141. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/exceptions.py +0 -0
  142. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/logger.py +0 -0
  143. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/options.py +0 -0
  144. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/packages/__init__.py +0 -0
  145. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/packages/requests_file.py +0 -0
  146. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugin/__init__.py +0 -0
  147. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugin/api/__init__.py +0 -0
  148. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugin/api/useragents.py +0 -0
  149. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugin/api/validate.py +0 -0
  150. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugin/api/webbrowser/__init__.py +0 -0
  151. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugin/api/webbrowser/aws_waf.py +0 -0
  152. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugin/api/websocket.py +0 -0
  153. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugin/plugin.py +0 -0
  154. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/__init__.py +0 -0
  155. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/abematv.py +0 -0
  156. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/adultswim.py +0 -0
  157. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/albavision.py +0 -0
  158. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/aloula.py +0 -0
  159. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/app17.py +0 -0
  160. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/ard_live.py +0 -0
  161. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/ard_mediathek.py +0 -0
  162. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/artetv.py +0 -0
  163. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/atpchallenger.py +0 -0
  164. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/atresplayer.py +0 -0
  165. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/bbciplayer.py +0 -0
  166. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/bfmtv.py +0 -0
  167. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/bigo.py +0 -0
  168. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/bilibili.py +0 -0
  169. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/blazetv.py +0 -0
  170. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/bloomberg.py +0 -0
  171. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/brightcove.py +0 -0
  172. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/btv.py +0 -0
  173. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/cbsnews.py +0 -0
  174. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/cdnbg.py +0 -0
  175. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/ceskatelevize.py +0 -0
  176. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/chzzk.py +0 -0
  177. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/cinergroup.py +0 -0
  178. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/clubbingtv.py +0 -0
  179. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/cmmedia.py +0 -0
  180. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/cnbce.py +0 -0
  181. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/cnews.py +0 -0
  182. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/dailymotion.py +0 -0
  183. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/dash.py +0 -0
  184. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/delfi.py +0 -0
  185. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/deutschewelle.py +0 -0
  186. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/dlive.py +0 -0
  187. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/dogan.py +0 -0
  188. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/dogus.py +0 -0
  189. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/douyin.py +0 -0
  190. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/drdk.py +0 -0
  191. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/earthcam.py +0 -0
  192. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/euronews.py +0 -0
  193. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/filmon.py +0 -0
  194. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/goltelevision.py +0 -0
  195. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/goodgame.py +0 -0
  196. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/googledrive.py +0 -0
  197. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/gulli.py +0 -0
  198. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/hiplayer.py +0 -0
  199. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/hls.py +0 -0
  200. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/http.py +0 -0
  201. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/htv.py +0 -0
  202. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/huajiao.py +0 -0
  203. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/huya.py +0 -0
  204. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/indihometv.py +0 -0
  205. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/invintus.py +0 -0
  206. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/kugou.py +0 -0
  207. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/livestream.py +0 -0
  208. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/lnk.py +0 -0
  209. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/lrt.py +0 -0
  210. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/ltv_lsm_lv.py +0 -0
  211. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/mangomolo.py +0 -0
  212. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/mdstrm.py +0 -0
  213. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/mediaklikk.py +0 -0
  214. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/mediavitrina.py +0 -0
  215. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/mitele.py +0 -0
  216. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/mixcloud.py +0 -0
  217. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/mjunoon.py +0 -0
  218. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/mrtmk.py +0 -0
  219. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/n13tv.py +0 -0
  220. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/nasaplus.py +0 -0
  221. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/nhkworld.py +0 -0
  222. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/nimotv.py +0 -0
  223. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/nos.py +0 -0
  224. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/nrk.py +0 -0
  225. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/okru.py +0 -0
  226. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/olympicchannel.py +0 -0
  227. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/oneplusone.py +0 -0
  228. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/onetv.py +0 -0
  229. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/openrectv.py +0 -0
  230. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/pandalive.py +0 -0
  231. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/piaulizaportal.py +0 -0
  232. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/piczel.py +0 -0
  233. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/pixiv.py +0 -0
  234. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/pluto.py +0 -0
  235. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/pluzz.py +0 -0
  236. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/radiko.py +0 -0
  237. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/raiplay.py +0 -0
  238. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/reuters.py +0 -0
  239. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/rtpa.py +0 -0
  240. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/rtpplay.py +0 -0
  241. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/rtve.py +0 -0
  242. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/rtvs.py +0 -0
  243. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/ruv.py +0 -0
  244. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/sbscokr.py +0 -0
  245. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/showroom.py +0 -0
  246. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/soop.py +0 -0
  247. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/sportal.py +0 -0
  248. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/sportschau.py +0 -0
  249. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/ssh101.py +0 -0
  250. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/stadium.py +0 -0
  251. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/steam.py +0 -0
  252. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/streann.py +0 -0
  253. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/stv.py +0 -0
  254. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/svtplay.py +0 -0
  255. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/swisstxt.py +0 -0
  256. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/telefe.py +0 -0
  257. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/telemadrid.py +0 -0
  258. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tf1.py +0 -0
  259. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tiktok.py +0 -0
  260. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/trovo.py +0 -0
  261. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/turkuvaz.py +0 -0
  262. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tv360.py +0 -0
  263. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tv3cat.py +0 -0
  264. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tv5monde.py +0 -0
  265. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tv8.py +0 -0
  266. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tv999.py +0 -0
  267. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tvibo.py +0 -0
  268. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tviplayer.py +0 -0
  269. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/tvtoya.py +0 -0
  270. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/twitch.py +0 -0
  271. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/ustreamtv.py +0 -0
  272. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/ustvnow.py +0 -0
  273. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/vidio.py +0 -0
  274. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/vimeo.py +0 -0
  275. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/vinhlongtv.py +0 -0
  276. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/vk.py +0 -0
  277. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/vkvideo.py +0 -0
  278. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/welt.py +0 -0
  279. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/wwenetwork.py +0 -0
  280. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/youtube.py +0 -0
  281. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/yupptv.py +0 -0
  282. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/zattoo.py +0 -0
  283. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/zdf_mediathek.py +0 -0
  284. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/plugins/zeenews.py +0 -0
  285. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/py.typed +0 -0
  286. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/session/__init__.py +0 -0
  287. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/session/options.py +0 -0
  288. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/session/plugins.py +0 -0
  289. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/session/session.py +0 -0
  290. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/__init__.py +0 -0
  291. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/dash/__init__.py +0 -0
  292. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/dash/segment.py +0 -0
  293. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/ffmpegmux.py +0 -0
  294. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/file.py +0 -0
  295. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/filtered.py +0 -0
  296. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/hls/__init__.py +0 -0
  297. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/hls/m3u8.py +0 -0
  298. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/hls/segment.py +0 -0
  299. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/http.py +0 -0
  300. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/segmented/__init__.py +0 -0
  301. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/segmented/segment.py +0 -0
  302. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/segmented/segmented.py +0 -0
  303. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/stream.py +0 -0
  304. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/stream/wrappers.py +0 -0
  305. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/user_input.py +0 -0
  306. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/__init__.py +0 -0
  307. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/args.py +0 -0
  308. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/cache.py +0 -0
  309. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/crypto.py +0 -0
  310. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/data.py +0 -0
  311. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/formatter.py +0 -0
  312. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/l10n.py +0 -0
  313. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/module.py +0 -0
  314. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/named_pipe.py +0 -0
  315. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/parse.py +0 -0
  316. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/path.py +0 -0
  317. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/processoutput.py +0 -0
  318. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/random.py +0 -0
  319. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/socket.py +0 -0
  320. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/times.py +0 -0
  321. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/utils/url.py +0 -0
  322. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/validate/_exception.py +0 -0
  323. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/validate/_schemas.py +0 -0
  324. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/validate/_validate.py +0 -0
  325. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/validate/_validators.py +0 -0
  326. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/__init__.py +0 -0
  327. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/__init__.py +0 -0
  328. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/client.py +0 -0
  329. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/connection.py +0 -0
  330. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/__init__.py +0 -0
  331. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/browser.py +0 -0
  332. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/debugger.py +0 -0
  333. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/dom.py +0 -0
  334. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/emulation.py +0 -0
  335. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/fetch.py +0 -0
  336. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/input_.py +0 -0
  337. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/inspector.py +0 -0
  338. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/io.py +0 -0
  339. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/network.py +0 -0
  340. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/page.py +0 -0
  341. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/runtime.py +0 -0
  342. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/security.py +0 -0
  343. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/target.py +0 -0
  344. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/devtools/util.py +0 -0
  345. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/cdp/exceptions.py +0 -0
  346. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/chromium.py +0 -0
  347. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/exceptions.py +0 -0
  348. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink/webbrowser/webbrowser.py +0 -0
  349. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink.egg-info/dependency_links.txt +0 -0
  350. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink.egg-info/entry_points.txt +0 -0
  351. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink.egg-info/requires.txt +0 -0
  352. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink.egg-info/top_level.txt +0 -0
  353. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/__init__.py +0 -0
  354. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/__main__.py +0 -0
  355. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/_parser.py +0 -0
  356. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/argparser.py +0 -0
  357. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/compat.py +0 -0
  358. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/exceptions.py +0 -0
  359. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/output/__init__.py +0 -0
  360. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/output/abc.py +0 -0
  361. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/output/file.py +0 -0
  362. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/output/http.py +0 -0
  363. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/output/player.py +0 -0
  364. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/py.typed +0 -0
  365. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/show_matchers.py +0 -0
  366. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/utils/__init__.py +0 -0
  367. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/utils/formatter.py +0 -0
  368. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/utils/path.py +0 -0
  369. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/utils/player.py +0 -0
  370. {streamlink-7.2.0 → streamlink-7.4.0}/src/streamlink_cli/utils/versioncheck.py +0 -0
  371. {streamlink-7.2.0 → streamlink-7.4.0}/tests/__init__.py +0 -0
  372. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/__init__.py +0 -0
  373. {streamlink-7.2.0/tests/cli/main → streamlink-7.4.0/tests/cli/console}/__init__.py +0 -0
  374. {streamlink-7.2.0/tests/cli/output → streamlink-7.4.0/tests/cli/main}/__init__.py +0 -0
  375. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_can_handle_url.py +0 -0
  376. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_check_file_output.py +0 -0
  377. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_create_output.py +0 -0
  378. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_formatter.py +0 -0
  379. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_handle_url.py +0 -0
  380. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_output_stream_passthrough.py +0 -0
  381. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_player_argv.py +0 -0
  382. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_resolve_stream_name.py +0 -0
  383. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_setup_config_args.py +0 -0
  384. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_show_matchers.py +0 -0
  385. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/main/test_version_check.py +0 -0
  386. {streamlink-7.2.0/tests/cli/utils → streamlink-7.4.0/tests/cli/output}/__init__.py +0 -0
  387. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/output/test_file.py +0 -0
  388. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/output/test_player.py +0 -0
  389. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/test_argparser.py +0 -0
  390. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/test_compat.py +0 -0
  391. {streamlink-7.2.0/tests/mixins → streamlink-7.4.0/tests/cli/utils}/__init__.py +0 -0
  392. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/utils/test_formatter.py +0 -0
  393. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/utils/test_path.py +0 -0
  394. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/utils/test_player.py +0 -0
  395. {streamlink-7.2.0 → streamlink-7.4.0}/tests/cli/utils/test_versioncheck.py +0 -0
  396. {streamlink-7.2.0 → streamlink-7.4.0}/tests/conftest.py +0 -0
  397. {streamlink-7.2.0/tests/plugin → streamlink-7.4.0/tests/mixins}/__init__.py +0 -0
  398. {streamlink-7.2.0 → streamlink-7.4.0}/tests/mixins/stream_hls.py +0 -0
  399. {streamlink-7.2.0/tests/session → streamlink-7.4.0/tests/plugin}/__init__.py +0 -0
  400. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugin/override/testplugin.py +0 -0
  401. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugin/testplugin.py +0 -0
  402. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugin/testplugin_invalid.py +0 -0
  403. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugin/testplugin_missing.py +0 -0
  404. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/__init__.py +0 -0
  405. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/conftest.py +0 -0
  406. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_abematv.py +0 -0
  407. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_adultswim.py +0 -0
  408. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_albavision.py +0 -0
  409. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_aloula.py +0 -0
  410. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_app17.py +0 -0
  411. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_ard_live.py +0 -0
  412. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_ard_mediathek.py +0 -0
  413. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_artetv.py +0 -0
  414. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_atpchallenger.py +0 -0
  415. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_atresplayer.py +0 -0
  416. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_bbciplayer.py +0 -0
  417. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_bfmtv.py +0 -0
  418. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_bigo.py +0 -0
  419. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_bilibili.py +0 -0
  420. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_blazetv.py +0 -0
  421. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_bloomberg.py +0 -0
  422. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_brightcove.py +0 -0
  423. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_btv.py +0 -0
  424. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_cbsnews.py +0 -0
  425. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_cdnbg.py +0 -0
  426. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_ceskatelevize.py +0 -0
  427. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_chzzk.py +0 -0
  428. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_cinergroup.py +0 -0
  429. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_clubbingtv.py +0 -0
  430. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_cmmedia.py +0 -0
  431. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_cnbce.py +0 -0
  432. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_cnews.py +0 -0
  433. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_dailymotion.py +0 -0
  434. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_dash.py +0 -0
  435. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_delfi.py +0 -0
  436. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_deutschewelle.py +0 -0
  437. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_dlive.py +0 -0
  438. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_dogan.py +0 -0
  439. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_dogus.py +0 -0
  440. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_douyin.py +0 -0
  441. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_drdk.py +0 -0
  442. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_earthcam.py +0 -0
  443. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_euronews.py +0 -0
  444. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_filmon.py +0 -0
  445. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_goltelevision.py +0 -0
  446. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_goodgame.py +0 -0
  447. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_googledrive.py +0 -0
  448. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_gulli.py +0 -0
  449. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_hiplayer.py +0 -0
  450. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_hls.py +0 -0
  451. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_http.py +0 -0
  452. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_htv.py +0 -0
  453. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_huajiao.py +0 -0
  454. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_huya.py +0 -0
  455. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_indihometv.py +0 -0
  456. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_invintus.py +0 -0
  457. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_kick.py +0 -0
  458. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_kugou.py +0 -0
  459. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_livestream.py +0 -0
  460. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_lnk.py +0 -0
  461. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_lrt.py +0 -0
  462. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_ltv_lsm_lv.py +0 -0
  463. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_mangomolo.py +0 -0
  464. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_mdstrm.py +0 -0
  465. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_mediaklikk.py +0 -0
  466. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_mediavitrina.py +0 -0
  467. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_mitele.py +0 -0
  468. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_mixcloud.py +0 -0
  469. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_mjunoon.py +0 -0
  470. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_mrtmk.py +0 -0
  471. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_n13tv.py +0 -0
  472. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_nasaplus.py +0 -0
  473. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_nhkworld.py +0 -0
  474. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_nicolive.py +0 -0
  475. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_nimotv.py +0 -0
  476. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_nos.py +0 -0
  477. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_nrk.py +0 -0
  478. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_okru.py +0 -0
  479. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_olympicchannel.py +0 -0
  480. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_oneplusone.py +0 -0
  481. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_onetv.py +0 -0
  482. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_openrectv.py +0 -0
  483. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_pandalive.py +0 -0
  484. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_piaulizaportal.py +0 -0
  485. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_picarto.py +0 -0
  486. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_piczel.py +0 -0
  487. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_pixiv.py +0 -0
  488. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_pluto.py +0 -0
  489. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_pluzz.py +0 -0
  490. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_radiko.py +0 -0
  491. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_raiplay.py +0 -0
  492. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_reuters.py +0 -0
  493. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_rtpa.py +0 -0
  494. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_rtpplay.py +0 -0
  495. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_rtve.py +0 -0
  496. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_rtvs.py +0 -0
  497. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_ruv.py +0 -0
  498. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_sbscokr.py +0 -0
  499. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_showroom.py +0 -0
  500. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_soop.py +0 -0
  501. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_sportal.py +0 -0
  502. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_sportschau.py +0 -0
  503. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_ssh101.py +0 -0
  504. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_stadium.py +0 -0
  505. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_steam.py +0 -0
  506. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_streann.py +0 -0
  507. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_stv.py +0 -0
  508. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_svtplay.py +0 -0
  509. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_swisstxt.py +0 -0
  510. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_telefe.py +0 -0
  511. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_telemadrid.py +0 -0
  512. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tf1.py +0 -0
  513. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tiktok.py +0 -0
  514. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_trovo.py +0 -0
  515. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_turkuvaz.py +0 -0
  516. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tv360.py +0 -0
  517. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tv3cat.py +0 -0
  518. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tv5monde.py +0 -0
  519. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tv8.py +0 -0
  520. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tv999.py +0 -0
  521. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tvibo.py +0 -0
  522. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tviplayer.py +0 -0
  523. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_tvtoya.py +0 -0
  524. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_twitcasting.py +0 -0
  525. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_twitch.py +0 -0
  526. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_ustreamtv.py +0 -0
  527. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_ustvnow.py +0 -0
  528. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_vidio.py +0 -0
  529. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_vimeo.py +0 -0
  530. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_vinhlongtv.py +0 -0
  531. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_vk.py +0 -0
  532. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_vkvideo.py +0 -0
  533. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_welt.py +0 -0
  534. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_wwenetwork.py +0 -0
  535. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_youtube.py +0 -0
  536. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_yupptv.py +0 -0
  537. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_zattoo.py +0 -0
  538. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_zdf_mediathek.py +0 -0
  539. {streamlink-7.2.0 → streamlink-7.4.0}/tests/plugins/test_zeenews.py +0 -0
  540. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/cli/config/custom +0 -0
  541. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/cli/config/primary +0 -0
  542. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/cli/config/primary.testplugin +0 -0
  543. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/cli/config/secondary +0 -0
  544. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/cli/config/secondary.testplugin +0 -0
  545. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_1.mpd +0 -0
  546. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_10.mpd +0 -0
  547. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_11_static.mpd +0 -0
  548. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_2.mpd +0 -0
  549. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_3.mpd +0 -0
  550. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_8.mpd +0 -0
  551. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_9.mpd +0 -0
  552. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_baseurl_nested.mpd +0 -0
  553. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_baseurl_urljoin.mpd +0 -0
  554. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_no_publish_time_timeline_with_start.mpd +0 -0
  555. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_no_publish_time_timeline_without_start.mpd +0 -0
  556. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_segment_list_no_duration.mpd +0 -0
  557. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_segment_list_p1.mpd +0 -0
  558. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_segment_list_p2.mpd +0 -0
  559. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_segment_list_p3.mpd +0 -0
  560. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_segment_list_p4.mpd +0 -0
  561. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_segment_list_p5.mpd +0 -0
  562. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_timeline_continued_p1.mpd +0 -0
  563. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_dynamic_timeline_continued_p2.mpd +0 -0
  564. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_no_segment_list_or_template.mpd +0 -0
  565. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_segment_list.mpd +0 -0
  566. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_segments_byterange.mpd +0 -0
  567. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_segments_dynamic_number.mpd +0 -0
  568. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_static_no_publish_time.mpd +0 -0
  569. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_suggested_presentation_delay.mpd +0 -0
  570. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/dash/test_timeline_ids.mpd +0 -0
  571. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/hls/test_1.m3u8 +0 -0
  572. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/hls/test_date.m3u8 +0 -0
  573. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/hls/test_master.m3u8 +0 -0
  574. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/hls/test_master_twitch_vod.m3u8 +0 -0
  575. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/hls/test_media_language.m3u8 +0 -0
  576. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/hls/test_media_language_special.m3u8 +0 -0
  577. {streamlink-7.2.0 → streamlink-7.4.0}/tests/resources/hls/test_multivariant_bandwidth.m3u8 +0 -0
  578. {streamlink-7.2.0/tests/stream → streamlink-7.4.0/tests/session}/__init__.py +0 -0
  579. {streamlink-7.2.0 → streamlink-7.4.0}/tests/session/test_options.py +0 -0
  580. {streamlink-7.2.0 → streamlink-7.4.0}/tests/session/test_plugins.py +0 -0
  581. {streamlink-7.2.0 → streamlink-7.4.0}/tests/session/test_session.py +0 -0
  582. {streamlink-7.2.0/tests/stream/dash → streamlink-7.4.0/tests/stream}/__init__.py +0 -0
  583. {streamlink-7.2.0/tests/stream/hls → streamlink-7.4.0/tests/stream/dash}/__init__.py +0 -0
  584. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/dash/test_manifest.py +0 -0
  585. {streamlink-7.2.0/tests/testutils → streamlink-7.4.0/tests/stream/hls}/__init__.py +0 -0
  586. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/hls/test_hls_filtered.py +0 -0
  587. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/hls/test_m3u8.py +0 -0
  588. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/test_ffmpegmux.py +0 -0
  589. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/test_file.py +0 -0
  590. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/test_segmented.py +0 -0
  591. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/test_stream_json.py +0 -0
  592. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/test_stream_to_url.py +0 -0
  593. {streamlink-7.2.0 → streamlink-7.4.0}/tests/stream/test_stream_wrappers.py +0 -0
  594. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_api_websocket.py +0 -0
  595. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_buffers.py +0 -0
  596. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_logger.py +0 -0
  597. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_options.py +0 -0
  598. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_plugin.py +0 -0
  599. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_plugin_userinput.py +0 -0
  600. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_plugins.py +0 -0
  601. {streamlink-7.2.0 → streamlink-7.4.0}/tests/test_streamlink_api.py +0 -0
  602. {streamlink-7.2.0/tests/utils → streamlink-7.4.0/tests/testutils}/__init__.py +0 -0
  603. {streamlink-7.2.0 → streamlink-7.4.0}/tests/testutils/handshake.py +0 -0
  604. {streamlink-7.2.0 → streamlink-7.4.0}/tests/testutils/test_handshake.py +0 -0
  605. {streamlink-7.2.0/tests/webbrowser → streamlink-7.4.0/tests/utils}/__init__.py +0 -0
  606. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_args.py +0 -0
  607. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_cache.py +0 -0
  608. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_crypto.py +0 -0
  609. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_data.py +0 -0
  610. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_formatter.py +0 -0
  611. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_l10n.py +0 -0
  612. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_module.py +0 -0
  613. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_named_pipe.py +0 -0
  614. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_parse.py +0 -0
  615. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_path.py +0 -0
  616. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_processoutput.py +0 -0
  617. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_random.py +0 -0
  618. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_times.py +0 -0
  619. {streamlink-7.2.0 → streamlink-7.4.0}/tests/utils/test_url.py +0 -0
  620. {streamlink-7.2.0 → streamlink-7.4.0}/tests/webbrowser/cdp/__init__.py +0 -0
  621. {streamlink-7.2.0 → streamlink-7.4.0}/tests/webbrowser/cdp/conftest.py +0 -0
  622. {streamlink-7.2.0 → streamlink-7.4.0}/tests/webbrowser/cdp/test_client.py +0 -0
  623. {streamlink-7.2.0 → streamlink-7.4.0}/tests/webbrowser/cdp/test_connection.py +0 -0
  624. {streamlink-7.2.0 → streamlink-7.4.0}/tests/webbrowser/conftest.py +0 -0
  625. {streamlink-7.2.0 → streamlink-7.4.0}/tests/webbrowser/test_chromium.py +0 -0
  626. {streamlink-7.2.0 → streamlink-7.4.0}/tests/webbrowser/test_webbrowser.py +0 -0
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## streamlink 7.4.0 (2025-06-08)
4
+
5
+ - Added: `encoding` keyword to all HTTP request methods to override the response content encoding ([#6544](https://github.com/streamlink/streamlink/pull/6544))
6
+ - Added: debug log message for the available DASH periods (id or index) ([#6521](https://github.com/streamlink/streamlink/pull/6521))
7
+ - Fixed: `LookupError` when selecting an invalid DASH period ([#6518](https://github.com/streamlink/streamlink/pull/6518))
8
+ - Updated plugins:
9
+ - blasttv: new plugin ([#6547](https://github.com/streamlink/streamlink/pull/6547))
10
+ - kick: fixed 403 API responses by solving the JS challenge using the webbrowser API ([#6500](https://github.com/streamlink/streamlink/pull/6500))
11
+ - nicolive: fixed plugin metadata by forcing UTF-8 encoding ([#6544](https://github.com/streamlink/streamlink/pull/6544))
12
+ - picarto: fixed validation schema and fixed multi-stream selection ([#6512](https://github.com/streamlink/streamlink/pull/6512))
13
+ - tvp: rewritten and fixed plugin ([#6535](https://github.com/streamlink/streamlink/pull/6535))
14
+ - twitcasting: fixed plugin by switching to new websocket+HLS streams ([#6540](https://github.com/streamlink/streamlink/pull/6540))
15
+ - vtvgo: removed plugin ([#6516](https://github.com/streamlink/streamlink/pull/6516))
16
+ - Tests: fixed py314 test failures ([#6527](https://github.com/streamlink/streamlink/pull/6527))
17
+ - Tests: fixed some HLS tests failing in rare cases ([#6536](https://github.com/streamlink/streamlink/pull/6536))
18
+
19
+ [Full changelog](https://github.com/streamlink/streamlink/compare/7.3.0...7.4.0)
20
+
21
+
22
+ ## streamlink 7.3.0 (2025-04-26)
23
+
24
+ - Changed: download progress to use the console output stream rather than always `stderr`, which previously caused log and progress messages to be interweaved ([#6497](https://github.com/streamlink/streamlink/pull/6497), [#6496](https://github.com/streamlink/streamlink/pull/6496))
25
+ - Changed: download progress output to be a status message line at the bottom of the console output, unless `--progress=force` is set in non-interactive or unsupported environments, in which case less frequent regular progress messages are written ([#6497](https://github.com/streamlink/streamlink/pull/6497), [#6496](https://github.com/streamlink/streamlink/pull/6496))
26
+ - Fixed: potential division by zero error when formatting progress output ([#6498](https://github.com/streamlink/streamlink/pull/6498))
27
+ - Build: bumped `setuptools` requirement from `>=65.6` to `>=77` and switched to PEP 639 project license metadata format ([#6502](https://github.com/streamlink/streamlink/pull/6502))
28
+
29
+ [Full changelog](https://github.com/streamlink/streamlink/compare/7.2.0...7.3.0)
30
+
31
+
3
32
  ## streamlink 7.2.0 (2025-04-04)
4
33
 
5
34
  - Added: `decompress` extras marker to Streamlink's optional dependencies for installing `brotli` and `zstandard`, which were previously implied optional dependencies via the transitive dependency `urllib3` ([#6451](https://github.com/streamlink/streamlink/pull/6451))
@@ -1,17 +1,16 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: streamlink
3
- Version: 7.2.0
3
+ Version: 7.4.0
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
7
- License: Simplified BSD
7
+ License-Expression: BSD-2-Clause
8
8
  Project-URL: Homepage, https://github.com/streamlink/streamlink
9
9
  Project-URL: Documentation, https://streamlink.github.io/
10
10
  Project-URL: Tracker, https://github.com/streamlink/streamlink/issues
11
11
  Project-URL: Source, https://github.com/streamlink/streamlink
12
12
  Project-URL: Funding, https://streamlink.github.io/latest/support.html
13
13
  Classifier: Development Status :: 5 - Production/Stable
14
- Classifier: License :: OSI Approved :: BSD License
15
14
  Classifier: Environment :: Console
16
15
  Classifier: Intended Audience :: End Users/Desktop
17
16
  Classifier: Operating System :: POSIX
@@ -130,6 +130,7 @@ _set_new_action() {
130
130
  # ${!x} -> ${hello} -> "world"
131
131
  _shtab_streamlink_cli() {
132
132
  local completing_word="${COMP_WORDS[COMP_CWORD]}"
133
+ local previous_word="${COMP_WORDS[COMP_CWORD-1]}"
133
134
  local completed_positional_actions
134
135
  local current_action
135
136
  local current_action_args_start_index
@@ -186,6 +187,10 @@ _shtab_streamlink_cli() {
186
187
  if [[ $pos_only = 0 && "${completing_word}" == -* ]]; then
187
188
  # optional argument started: use option strings
188
189
  COMPREPLY=( $(compgen -W "${current_option_strings[*]}" -- "${completing_word}") )
190
+ elif [[ "${previous_word}" == ">" || "${previous_word}" == ">>" ||
191
+ "${previous_word}" =~ ^[12]">" || "${previous_word}" =~ ^[12]">>" ]]; then
192
+ # handle redirection operators
193
+ COMPREPLY=( $(compgen -f -- "${completing_word}") )
189
194
  else
190
195
  # use choices & compgen
191
196
  local IFS=$'\n' # items may contain spaces, so delimit using newline
@@ -14,10 +14,11 @@ pytest-cov
14
14
  coverage[toml]
15
15
 
16
16
  # code-linting / code-formatting
17
- ruff ==0.11.2
17
+ ruff ==0.11.12
18
18
 
19
19
  # typing
20
- mypy[faster-cache] ==1.15.0
20
+ mypy[faster-cache] ==1.16.0 ; python_version<'3.14'
21
+ mypy ==1.16.0 ; python_version>='3.14' # orjson (faster-cache mypy extra) currently fails building on 3.14
21
22
  typing-extensions >=4.0.0
22
23
  lxml-stubs
23
24
  trio-typing
@@ -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" "Apr 04, 2025" "7.2.0" "Streamlink"
30
+ .TH "STREAMLINK" "1" "Jun 08, 2025" "7.4.0" "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,34 @@
1
1
  # Changelog
2
2
 
3
+ ## streamlink 7.4.0 (2025-06-08)
4
+
5
+ - Added: `encoding` keyword to all HTTP request methods to override the response content encoding ([#6544](https://github.com/streamlink/streamlink/pull/6544))
6
+ - Added: debug log message for the available DASH periods (id or index) ([#6521](https://github.com/streamlink/streamlink/pull/6521))
7
+ - Fixed: `LookupError` when selecting an invalid DASH period ([#6518](https://github.com/streamlink/streamlink/pull/6518))
8
+ - Updated plugins:
9
+ - blasttv: new plugin ([#6547](https://github.com/streamlink/streamlink/pull/6547))
10
+ - kick: fixed 403 API responses by solving the JS challenge using the webbrowser API ([#6500](https://github.com/streamlink/streamlink/pull/6500))
11
+ - nicolive: fixed plugin metadata by forcing UTF-8 encoding ([#6544](https://github.com/streamlink/streamlink/pull/6544))
12
+ - picarto: fixed validation schema and fixed multi-stream selection ([#6512](https://github.com/streamlink/streamlink/pull/6512))
13
+ - tvp: rewritten and fixed plugin ([#6535](https://github.com/streamlink/streamlink/pull/6535))
14
+ - twitcasting: fixed plugin by switching to new websocket+HLS streams ([#6540](https://github.com/streamlink/streamlink/pull/6540))
15
+ - vtvgo: removed plugin ([#6516](https://github.com/streamlink/streamlink/pull/6516))
16
+ - Tests: fixed py314 test failures ([#6527](https://github.com/streamlink/streamlink/pull/6527))
17
+ - Tests: fixed some HLS tests failing in rare cases ([#6536](https://github.com/streamlink/streamlink/pull/6536))
18
+
19
+ [Full changelog](https://github.com/streamlink/streamlink/compare/7.3.0...7.4.0)
20
+
21
+
22
+ ## streamlink 7.3.0 (2025-04-26)
23
+
24
+ - Changed: download progress to use the console output stream rather than always `stderr`, which previously caused log and progress messages to be interweaved ([#6497](https://github.com/streamlink/streamlink/pull/6497), [#6496](https://github.com/streamlink/streamlink/pull/6496))
25
+ - Changed: download progress output to be a status message line at the bottom of the console output, unless `--progress=force` is set in non-interactive or unsupported environments, in which case less frequent regular progress messages are written ([#6497](https://github.com/streamlink/streamlink/pull/6497), [#6496](https://github.com/streamlink/streamlink/pull/6496))
26
+ - Fixed: potential division by zero error when formatting progress output ([#6498](https://github.com/streamlink/streamlink/pull/6498))
27
+ - Build: bumped `setuptools` requirement from `>=65.6` to `>=77` and switched to PEP 639 project license metadata format ([#6502](https://github.com/streamlink/streamlink/pull/6502))
28
+
29
+ [Full changelog](https://github.com/streamlink/streamlink/compare/7.2.0...7.3.0)
30
+
31
+
3
32
  ## streamlink 7.2.0 (2025-04-04)
4
33
 
5
34
  - Added: `decompress` extras marker to Streamlink's optional dependencies for installing `brotli` and `zstandard`, which were previously implied optional dependencies via the transitive dependency `urllib3` ([#6451](https://github.com/streamlink/streamlink/pull/6451))
@@ -122,7 +122,7 @@ performing these checks locally avoids unnecessary build failures.
122
122
  Code style
123
123
  ----------
124
124
 
125
- Streamlink uses `Ruff`_ as primary code `linting <Ruff-linter>`_ and `formatting <Ruff-formatter>`_ tool.
125
+ Streamlink uses `Ruff`_ as primary code `linting <Ruff-linter_>`_ and `formatting <Ruff-formatter_>`_ tool.
126
126
 
127
127
  The project aims to use best practices for achieving great code readability with minimal git diffs,
128
128
  as detailed in :pep:`8` and implemented in related linting and formatting tools, such as `Black`_.
@@ -73,6 +73,13 @@ Windows
73
73
  choco install streamlink
74
74
 
75
75
  `Installing Chocolatey packages`_
76
+ * - :octicon:`package` `MSYS2`_
77
+ - .. code-block:: bat
78
+
79
+ pacman -Ss streamlink
80
+ pacman -S mingw-w64-x86_64-streamlink
81
+
82
+ `Installing MSYS2 packages`_
76
83
  * - :octicon:`package-dependents` `Scoop`_
77
84
  - .. code-block::
78
85
 
@@ -88,9 +95,11 @@ Windows
88
95
  `Installing Winget packages`_
89
96
 
90
97
  .. _Chocolatey: https://chocolatey.org/packages/streamlink
98
+ .. _MSYS2: https://packages.msys2.org/base/mingw-w64-streamlink
91
99
  .. _Scoop: https://scoop.sh/#/apps?q=streamlink&s=0&d=1&o=true
92
100
  .. _Windows Package Manager: https://github.com/microsoft/winget-pkgs/tree/master/manifests/s/Streamlink/Streamlink
93
101
  .. _Installing Chocolatey packages: https://chocolatey.org
102
+ .. _Installing MSYS2 packages: https://www.msys2.org
94
103
  .. _Installing Scoop packages: https://scoop.sh
95
104
  .. _Installing Winget packages: https://docs.microsoft.com/en-us/windows/package-manager/
96
105
 
@@ -235,47 +244,6 @@ Linux and BSD
235
244
  .. _NixOS channel: https://search.nixos.org/packages?show=streamlink&query=streamlink
236
245
 
237
246
 
238
- Package maintainers
239
- -------------------
240
-
241
- .. list-table::
242
- :header-rows: 1
243
- :class: table-custom-layout
244
-
245
- * - Distribution / Platform
246
- - Maintainer
247
- * - Alpine Linux
248
- - Hoang Nguyen <folliekazetani at protonmail.com>
249
- * - ALT Linux
250
- - Vitaly Lipatov <lav at altlinux.ru>
251
- * - Arch
252
- - Giancarlo Razzolini <grazzolini at archlinux.org>
253
- * - Arch (aur, git)
254
- - Josip Ponjavic <josipponjavic at gmail.com>
255
- * - Chocolatey
256
- - Scott Walters <me at scowalt.com>
257
- * - Debian
258
- - Alexis Murzeau <amubtdx at gmail.com>
259
- * - Fedora
260
- - Mohamed El Morabity <melmorabity at fedoraproject.org>
261
- * - FreeBSD
262
- - Takefu <takefu at airport.fm>
263
- * - Gentoo
264
- - soredake <fdsfgs at krutt.org>
265
- * - NixOS
266
- - Tuomas Tynkkynen <tuomas.tynkkynen at iki.fi>
267
- * - openSUSE
268
- - Simon Puchert <simonpuchert at alice.de>
269
- * - Solus
270
- - Joey Riches <josephriches at gmail.com>
271
- * - Void
272
- - Tom Strausbaugh <tstrausbaugh at straustech.net>
273
- * - Windows binaries
274
- - Sebastian Meyer <mail at bastimeyer.de>
275
- * - Linux AppImages
276
- - Sebastian Meyer <mail at bastimeyer.de>
277
-
278
-
279
247
  Package availability
280
248
  --------------------
281
249
 
@@ -1,6 +1,6 @@
1
1
  [build-system]
2
2
  requires = [
3
- "setuptools >=65.6",
3
+ "setuptools >=77",
4
4
  "wheel",
5
5
  # The versioningit build-requirement gets removed from the source distribution,
6
6
  # as the version string is already built into it (see the onbuild versioningit hook):
@@ -20,14 +20,14 @@ description = """\
20
20
  Streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of choice.\
21
21
  """
22
22
  readme = "README.md"
23
- license = { text = "Simplified BSD" }
23
+ license = "BSD-2-Clause"
24
+ license-files = ["LICENSE"]
24
25
  authors = [
25
26
  { name = "Streamlink" },
26
27
  { email = "streamlink@protonmail.com" }
27
28
  ]
28
29
  classifiers = [
29
30
  "Development Status :: 5 - Production/Stable",
30
- "License :: OSI Approved :: BSD License",
31
31
  "Environment :: Console",
32
32
  "Intended Audience :: End Users/Desktop",
33
33
  "Operating System :: POSIX",
@@ -88,9 +88,6 @@ Funding = "https://streamlink.github.io/latest/support.html"
88
88
  # https://setuptools.pypa.io/en/stable/userguide/pyproject_config.html
89
89
  # https://setuptools.pypa.io/en/stable/userguide/package_discovery.html
90
90
  # https://setuptools.pypa.io/en/stable/userguide/datafiles.html
91
- [tool.setuptools]
92
- license-files = ["LICENSE"]
93
-
94
91
  [tool.setuptools.packages.find]
95
92
  where = ["src"]
96
93
  namespaces = false
@@ -97,5 +97,5 @@ if __name__ == "__main__":
97
97
  cmdclass=get_cmdclasses(cmdclass),
98
98
  entry_points=entry_points,
99
99
  data_files=data_files,
100
- version="7.2.0",
100
+ version="7.4.0",
101
101
  )
@@ -0,0 +1 @@
1
+ __version__ = "7.4.0"
@@ -0,0 +1,114 @@
1
+ """
2
+ $description Esports tournaments run by BlastTV, based in Denmark.
3
+ $url blast.tv
4
+ $type live, vod
5
+ $metadata id
6
+ $metadata title
7
+ """
8
+
9
+ import re
10
+
11
+ from streamlink.plugin import Plugin, pluginmatcher
12
+ from streamlink.plugin.api import validate
13
+ from streamlink.stream.hls import HLSStream
14
+
15
+
16
+ @pluginmatcher(
17
+ name="live",
18
+ pattern=re.compile(r"^https?://(?:www\.)?blast\.tv(?:/?$|/live(?:/(?P<channel>[a-z0-9_-]+))?)"),
19
+ )
20
+ @pluginmatcher(
21
+ name="vod",
22
+ pattern=re.compile(r"^https?://(?:www\.)?blast\.tv/(?P<game>[^/]+)/tournaments/[^/]+/match/(?P<shortid>\w+)/"),
23
+ )
24
+ class BlastTv(Plugin):
25
+ _URL_API_LIVE = "https://api.blast.tv/v1/broadcasts/live"
26
+ _URL_API_MATCHES = "https://api.blast.tv/v2/games/{game}/matches/{shortid}"
27
+ _URL_API_REWATCH = "https://api.blast.tv/v1/videos/rewatch/{id}"
28
+
29
+ def _get_live(self):
30
+ channel = self.match["channel"]
31
+
32
+ live_channels = self.session.http.get(
33
+ self._URL_API_LIVE,
34
+ schema=validate.Schema(
35
+ validate.parse_json(),
36
+ [
37
+ {
38
+ "id": str,
39
+ "slug": str,
40
+ "priority": int,
41
+ "title": str,
42
+ "videoSrc": validate.any("", validate.url(path=validate.endswith(".m3u8"))),
43
+ "videoAlternativeSrc": validate.any("", validate.url(scheme="http")),
44
+ },
45
+ ],
46
+ ),
47
+ )
48
+
49
+ for live_channel in sorted(live_channels, key=lambda x: x["priority"]):
50
+ if channel and channel != live_channel["slug"]:
51
+ continue
52
+
53
+ if live_channel["videoSrc"]:
54
+ self.id = live_channel["id"]
55
+ self.title = live_channel["title"]
56
+ return HLSStream.parse_variant_playlist(self.session, live_channel["videoSrc"])
57
+
58
+ if live_channel["videoAlternativeSrc"]:
59
+ return self.session.streams(live_channel["videoAlternativeSrc"])
60
+
61
+ def _get_vod(self):
62
+ self.id, external_stream_url = self.session.http.get(
63
+ self._URL_API_MATCHES.format(
64
+ game=self.match["game"],
65
+ shortid=self.match["shortid"],
66
+ ),
67
+ acceptable_status=(200, 404),
68
+ schema=validate.Schema(
69
+ validate.parse_json(),
70
+ {
71
+ validate.optional("id"): str,
72
+ validate.optional("metadata"): validate.all(
73
+ {
74
+ validate.optional("externalStreamUrl"): validate.any("", validate.url(scheme="http")),
75
+ },
76
+ validate.get("externalStreamUrl"),
77
+ ),
78
+ },
79
+ validate.union_get(
80
+ "id",
81
+ "metadata",
82
+ ),
83
+ ),
84
+ )
85
+ if not self.id:
86
+ return
87
+
88
+ if external_stream_url:
89
+ return self.session.streams(external_stream_url)
90
+
91
+ hls_url = self.session.http.get(
92
+ self._URL_API_REWATCH.format(id=self.id),
93
+ acceptable_status=(200, 404),
94
+ schema=validate.Schema(
95
+ validate.parse_json(),
96
+ {
97
+ validate.optional("src"): validate.url(path=validate.endswith(".m3u8")),
98
+ },
99
+ validate.get("src"),
100
+ ),
101
+ )
102
+ if not hls_url:
103
+ return
104
+
105
+ return HLSStream.parse_variant_playlist(self.session, hls_url)
106
+
107
+ def _get_streams(self):
108
+ if self.matches["live"]:
109
+ return self._get_live()
110
+ if self.matches["vod"]:
111
+ return self._get_vod()
112
+
113
+
114
+ __plugin__ = BlastTv
@@ -2,12 +2,16 @@
2
2
  $description Global live-streaming and video hosting social platform owned by Kick Streaming Pty Ltd.
3
3
  $url kick.com
4
4
  $type live, vod
5
+ $webbrowser Required for solving a JS challenge that allows access to the Kick API
5
6
  $metadata id
6
7
  $metadata author
7
8
  $metadata category
8
9
  $metadata title
9
10
  """
10
11
 
12
+ from __future__ import annotations
13
+
14
+ import logging
11
15
  import re
12
16
  from ssl import OP_NO_TICKET
13
17
 
@@ -18,6 +22,9 @@ from streamlink.session.http import SSLContextAdapter
18
22
  from streamlink.stream.hls import HLSStream
19
23
 
20
24
 
25
+ log = logging.getLogger(__name__)
26
+
27
+
21
28
  class KickAdapter(SSLContextAdapter):
22
29
  def get_ssl_context(self):
23
30
  ctx = super().get_ssl_context()
@@ -39,6 +46,9 @@ class KickAdapter(SSLContextAdapter):
39
46
  pattern=re.compile(r"https?://(?:\w+\.)?kick\.com/(?!video/)(?P<channel>[^/?]+)(?:\?clip=|/clips/)(?P<clip>[^?&]+)"),
40
47
  )
41
48
  class Kick(Plugin):
49
+ _CACHE_HEADERS = "headers"
50
+ _CACHE_EXPIRATION = 3600 * 24 * 30
51
+
42
52
  _URL_API_LIVESTREAM = "https://kick.com/api/v2/channels/{channel}/livestream"
43
53
  _URL_API_VOD = "https://kick.com/api/v1/video/{vod}"
44
54
  _URL_API_CLIP = "https://kick.com/api/v2/clips/{clip}"
@@ -46,14 +56,62 @@ class Kick(Plugin):
46
56
  def __init__(self, *args, **kwargs):
47
57
  super().__init__(*args, **kwargs)
48
58
  self.session.http.mount("https://kick.com/", KickAdapter())
59
+ self.session.http.headers.update(self.cache.get(self._CACHE_HEADERS, {}))
49
60
  self.session.http.headers.update({
50
61
  "Referer": self.url,
51
- "User-Agent": useragents.CHROME,
52
62
  })
53
63
 
54
- @staticmethod
55
- def _get_api_headers():
56
- if not (m := re.search(r"Chrome/(?P<full>(?P<main>\d+)\S+)", useragents.CHROME)):
64
+ def _get_cookies_from_webbrowser(self) -> bool:
65
+ from streamlink.compat import BaseExceptionGroup # noqa: PLC0415
66
+ from streamlink.webbrowser.cdp import CDPClient, CDPClientSession # noqa: PLC0415
67
+ from streamlink.webbrowser.cdp.devtools import fetch, network # noqa: PLC0415
68
+
69
+ async def on_main(client_session: CDPClientSession, request: fetch.RequestPaused):
70
+ # get Chromium's request headers, update HTTP session headers and also cache them
71
+ self.session.http.headers.update(request.request.headers)
72
+ self.cache.set(self._CACHE_HEADERS, request.request.headers, expires=self._CACHE_EXPIRATION)
73
+ await client_session.continue_request(request)
74
+
75
+ async def get_challenge_cookies(client: CDPClient):
76
+ client_session: CDPClientSession
77
+ async with client.session() as client_session:
78
+ client_session.add_request_handler(on_main, url_pattern=self.url, on_request=True)
79
+ async with client_session.navigate(self.url) as frame_id:
80
+ await client_session.loaded(frame_id)
81
+ return await client_session.cdp_session.send(network.get_cookies())
82
+
83
+ log.info("Solving JS challenge")
84
+
85
+ try:
86
+ cookies: list[network.Cookie] = CDPClient.launch(self.session, get_challenge_cookies)
87
+ except BaseExceptionGroup:
88
+ log.exception("Failed solving JS challenge")
89
+ except Exception as err:
90
+ log.error(err)
91
+ else:
92
+ for cookie in cookies:
93
+ self.session.http.cookies.set(
94
+ name=cookie.name,
95
+ value=cookie.value,
96
+ domain=cookie.domain,
97
+ path=cookie.path,
98
+ expires=cookie.expires,
99
+ )
100
+
101
+ log.info("JS challenge solved, storing cookies")
102
+ self.save_cookies()
103
+
104
+ return True
105
+
106
+ return False
107
+
108
+ def _get_api_headers(self):
109
+ # _get_cookies() from above updates the session headers with Chromium's initial request headers
110
+ ua = self.session.http.headers.get("User-Agent", useragents.CHROME)
111
+ if "Chrome/" not in ua:
112
+ ua = useragents.CHROME
113
+
114
+ if not (m := re.search(r"Chrome/(?P<full>(?P<main>\d+)\S+)", ua)):
57
115
  raise PluginError("Error while parsing Chromium User-Agent")
58
116
 
59
117
  return {
@@ -74,8 +132,22 @@ class Kick(Plugin):
74
132
  "sec-fetch-user": "?1",
75
133
  }
76
134
 
77
- def _query_api(self, url, schema):
78
- schema = validate.Schema(
135
+ def _query_api(self, url, schema, secondary_attempt=False):
136
+ res = self.session.http.get(
137
+ url,
138
+ headers=self._get_api_headers(),
139
+ raise_for_status=False,
140
+ )
141
+ if res.status_code == 403 and not secondary_attempt and self._get_cookies_from_webbrowser():
142
+ # re-attempt API query after getting (new) cookies
143
+ return self._query_api(url, schema, secondary_attempt=True)
144
+
145
+ try:
146
+ res.raise_for_status()
147
+ except Exception as err:
148
+ raise PluginError(f"Error while querying Kick API: {err or '403 status response'}") from err
149
+
150
+ main_schema = validate.Schema(
79
151
  validate.parse_json(),
80
152
  validate.any(
81
153
  validate.all(
@@ -92,16 +164,7 @@ class Kick(Plugin):
92
164
  ),
93
165
  ),
94
166
  )
95
-
96
- res = self.session.http.get(
97
- url,
98
- headers=self._get_api_headers(),
99
- raise_for_status=False,
100
- )
101
- if res.status_code == 403:
102
- raise PluginError("Error while accessing Kick API: status code 403")
103
-
104
- restype, data = schema.validate(res.text)
167
+ restype, data = main_schema.validate(res.text)
105
168
 
106
169
  if restype == "error":
107
170
  raise PluginError(f"Error while querying Kick API: {data or 'unknown error'}")
@@ -269,6 +269,7 @@ class NicoLive(Plugin):
269
269
  def get_data(self):
270
270
  return self.session.http.get(
271
271
  self.url,
272
+ encoding="utf-8",
272
273
  schema=validate.Schema(
273
274
  validate.parse_html(),
274
275
  validate.xml_find(".//script[@id='embedded-data'][@data-props]"),
@@ -50,21 +50,22 @@ class Picarto(Plugin):
50
50
  "channel": validate.any(
51
51
  None,
52
52
  {
53
- "stream_name": str,
53
+ "id": int,
54
54
  "title": str,
55
- "online": bool,
56
55
  "private": bool,
57
- "categories": [{"label": str}],
56
+ "categories": [{"name": str}],
58
57
  },
59
58
  ),
60
59
  "getMultiStreams": validate.any(
61
60
  None,
62
61
  {
63
- "multistream": bool,
64
62
  "streams": [
65
63
  {
64
+ "id": int,
65
+ "channelId": int,
66
66
  "name": str,
67
67
  "online": bool,
68
+ "stream_name": str,
68
69
  },
69
70
  ],
70
71
  },
@@ -80,28 +81,24 @@ class Picarto(Plugin):
80
81
  ),
81
82
  )
82
83
  if not channel or not multistreams or not loadbalancer:
83
- log.debug("Missing channel or streaming data")
84
84
  return
85
85
 
86
- log.trace(f"loadbalancer={loadbalancer!r}")
87
- log.trace(f"channel={channel!r}")
88
- log.trace(f"multistreams={multistreams!r}")
89
-
90
- if not channel["online"]:
91
- log.error("User is not online")
86
+ if channel["private"]:
87
+ log.error("This is a private stream")
92
88
  return
93
89
 
94
- if channel["private"]:
95
- log.info("This is a private stream")
90
+ user_id = channel["id"]
91
+ if not (stream := next((stream for stream in multistreams["streams"] if stream["channelId"] == user_id), None)):
92
+ log.error("No available stream found in 'multistreams' data")
96
93
  return
97
94
 
98
95
  self.author = username
99
- self.category = channel["categories"][0]["label"]
96
+ self.category = next(iter(channel["categories"]), {}).get("name")
100
97
  self.title = channel["title"]
101
98
 
102
99
  hls_url = self.HLS_URL.format(
103
100
  netloc=loadbalancer["url"],
104
- file_name=channel["stream_name"],
101
+ file_name=stream["stream_name"],
105
102
  )
106
103
 
107
104
  return HLSStream.parse_variant_playlist(self.session, hls_url)
@@ -145,13 +142,9 @@ class Picarto(Plugin):
145
142
  validate.get(("data", "video")),
146
143
  ),
147
144
  )
148
-
149
145
  if not vod_data:
150
- log.debug("Missing video data")
151
146
  return
152
147
 
153
- log.trace(f"vod_data={vod_data!r}")
154
-
155
148
  self.author = vod_data["channel"]["name"]
156
149
  self.category = "VOD"
157
150
  self.title = vod_data["title"]