streamlink 8.6.2__tar.gz → 8.6.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.
Files changed (645) hide show
  1. {streamlink-8.6.2 → streamlink-8.6.3}/CHANGELOG.md +10 -0
  2. {streamlink-8.6.2 → streamlink-8.6.3}/PKG-INFO +2 -2
  3. {streamlink-8.6.2 → streamlink-8.6.3}/build_backend/test_plugins_json.py +3 -3
  4. {streamlink-8.6.2 → streamlink-8.6.3}/completions/bash/streamlink +6 -1
  5. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_build/man/streamlink.1 +1 -1
  6. {streamlink-8.6.2 → streamlink-8.6.3}/docs/changelog.md +10 -0
  7. {streamlink-8.6.2 → streamlink-8.6.3}/docs/install.rst +12 -0
  8. {streamlink-8.6.2 → streamlink-8.6.3}/pyproject.toml +20 -3
  9. {streamlink-8.6.2 → streamlink-8.6.3}/setup.py +1 -1
  10. streamlink-8.6.3/src/streamlink/_version.py +1 -0
  11. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/youtube.py +1 -3
  12. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/session/http.pyi +8 -23
  13. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/dash/manifest.py +1 -1
  14. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/wrappers.py +2 -3
  15. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/crypto.py +2 -0
  16. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/dataclass.py +2 -4
  17. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink.egg-info/PKG-INFO +2 -2
  18. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink.egg-info/requires.txt +1 -1
  19. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/compat.py +1 -1
  20. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/progress.py +1 -1
  21. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/stream.py +1 -1
  22. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/stream_wrapper.py +1 -1
  23. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/main.py +28 -9
  24. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/console/test_stream_wrapper.py +1 -1
  25. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_handle_url.py +2 -2
  26. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/test_argparser.py +4 -2
  27. {streamlink-8.6.2 → streamlink-8.6.3}/tests/mixins/stream_hls.py +2 -1
  28. {streamlink-8.6.2 → streamlink-8.6.3}/tests/session/test_http.py +3 -2
  29. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/hls/test_hls.py +136 -114
  30. {streamlink-8.6.2 → streamlink-8.6.3}/tests/webbrowser/test_chromium.py +2 -1
  31. streamlink-8.6.2/src/streamlink/_version.py +0 -1
  32. {streamlink-8.6.2 → streamlink-8.6.3}/AUTHORS +0 -0
  33. {streamlink-8.6.2 → streamlink-8.6.3}/LICENSE +0 -0
  34. {streamlink-8.6.2 → streamlink-8.6.3}/MANIFEST.in +0 -0
  35. {streamlink-8.6.2 → streamlink-8.6.3}/README.md +0 -0
  36. {streamlink-8.6.2 → streamlink-8.6.3}/build_backend/__init__.py +0 -0
  37. {streamlink-8.6.2 → streamlink-8.6.3}/build_backend/commands.py +0 -0
  38. {streamlink-8.6.2 → streamlink-8.6.3}/build_backend/onbuild.py +0 -0
  39. {streamlink-8.6.2 → streamlink-8.6.3}/build_backend/plugins_json.py +0 -0
  40. {streamlink-8.6.2 → streamlink-8.6.3}/build_backend/test_build_backend.py +0 -0
  41. {streamlink-8.6.2 → streamlink-8.6.3}/build_backend/test_onbuild.py +0 -0
  42. {streamlink-8.6.2 → streamlink-8.6.3}/completions/fish/streamlink.fish +0 -0
  43. {streamlink-8.6.2 → streamlink-8.6.3}/completions/zsh/_streamlink +0 -0
  44. {streamlink-8.6.2 → streamlink-8.6.3}/docs/Makefile +0 -0
  45. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_man.rst +0 -0
  46. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/apple-touch-icon.png +0 -0
  47. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/favicon-16x16.png +0 -0
  48. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/favicon-32x32.png +0 -0
  49. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/favicon.ico +0 -0
  50. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/github-lockup-dark.svg +0 -0
  51. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/github-lockup-light.svg +0 -0
  52. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/icon-ffmpeg.svg +0 -0
  53. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/icon-python.svg +0 -0
  54. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/icon.svg +0 -0
  55. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/jetbrains-mono-black.svg +0 -0
  56. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/jetbrains-mono-white.svg +0 -0
  57. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/opengraph-image.png +0 -0
  58. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/site.webmanifest +0 -0
  59. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_static/styles/custom.css +0 -0
  60. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_templates/base.html +0 -0
  61. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_templates/page.html +0 -0
  62. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_templates/sidebar/brand.html +0 -0
  63. {streamlink-8.6.2 → streamlink-8.6.3}/docs/_templates/sidebar/github-buttons.html +0 -0
  64. {streamlink-8.6.2 → streamlink-8.6.3}/docs/acknowledgements.rst +0 -0
  65. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/cache.rst +0 -0
  66. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/exceptions.rst +0 -0
  67. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/options.rst +0 -0
  68. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/plugin.rst +0 -0
  69. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/session.rst +0 -0
  70. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/stream.rst +0 -0
  71. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/streamlink.rst +0 -0
  72. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/validate.rst +0 -0
  73. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api/webbrowser.rst +0 -0
  74. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api.rst +0 -0
  75. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api_guide/quickstart.rst +0 -0
  76. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api_guide/validate.rst +0 -0
  77. {streamlink-8.6.2 → streamlink-8.6.3}/docs/api_guide.rst +0 -0
  78. {streamlink-8.6.2 → streamlink-8.6.3}/docs/applications.rst +0 -0
  79. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli/config.rst +0 -0
  80. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli/metadata.rst +0 -0
  81. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli/plugin-sideloading.rst +0 -0
  82. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli/plugins/twitch.rst +0 -0
  83. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli/plugins.rst +0 -0
  84. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli/protocols.rst +0 -0
  85. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli/proxy.rst +0 -0
  86. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli/tutorial.rst +0 -0
  87. {streamlink-8.6.2 → streamlink-8.6.3}/docs/cli.rst +0 -0
  88. {streamlink-8.6.2 → streamlink-8.6.3}/docs/conf.py +0 -0
  89. {streamlink-8.6.2 → streamlink-8.6.3}/docs/deprecations.rst +0 -0
  90. {streamlink-8.6.2 → streamlink-8.6.3}/docs/developing.rst +0 -0
  91. {streamlink-8.6.2 → streamlink-8.6.3}/docs/docutils.conf +0 -0
  92. {streamlink-8.6.2 → streamlink-8.6.3}/docs/index.rst +0 -0
  93. {streamlink-8.6.2 → streamlink-8.6.3}/docs/migrations.rst +0 -0
  94. {streamlink-8.6.2 → streamlink-8.6.3}/docs/players.rst +0 -0
  95. {streamlink-8.6.2 → streamlink-8.6.3}/docs/plugins.rst +0 -0
  96. {streamlink-8.6.2 → streamlink-8.6.3}/docs/sphinxext/ext_argparse.py +0 -0
  97. {streamlink-8.6.2 → streamlink-8.6.3}/docs/sphinxext/ext_github.py +0 -0
  98. {streamlink-8.6.2 → streamlink-8.6.3}/docs/sphinxext/ext_html_template_vars.py +0 -0
  99. {streamlink-8.6.2 → streamlink-8.6.3}/docs/sphinxext/ext_plugins.py +0 -0
  100. {streamlink-8.6.2 → streamlink-8.6.3}/docs/sphinxext/ext_releaseref.py +0 -0
  101. {streamlink-8.6.2 → streamlink-8.6.3}/docs/support.rst +0 -0
  102. {streamlink-8.6.2 → streamlink-8.6.3}/docs/thirdparty.rst +0 -0
  103. {streamlink-8.6.2 → streamlink-8.6.3}/icon.svg +0 -0
  104. {streamlink-8.6.2 → streamlink-8.6.3}/script/build-shell-completions.py +0 -0
  105. {streamlink-8.6.2 → streamlink-8.6.3}/setup.cfg +0 -0
  106. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/__init__.py +0 -0
  107. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/__main__.py +0 -0
  108. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/api.py +0 -0
  109. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/buffers.py +0 -0
  110. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/cache.py +0 -0
  111. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/compat.py +0 -0
  112. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/exceptions.py +0 -0
  113. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/logger.py +0 -0
  114. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/options.py +0 -0
  115. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/packages/__init__.py +0 -0
  116. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/packages/requests_file.py +0 -0
  117. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugin/__init__.py +0 -0
  118. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugin/api/__init__.py +0 -0
  119. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugin/api/useragents.py +0 -0
  120. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugin/api/validate.py +0 -0
  121. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugin/api/webbrowser/__init__.py +0 -0
  122. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugin/api/webbrowser/aws_waf.py +0 -0
  123. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugin/api/websocket.py +0 -0
  124. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugin/plugin.py +0 -0
  125. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/__init__.py +0 -0
  126. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/abematv.py +0 -0
  127. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/adultswim.py +0 -0
  128. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/albavision.py +0 -0
  129. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/aloula.py +0 -0
  130. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/app17.py +0 -0
  131. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/ard_mediathek.py +0 -0
  132. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/artetv.py +0 -0
  133. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/atpchallenger.py +0 -0
  134. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/atresplayer.py +0 -0
  135. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/bbciplayer.py +0 -0
  136. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/bfmtv.py +0 -0
  137. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/bigo.py +0 -0
  138. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/bilibili.py +0 -0
  139. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/blasttv.py +0 -0
  140. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/blazetv.py +0 -0
  141. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/bloomberg.py +0 -0
  142. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/brightcove.py +0 -0
  143. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/btv.py +0 -0
  144. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/cbsnews.py +0 -0
  145. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/cdnbg.py +0 -0
  146. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/ceskatelevize.py +0 -0
  147. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/chzzk.py +0 -0
  148. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/cinergroup.py +0 -0
  149. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/clubbingtv.py +0 -0
  150. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/cmmedia.py +0 -0
  151. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/cnbce.py +0 -0
  152. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/cnews.py +0 -0
  153. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/dailymotion.py +0 -0
  154. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/dash.py +0 -0
  155. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/delfi.py +0 -0
  156. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/deutschewelle.py +0 -0
  157. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/dlive.py +0 -0
  158. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/dogan.py +0 -0
  159. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/dogus.py +0 -0
  160. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/douyin.py +0 -0
  161. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/douyu.py +0 -0
  162. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/drdk.py +0 -0
  163. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/earthcam.py +0 -0
  164. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/euronews.py +0 -0
  165. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/facebook.py +0 -0
  166. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/filmon.py +0 -0
  167. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/goltelevision.py +0 -0
  168. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/goodgame.py +0 -0
  169. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/googledrive.py +0 -0
  170. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/gulli.py +0 -0
  171. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/hiplayer.py +0 -0
  172. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/hls.py +0 -0
  173. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/http.py +0 -0
  174. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/htv.py +0 -0
  175. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/huajiao.py +0 -0
  176. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/huya.py +0 -0
  177. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/invintus.py +0 -0
  178. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/kick.py +0 -0
  179. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/kugou.py +0 -0
  180. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/livestream.py +0 -0
  181. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/lnk.py +0 -0
  182. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/lrt.py +0 -0
  183. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/ltv_lsm_lv.py +0 -0
  184. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/mangomolo.py +0 -0
  185. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/mdstrm.py +0 -0
  186. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/mediaklikk.py +0 -0
  187. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/mediavitrina.py +0 -0
  188. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/mixcloud.py +0 -0
  189. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/mjunoon.py +0 -0
  190. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/mrtmk.py +0 -0
  191. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/n13tv.py +0 -0
  192. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/nasaplus.py +0 -0
  193. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/nicolive.py +0 -0
  194. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/nimotv.py +0 -0
  195. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/nos.py +0 -0
  196. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/nowtvtr.py +0 -0
  197. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/nrk.py +0 -0
  198. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/okru.py +0 -0
  199. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/olympicchannel.py +0 -0
  200. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/oneplusone.py +0 -0
  201. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/onetv.py +0 -0
  202. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/openrectv.py +0 -0
  203. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/pandalive.py +0 -0
  204. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/piaulizaportal.py +0 -0
  205. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/picarto.py +0 -0
  206. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/pixiv.py +0 -0
  207. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/pluto.py +0 -0
  208. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/pluzz.py +0 -0
  209. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/radiko.py +0 -0
  210. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/raiplay.py +0 -0
  211. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/reuters.py +0 -0
  212. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/rtpa.py +0 -0
  213. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/rtpplay.py +0 -0
  214. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/rtve.py +0 -0
  215. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/rtvs.py +0 -0
  216. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/ruv.py +0 -0
  217. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/sbscokr.py +0 -0
  218. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/showroom.py +0 -0
  219. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/soop.py +0 -0
  220. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/sportal.py +0 -0
  221. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/sportschau.py +0 -0
  222. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/ssh101.py +0 -0
  223. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/stadium.py +0 -0
  224. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/steam.py +0 -0
  225. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/streann.py +0 -0
  226. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/stv.py +0 -0
  227. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/svtplay.py +0 -0
  228. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/swisstxt.py +0 -0
  229. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/telefe.py +0 -0
  230. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/telemadrid.py +0 -0
  231. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tf1.py +0 -0
  232. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tiktok.py +0 -0
  233. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/turkuvaz.py +0 -0
  234. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tv360.py +0 -0
  235. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tv3cat.py +0 -0
  236. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tv5monde.py +0 -0
  237. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tv8.py +0 -0
  238. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tv999.py +0 -0
  239. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tvazteca.py +0 -0
  240. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tvibo.py +0 -0
  241. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tviplayer.py +0 -0
  242. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tvp.py +0 -0
  243. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/tvtoya.py +0 -0
  244. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/twitcasting.py +0 -0
  245. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/twitch.py +0 -0
  246. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/ustreamtv.py +0 -0
  247. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/ustvnow.py +0 -0
  248. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/vidio.py +0 -0
  249. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/vimeo.py +0 -0
  250. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/vinhlongtv.py +0 -0
  251. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/vk.py +0 -0
  252. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/vkvideolive.py +0 -0
  253. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/welt.py +0 -0
  254. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/wwenetwork.py +0 -0
  255. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/youtvua.py +0 -0
  256. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/yupptv.py +0 -0
  257. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/zattoo.py +0 -0
  258. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/zdf_mediathek.py +0 -0
  259. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/plugins/zeenews.py +0 -0
  260. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/py.typed +0 -0
  261. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/session/__init__.py +0 -0
  262. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/session/http.py +0 -0
  263. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/session/http_useragents.py +0 -0
  264. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/session/options.py +0 -0
  265. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/session/plugins.py +0 -0
  266. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/session/session.py +0 -0
  267. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/__init__.py +0 -0
  268. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/dash/__init__.py +0 -0
  269. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/dash/dash.py +0 -0
  270. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/dash/segment.py +0 -0
  271. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/ffmpegmux.py +0 -0
  272. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/file.py +0 -0
  273. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/filtered.py +0 -0
  274. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/hls/__init__.py +0 -0
  275. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/hls/hls.py +0 -0
  276. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/hls/m3u8.py +0 -0
  277. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/hls/segment.py +0 -0
  278. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/http.py +0 -0
  279. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/segmented/__init__.py +0 -0
  280. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/segmented/segment.py +0 -0
  281. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/segmented/segmented.py +0 -0
  282. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/stream/stream.py +0 -0
  283. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/user_input.py +0 -0
  284. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/__init__.py +0 -0
  285. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/args.py +0 -0
  286. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/cache.py +0 -0
  287. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/data.py +0 -0
  288. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/formatter.py +0 -0
  289. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/id3v2.py +0 -0
  290. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/l10n.py +0 -0
  291. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/module.py +0 -0
  292. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/named_pipe.py +0 -0
  293. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/num.py +0 -0
  294. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/parse.py +0 -0
  295. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/path.py +0 -0
  296. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/processoutput.py +0 -0
  297. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/random.py +0 -0
  298. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/socket.py +0 -0
  299. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/thread.py +0 -0
  300. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/times.py +0 -0
  301. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/utils/url.py +0 -0
  302. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/validate/__init__.py +0 -0
  303. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/validate/_exception.py +0 -0
  304. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/validate/_schemas.py +0 -0
  305. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/validate/_validate.py +0 -0
  306. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/validate/_validators.py +0 -0
  307. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/__init__.py +0 -0
  308. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/__init__.py +0 -0
  309. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/client.py +0 -0
  310. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/connection.py +0 -0
  311. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/__init__.py +0 -0
  312. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/browser.py +0 -0
  313. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/debugger.py +0 -0
  314. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/dom.py +0 -0
  315. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/emulation.py +0 -0
  316. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/fetch.py +0 -0
  317. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/input_.py +0 -0
  318. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/inspector.py +0 -0
  319. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/io.py +0 -0
  320. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/network.py +0 -0
  321. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/page.py +0 -0
  322. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/runtime.py +0 -0
  323. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/security.py +0 -0
  324. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/target.py +0 -0
  325. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/devtools/util.py +0 -0
  326. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/cdp/exceptions.py +0 -0
  327. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/chromium.py +0 -0
  328. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/exceptions.py +0 -0
  329. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink/webbrowser/webbrowser.py +0 -0
  330. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink.egg-info/SOURCES.txt +0 -0
  331. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink.egg-info/dependency_links.txt +0 -0
  332. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink.egg-info/entry_points.txt +0 -0
  333. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink.egg-info/top_level.txt +0 -0
  334. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/__init__.py +0 -0
  335. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/__main__.py +0 -0
  336. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/_parser.py +0 -0
  337. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/argparser.py +0 -0
  338. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/__init__.py +0 -0
  339. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/console.py +0 -0
  340. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/stream_wrapper.pyi +0 -0
  341. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/terminal.py +0 -0
  342. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/user_input.py +0 -0
  343. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/console/windows.py +0 -0
  344. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/constants.py +0 -0
  345. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/exceptions.py +0 -0
  346. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/output/__init__.py +0 -0
  347. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/output/abc.py +0 -0
  348. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/output/file.py +0 -0
  349. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/output/http.py +0 -0
  350. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/output/player.py +0 -0
  351. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/py.typed +0 -0
  352. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/show_matchers.py +0 -0
  353. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/streamrunner.py +0 -0
  354. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/utils/__init__.py +0 -0
  355. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/utils/formatter.py +0 -0
  356. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/utils/path.py +0 -0
  357. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/utils/player.py +0 -0
  358. {streamlink-8.6.2 → streamlink-8.6.3}/src/streamlink_cli/utils/versioncheck.py +0 -0
  359. {streamlink-8.6.2 → streamlink-8.6.3}/tests/__init__.py +0 -0
  360. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/__init__.py +0 -0
  361. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/console/__init__.py +0 -0
  362. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/console/test_console.py +0 -0
  363. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/console/test_progress.py +0 -0
  364. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/console/test_stream.py +0 -0
  365. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/console/test_terminal.py +0 -0
  366. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/console/test_windows.py +0 -0
  367. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/__init__.py +0 -0
  368. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/conftest.py +0 -0
  369. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_can_handle_url.py +0 -0
  370. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_check_file_output.py +0 -0
  371. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_create_output.py +0 -0
  372. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_formatter.py +0 -0
  373. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_logging.py +0 -0
  374. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_main.py +0 -0
  375. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_output_stream.py +0 -0
  376. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_output_stream_passthrough.py +0 -0
  377. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_player_argv.py +0 -0
  378. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_resolve_stream_name.py +0 -0
  379. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_setup_args.py +0 -0
  380. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_setup_config_args.py +0 -0
  381. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_setup_plugins.py +0 -0
  382. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_setup_session_options.py +0 -0
  383. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_show_matchers.py +0 -0
  384. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/main/test_version_check.py +0 -0
  385. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/output/__init__.py +0 -0
  386. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/output/test_file.py +0 -0
  387. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/output/test_player.py +0 -0
  388. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/test_compat.py +0 -0
  389. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/test_streamrunner.py +0 -0
  390. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/utils/__init__.py +0 -0
  391. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/utils/test_formatter.py +0 -0
  392. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/utils/test_path.py +0 -0
  393. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/utils/test_player.py +0 -0
  394. {streamlink-8.6.2 → streamlink-8.6.3}/tests/cli/utils/test_versioncheck.py +0 -0
  395. {streamlink-8.6.2 → streamlink-8.6.3}/tests/conftest.py +0 -0
  396. {streamlink-8.6.2 → streamlink-8.6.3}/tests/mixins/__init__.py +0 -0
  397. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugin/__init__.py +0 -0
  398. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugin/override/testplugin.py +0 -0
  399. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugin/testplugin.py +0 -0
  400. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugin/testplugin_invalid.py +0 -0
  401. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugin/testplugin_missing.py +0 -0
  402. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/__init__.py +0 -0
  403. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/conftest.py +0 -0
  404. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_abematv.py +0 -0
  405. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_adultswim.py +0 -0
  406. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_albavision.py +0 -0
  407. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_aloula.py +0 -0
  408. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_app17.py +0 -0
  409. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_ard_mediathek.py +0 -0
  410. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_artetv.py +0 -0
  411. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_atpchallenger.py +0 -0
  412. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_atresplayer.py +0 -0
  413. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_bbciplayer.py +0 -0
  414. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_bfmtv.py +0 -0
  415. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_bigo.py +0 -0
  416. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_bilibili.py +0 -0
  417. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_blasttv.py +0 -0
  418. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_blazetv.py +0 -0
  419. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_bloomberg.py +0 -0
  420. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_brightcove.py +0 -0
  421. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_btv.py +0 -0
  422. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_cbsnews.py +0 -0
  423. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_cdnbg.py +0 -0
  424. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_ceskatelevize.py +0 -0
  425. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_chzzk.py +0 -0
  426. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_cinergroup.py +0 -0
  427. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_clubbingtv.py +0 -0
  428. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_cmmedia.py +0 -0
  429. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_cnbce.py +0 -0
  430. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_cnews.py +0 -0
  431. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_dailymotion.py +0 -0
  432. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_dash.py +0 -0
  433. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_delfi.py +0 -0
  434. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_deutschewelle.py +0 -0
  435. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_dlive.py +0 -0
  436. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_dogan.py +0 -0
  437. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_dogus.py +0 -0
  438. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_douyin.py +0 -0
  439. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_douyu.py +0 -0
  440. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_drdk.py +0 -0
  441. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_earthcam.py +0 -0
  442. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_euronews.py +0 -0
  443. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_facebook.py +0 -0
  444. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_filmon.py +0 -0
  445. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_goltelevision.py +0 -0
  446. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_goodgame.py +0 -0
  447. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_googledrive.py +0 -0
  448. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_gulli.py +0 -0
  449. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_hiplayer.py +0 -0
  450. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_hls.py +0 -0
  451. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_http.py +0 -0
  452. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_htv.py +0 -0
  453. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_huajiao.py +0 -0
  454. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_huya.py +0 -0
  455. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_invintus.py +0 -0
  456. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_kick.py +0 -0
  457. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_kugou.py +0 -0
  458. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_livestream.py +0 -0
  459. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_lnk.py +0 -0
  460. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_lrt.py +0 -0
  461. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_ltv_lsm_lv.py +0 -0
  462. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_mangomolo.py +0 -0
  463. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_mdstrm.py +0 -0
  464. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_mediaklikk.py +0 -0
  465. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_mediavitrina.py +0 -0
  466. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_mixcloud.py +0 -0
  467. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_mjunoon.py +0 -0
  468. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_mrtmk.py +0 -0
  469. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_n13tv.py +0 -0
  470. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_nasaplus.py +0 -0
  471. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_nicolive.py +0 -0
  472. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_nimotv.py +0 -0
  473. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_nos.py +0 -0
  474. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_nowtvtr.py +0 -0
  475. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_nrk.py +0 -0
  476. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_okru.py +0 -0
  477. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_olympicchannel.py +0 -0
  478. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_oneplusone.py +0 -0
  479. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_onetv.py +0 -0
  480. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_openrectv.py +0 -0
  481. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_pandalive.py +0 -0
  482. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_piaulizaportal.py +0 -0
  483. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_picarto.py +0 -0
  484. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_pixiv.py +0 -0
  485. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_pluto.py +0 -0
  486. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_pluzz.py +0 -0
  487. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_radiko.py +0 -0
  488. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_raiplay.py +0 -0
  489. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_reuters.py +0 -0
  490. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_rtpa.py +0 -0
  491. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_rtpplay.py +0 -0
  492. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_rtve.py +0 -0
  493. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_rtvs.py +0 -0
  494. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_ruv.py +0 -0
  495. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_sbscokr.py +0 -0
  496. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_showroom.py +0 -0
  497. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_soop.py +0 -0
  498. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_sportal.py +0 -0
  499. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_sportschau.py +0 -0
  500. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_ssh101.py +0 -0
  501. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_stadium.py +0 -0
  502. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_steam.py +0 -0
  503. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_streann.py +0 -0
  504. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_stv.py +0 -0
  505. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_svtplay.py +0 -0
  506. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_swisstxt.py +0 -0
  507. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_telefe.py +0 -0
  508. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_telemadrid.py +0 -0
  509. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tf1.py +0 -0
  510. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tiktok.py +0 -0
  511. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_turkuvaz.py +0 -0
  512. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tv360.py +0 -0
  513. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tv3cat.py +0 -0
  514. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tv5monde.py +0 -0
  515. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tv8.py +0 -0
  516. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tv999.py +0 -0
  517. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tvazteca.py +0 -0
  518. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tvibo.py +0 -0
  519. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tviplayer.py +0 -0
  520. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tvp.py +0 -0
  521. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_tvtoya.py +0 -0
  522. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_twitcasting.py +0 -0
  523. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_twitch.py +0 -0
  524. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_ustreamtv.py +0 -0
  525. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_ustvnow.py +0 -0
  526. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_vidio.py +0 -0
  527. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_vimeo.py +0 -0
  528. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_vinhlongtv.py +0 -0
  529. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_vk.py +0 -0
  530. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_vkvideolive.py +0 -0
  531. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_welt.py +0 -0
  532. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_wwenetwork.py +0 -0
  533. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_youtube.py +0 -0
  534. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_youtvua.py +0 -0
  535. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_yupptv.py +0 -0
  536. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_zattoo.py +0 -0
  537. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_zdf_mediathek.py +0 -0
  538. {streamlink-8.6.2 → streamlink-8.6.3}/tests/plugins/test_zeenews.py +0 -0
  539. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/__init__.py +0 -0
  540. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/cli/config/custom +0 -0
  541. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/cli/config/primary +0 -0
  542. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/cli/config/primary.testplugin +0 -0
  543. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/cli/config/secondary +0 -0
  544. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/cli/config/secondary.testplugin +0 -0
  545. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_1.mpd +0 -0
  546. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_10.mpd +0 -0
  547. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_11_static.mpd +0 -0
  548. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_2.mpd +0 -0
  549. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_3.mpd +0 -0
  550. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_8.mpd +0 -0
  551. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_9.mpd +0 -0
  552. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_attribute_namespaces.mpd +0 -0
  553. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_baseurl_nested.mpd +0 -0
  554. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_baseurl_scheme_mismatch.mpd +0 -0
  555. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_baseurl_urljoin.mpd +0 -0
  556. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_no_publish_time_timeline_with_start.mpd +0 -0
  557. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_no_publish_time_timeline_without_start.mpd +0 -0
  558. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_segment_list_no_duration.mpd +0 -0
  559. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_segment_list_p1.mpd +0 -0
  560. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_segment_list_p2.mpd +0 -0
  561. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_segment_list_p3.mpd +0 -0
  562. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_segment_list_p4.mpd +0 -0
  563. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_segment_list_p5.mpd +0 -0
  564. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_timeline_continued_p1.mpd +0 -0
  565. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_dynamic_timeline_continued_p2.mpd +0 -0
  566. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_location_scheme_mismatch.mpd +0 -0
  567. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_no_segment_list_or_template.mpd +0 -0
  568. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_period_selection.mpd +0 -0
  569. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_segment_list.mpd +0 -0
  570. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_segment_scheme_mismatch.mpd +0 -0
  571. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_segments_byterange.mpd +0 -0
  572. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_segments_dynamic_number.mpd +0 -0
  573. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_static_no_publish_time.mpd +0 -0
  574. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_suggested_presentation_delay.mpd +0 -0
  575. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_timeline_gap.mpd +0 -0
  576. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/dash/test_timeline_ids.mpd +0 -0
  577. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_1.m3u8 +0 -0
  578. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_date.m3u8 +0 -0
  579. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_master.m3u8 +0 -0
  580. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_media_language.m3u8 +0 -0
  581. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_media_language_special.m3u8 +0 -0
  582. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_multivariant_bandwidth.m3u8 +0 -0
  583. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_multivariant_twitch_usher_v2.m3u8 +0 -0
  584. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_simple_media.m3u8 +0 -0
  585. {streamlink-8.6.2 → streamlink-8.6.3}/tests/resources/hls/test_simple_multivariant.m3u8 +0 -0
  586. {streamlink-8.6.2 → streamlink-8.6.3}/tests/session/__init__.py +0 -0
  587. {streamlink-8.6.2 → streamlink-8.6.3}/tests/session/test_options.py +0 -0
  588. {streamlink-8.6.2 → streamlink-8.6.3}/tests/session/test_plugins.py +0 -0
  589. {streamlink-8.6.2 → streamlink-8.6.3}/tests/session/test_session.py +0 -0
  590. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/__init__.py +0 -0
  591. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/conftest.py +0 -0
  592. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/dash/__init__.py +0 -0
  593. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/dash/test_dash.py +0 -0
  594. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/dash/test_manifest.py +0 -0
  595. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/hls/__init__.py +0 -0
  596. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/hls/test_hls_filtered.py +0 -0
  597. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/hls/test_m3u8.py +0 -0
  598. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/test_ffmpegmux.py +0 -0
  599. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/test_file.py +0 -0
  600. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/test_init.py +0 -0
  601. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/test_segmented.py +0 -0
  602. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/test_stream_json.py +0 -0
  603. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/test_stream_to_url.py +0 -0
  604. {streamlink-8.6.2 → streamlink-8.6.3}/tests/stream/test_stream_wrappers.py +0 -0
  605. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_api_websocket.py +0 -0
  606. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_buffers.py +0 -0
  607. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_cache.py +0 -0
  608. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_compat.py +0 -0
  609. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_logger.py +0 -0
  610. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_options.py +0 -0
  611. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_plugin.py +0 -0
  612. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_plugin_userinput.py +0 -0
  613. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_plugins.py +0 -0
  614. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_streamlink_api.py +0 -0
  615. {streamlink-8.6.2 → streamlink-8.6.3}/tests/test_validate.py +0 -0
  616. {streamlink-8.6.2 → streamlink-8.6.3}/tests/testutils/__init__.py +0 -0
  617. {streamlink-8.6.2 → streamlink-8.6.3}/tests/testutils/handshake.py +0 -0
  618. {streamlink-8.6.2 → streamlink-8.6.3}/tests/testutils/test_handshake.py +0 -0
  619. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/__init__.py +0 -0
  620. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_args.py +0 -0
  621. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_cache.py +0 -0
  622. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_crypto.py +0 -0
  623. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_data.py +0 -0
  624. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_dataclass.py +0 -0
  625. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_formatter.py +0 -0
  626. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_id3v2.py +0 -0
  627. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_init.py +0 -0
  628. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_l10n.py +0 -0
  629. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_module.py +0 -0
  630. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_named_pipe.py +0 -0
  631. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_num.py +0 -0
  632. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_parse.py +0 -0
  633. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_path.py +0 -0
  634. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_processoutput.py +0 -0
  635. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_random.py +0 -0
  636. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_thread.py +0 -0
  637. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_times.py +0 -0
  638. {streamlink-8.6.2 → streamlink-8.6.3}/tests/utils/test_url.py +0 -0
  639. {streamlink-8.6.2 → streamlink-8.6.3}/tests/webbrowser/__init__.py +0 -0
  640. {streamlink-8.6.2 → streamlink-8.6.3}/tests/webbrowser/cdp/__init__.py +0 -0
  641. {streamlink-8.6.2 → streamlink-8.6.3}/tests/webbrowser/cdp/conftest.py +0 -0
  642. {streamlink-8.6.2 → streamlink-8.6.3}/tests/webbrowser/cdp/test_client.py +0 -0
  643. {streamlink-8.6.2 → streamlink-8.6.3}/tests/webbrowser/cdp/test_connection.py +0 -0
  644. {streamlink-8.6.2 → streamlink-8.6.3}/tests/webbrowser/conftest.py +0 -0
  645. {streamlink-8.6.2 → streamlink-8.6.3}/tests/webbrowser/test_webbrowser.py +0 -0
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## streamlink 8.6.3 (2026-10-29)
4
+
5
+ - SECURITY: new minor release primarily for Streamlink's Windows / Linux AppImages builds, with `brotli 1.2.1` (via uv.lock) ([`CVE-2026-111497`](https://nvd.nist.gov/vuln/detail/CVE-2026-111497))
6
+ - Fixed: `--retry-streams` and `--retry-max` in external/continuous HTTP output mode when re-fetching ([#7165](https://github.com/streamlink/streamlink/pull/7165))
7
+ - Build: bumped `pycryptodome` version requirements to `>=3.4.3,<5` ([#7167](https://github.com/streamlink/streamlink/pull/7167))
8
+ - Tests: fixed race-conditions in HLS tests ([#7174](https://github.com/streamlink/streamlink/pull/7174), [#7176](https://github.com/streamlink/streamlink/pull/7176))
9
+
10
+ [Full changelog](https://github.com/streamlink/streamlink/compare/8.6.2...8.6.3)
11
+
12
+
3
13
  ## streamlink 8.6.2 (2026-10-07)
4
14
 
5
15
  - SECURITY: fixed arbitrary local file read via `file://` URLs in DASH `Location` tags (`CVE-2026-TO-BE-ASSIGNED` / [`GHSA-j7pf-m7gx-jr33`](https://github.com/streamlink/streamlink/security/advisories/GHSA-j7pf-m7gx-jr33)) ([`98781761`](https://github.com/streamlink/streamlink/commit/987817618f57b6def852693e4e0a95fd9c8437f2))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: streamlink
3
- Version: 8.6.2
3
+ Version: 8.6.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
@@ -36,7 +36,7 @@ Requires-Dist: exceptiongroup; python_version < "3.11"
36
36
  Requires-Dist: isodate
37
37
  Requires-Dist: lxml<8,>=5.0.0
38
38
  Requires-Dist: pycountry
39
- Requires-Dist: pycryptodome<4,>=3.4.3
39
+ Requires-Dist: pycryptodome<5,>=3.4.3
40
40
  Requires-Dist: PySocks!=1.5.7,>=1.5.6
41
41
  Requires-Dist: requests<3,>=2.30.0
42
42
  Requires-Dist: trio<1,>=0.25.0; python_version >= "3.13"
@@ -199,8 +199,8 @@ def test_parse_sequence_or_mapping(parser: type[ast.NodeVisitor], code: str, exp
199
199
  PluginMatcher(pattern="bar", flags=re.IGNORECASE, priority=None, name=None),
200
200
  PluginMatcher(pattern="bar", flags=re.IGNORECASE, priority=None, name=None),
201
201
  PluginMatcher(pattern="bar", flags=re.IGNORECASE, priority=None, name=None),
202
- PluginMatcher(pattern="baz", flags=re.I | re.S | re.X, priority=None, name=None),
203
- PluginMatcher(pattern="baz", flags=re.I | re.S | re.X, priority=None, name=None),
202
+ PluginMatcher(pattern="baz", flags=re.I | re.S | re.X, priority=None, name=None), # ruff: ignore[regex-flag-alias]
203
+ PluginMatcher(pattern="baz", flags=re.I | re.S | re.X, priority=None, name=None), # ruff: ignore[regex-flag-alias]
204
204
  ],
205
205
  does_not_raise,
206
206
  id="pattern",
@@ -1092,7 +1092,7 @@ def test_plugin(test_plugin_code: str):
1092
1092
  assert pluginvisitor.matchers == [
1093
1093
  PluginMatcher(pattern="https://a", flags=None, priority=None, name=None),
1094
1094
  PluginMatcher(pattern="https://b", flags=re.IGNORECASE, priority=PluginMatcher.LOW_PRIORITY, name="b"),
1095
- PluginMatcher(pattern="https://c", flags=re.I | re.X, priority=20, name="c"),
1095
+ PluginMatcher(pattern="https://c", flags=re.IGNORECASE | re.VERBOSE, priority=20, name="c"),
1096
1096
  ]
1097
1097
  assert pluginvisitor.arguments == [
1098
1098
  PluginArgument(name="a", type="comma_list_filter", type_kwargs={"acceptable": ["a", "b"]}, default=["a"], help="a"),
@@ -216,7 +216,12 @@ _shtab_streamlink() {
216
216
  compgen -W "${current_action_choices[*]}" -- "$completing_word")
217
217
  fi
218
218
 
219
+ if [[ ${#COMPREPLY[@]} = 0 ]]; then
220
+ # native fallback matches are not necessarily filenames (e.g. variables)
221
+ compopt +o filenames 2>/dev/null || : # bash>=4
222
+ fi
223
+
219
224
  return 0
220
225
  }
221
226
 
222
- complete -F _shtab_streamlink streamlink
227
+ complete -o bashdefault -F _shtab_streamlink streamlink
@@ -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" "Oct 07, 2026" "8.6.2" "Streamlink"
30
+ .TH "STREAMLINK" "1" "Oct 29, 2026" "8.6.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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## streamlink 8.6.3 (2026-10-29)
4
+
5
+ - SECURITY: new minor release primarily for Streamlink's Windows / Linux AppImages builds, with `brotli 1.2.1` (via uv.lock) ([`CVE-2026-111497`](https://nvd.nist.gov/vuln/detail/CVE-2026-111497))
6
+ - Fixed: `--retry-streams` and `--retry-max` in external/continuous HTTP output mode when re-fetching ([#7165](https://github.com/streamlink/streamlink/pull/7165))
7
+ - Build: bumped `pycryptodome` version requirements to `>=3.4.3,<5` ([#7167](https://github.com/streamlink/streamlink/pull/7167))
8
+ - Tests: fixed race-conditions in HLS tests ([#7174](https://github.com/streamlink/streamlink/pull/7174), [#7176](https://github.com/streamlink/streamlink/pull/7176))
9
+
10
+ [Full changelog](https://github.com/streamlink/streamlink/compare/8.6.2...8.6.3)
11
+
12
+
3
13
  ## streamlink 8.6.2 (2026-10-07)
4
14
 
5
15
  - SECURITY: fixed arbitrary local file read via `file://` URLs in DASH `Location` tags (`CVE-2026-TO-BE-ASSIGNED` / [`GHSA-j7pf-m7gx-jr33`](https://github.com/streamlink/streamlink/security/advisories/GHSA-j7pf-m7gx-jr33)) ([`98781761`](https://github.com/streamlink/streamlink/commit/987817618f57b6def852693e4e0a95fd9c8437f2))
@@ -187,6 +187,16 @@ Linux and BSD
187
187
  - .. code-block:: bash
188
188
 
189
189
  sudo dnf install streamlink
190
+ * - :octicon:`package-dependents` `FreeBSD (pkg)`_
191
+ - .. code-block:: bash
192
+
193
+ pkg install multimedia/streamlink
194
+
195
+ * - :octicon:`package-dependents` `FreeBSD (ports)`_
196
+ - .. code-block:: bash
197
+
198
+ cd /usr/ports/multimedia/streamlink
199
+ make config install clean
190
200
  * - :octicon:`package-dependents` `Gentoo Linux`_
191
201
  - .. code-block:: bash
192
202
 
@@ -223,6 +233,8 @@ Linux and BSD
223
233
  .. _Debian (sid, testing): https://packages.debian.org/sid/streamlink
224
234
  .. _Debian (stable): https://packages.debian.org/trixie-backports/streamlink
225
235
  .. _Fedora: https://src.fedoraproject.org/rpms/python-streamlink
236
+ .. _FreeBSD (pkg): https://ports.freebsd.org/cgi/ports.cgi?query=streamlink&stype=name
237
+ .. _FreeBSD (ports): https://www.freshports.org/multimedia/streamlink
226
238
  .. _Gentoo Linux: https://packages.gentoo.org/package/net-misc/streamlink
227
239
  .. _NixOS: https://github.com/NixOS/nixpkgs/tree/master/pkgs/by-name/st/streamlink
228
240
  .. _openSUSE: https://build.opensuse.org/package/show/multimedia:apps/streamlink
@@ -60,7 +60,7 @@ dependencies = [
60
60
  "isodate",
61
61
  "lxml >=5.0.0,<8",
62
62
  "pycountry",
63
- "pycryptodome >=3.4.3,<4",
63
+ "pycryptodome >=3.4.3,<5",
64
64
  "PySocks >=1.5.6,!=1.5.7",
65
65
  "requests >=2.30.0,<3",
66
66
  "trio >=0.25.0,<1 ; python_version>='3.13'",
@@ -108,14 +108,14 @@ test = [
108
108
  "freezegun >=1.5.0",
109
109
  ]
110
110
  lint = [
111
- "ruff ==0.16.10",
111
+ "ruff ==0.17.3",
112
112
  ]
113
113
  typing = [
114
114
  { include-group = "test" },
115
115
  { include-group = "docs" },
116
116
  { include-group = "script" },
117
117
  # tools and typing dependencies
118
- "ty ==0.0.85",
118
+ "ty ==0.0.92",
119
119
  "mypy[faster-cache] ==2.4.0",
120
120
  "typing-extensions >=4.0.0",
121
121
  # dependency overrides
@@ -265,6 +265,12 @@ exclude = [
265
265
 
266
266
  [tool.ruff.lint]
267
267
  select = [
268
+ "correctness",
269
+ "suspicious",
270
+ # "complexity",
271
+ "performance",
272
+ "style",
273
+
268
274
  # pycodestyle
269
275
  "E",
270
276
  "W",
@@ -315,15 +321,20 @@ select = [
315
321
  ]
316
322
  ignore = [
317
323
  "async-function-with-timeout",
324
+ "blind-except",
318
325
  "builtin-attribute-shadowing",
319
326
  "compare-to-empty-string",
327
+ "escape-sequence-in-docstring",
320
328
  "explicit-string-concatenation",
329
+ "math-constant",
321
330
  "missing-f-string-syntax",
322
331
  "missing-trailing-comma", # already covered by ruff's formatter
323
332
  "parenthesize-chained-operators",
333
+ "raise-vanilla-class",
324
334
  "redefined-loop-name",
325
335
  "return-in-generator",
326
336
  "stdlib-module-shadowing",
337
+ "subclass-builtin",
327
338
  "unnecessary-collection-call",
328
339
  "unnecessary-dunder-call",
329
340
  "unsorted-dunder-all",
@@ -368,6 +379,12 @@ allow-multiline = false
368
379
  [tool.ty.environment]
369
380
  python-platform = "all"
370
381
 
382
+ [[tool.ty.overrides]]
383
+ include = ["build_backend", "docs", "src", "tests"]
384
+
385
+ [tool.ty.overrides.rules]
386
+ invalid-mutable-override = "ignore" # TODO: don't ignore this rule
387
+
371
388
  [tool.ty.src]
372
389
  exclude = [
373
390
  "src/streamlink/packages/**",
@@ -91,5 +91,5 @@ if __name__ == "__main__":
91
91
  cmdclass=get_cmdclasses(cmdclass),
92
92
  entry_points=entry_points,
93
93
  data_files=data_files,
94
- version="8.6.2",
94
+ version="8.6.3",
95
95
  )
@@ -0,0 +1 @@
1
+ __version__ = "8.6.3"
@@ -89,9 +89,7 @@ class YouTube(Plugin):
89
89
  # translate input URLs to be able to find embedded data and to avoid unnecessary HTTP redirects
90
90
  if parsed.netloc == "gaming.youtube.com":
91
91
  self.url = urlunparse(parsed._replace(scheme="https", netloc="www.youtube.com"))
92
- elif self.matches["shorthand"]:
93
- self.url = self._url_canonical.format(video_id=self.match["video_id"])
94
- elif self.matches["embed"] and self.match["video_id"]:
92
+ elif self.matches["shorthand"] or self.matches["embed"] and self.match["video_id"]:
95
93
  self.url = self._url_canonical.format(video_id=self.match["video_id"])
96
94
  elif self.matches["embed"] and self.match["live"]:
97
95
  self.url = self._url_channelid_live.format(channel_id=self.match["live"])
@@ -26,29 +26,14 @@ class _StreamlinkKwargs(TypedDict, total=False):
26
26
  class _SchemaKwargs(TypedDict):
27
27
  schema: Schema
28
28
 
29
- class _RequestKwargs(_requeststypes.RequestKwargs, _StreamlinkKwargs):
30
- pass
31
-
32
- class _RequestKwargsWithSchema(_requeststypes.RequestKwargs, _StreamlinkKwargs, _SchemaKwargs):
33
- pass
34
-
35
- class _GetKwargs(_requeststypes.GetKwargs, _StreamlinkKwargs):
36
- pass
37
-
38
- class _GetKwargsWithSchema(_requeststypes.GetKwargs, _StreamlinkKwargs, _SchemaKwargs):
39
- pass
40
-
41
- class _PostKwargs(_requeststypes.PostKwargs, _StreamlinkKwargs):
42
- pass
43
-
44
- class _PostKwargsWithSchema(_requeststypes.PostKwargs, _StreamlinkKwargs, _SchemaKwargs):
45
- pass
46
-
47
- class _DataKwargs(_requeststypes.DataKwargs, _StreamlinkKwargs):
48
- pass
49
-
50
- class _DataKwargsWithSchema(_requeststypes.DataKwargs, _StreamlinkKwargs, _SchemaKwargs):
51
- pass
29
+ class _RequestKwargs(_requeststypes.RequestKwargs, _StreamlinkKwargs): ...
30
+ class _RequestKwargsWithSchema(_requeststypes.RequestKwargs, _StreamlinkKwargs, _SchemaKwargs): ...
31
+ class _GetKwargs(_requeststypes.GetKwargs, _StreamlinkKwargs): ...
32
+ class _GetKwargsWithSchema(_requeststypes.GetKwargs, _StreamlinkKwargs, _SchemaKwargs): ...
33
+ class _PostKwargs(_requeststypes.PostKwargs, _StreamlinkKwargs): ...
34
+ class _PostKwargsWithSchema(_requeststypes.PostKwargs, _StreamlinkKwargs, _SchemaKwargs): ...
35
+ class _DataKwargs(_requeststypes.DataKwargs, _StreamlinkKwargs): ...
36
+ class _DataKwargsWithSchema(_requeststypes.DataKwargs, _StreamlinkKwargs, _SchemaKwargs): ...
52
37
 
53
38
  # ----
54
39
 
@@ -330,7 +330,7 @@ class MPD(MPDNode):
330
330
 
331
331
  __tag__ = "MPD"
332
332
 
333
- parent: None # type: ignore[assignment]
333
+ parent: None # type: ignore[assignment, ty:invalid-attribute-override]
334
334
  timelines: dict[TTimelineIdent, int]
335
335
 
336
336
  DEFAULT_MINBUFFERTIME = 3.0
@@ -1,4 +1,5 @@
1
1
  import io
2
+ from contextlib import suppress
2
3
  from threading import Thread
3
4
 
4
5
  from streamlink.buffers import Buffer, RingBuffer
@@ -81,10 +82,8 @@ class StreamIOThreadWrapper(io.IOBase):
81
82
  self.buffer.close()
82
83
 
83
84
  if hasattr(self.fd, "close"):
84
- try:
85
+ with suppress(Exception):
85
86
  self.fd.close()
86
- except Exception:
87
- pass
88
87
 
89
88
  def __init__(self, session, fd, timeout=30):
90
89
  self.buffer = RingBuffer(session.get_option("ringbuffer-size"))
@@ -14,6 +14,8 @@ try:
14
14
  from Crypto.Util.Padding import pad, unpad
15
15
  except ImportError: # pragma: no cover
16
16
  # pycryptodomex (independent of the old PyCrypto library)
17
+ # Support for pycryptodomex ended with pycryptodome 4.0.0.
18
+ # Keep the fallback imports until pycryptodomex is not packaged by major distros anymore.
17
19
  from Cryptodome.Cipher import AES, PKCS1_v1_5 # type: ignore
18
20
  from Cryptodome.Hash import MD5, SHA256 # type: ignore
19
21
  from Cryptodome.PublicKey import RSA # type: ignore
@@ -17,10 +17,8 @@ if TYPE_CHECKING:
17
17
 
18
18
  from _typeshed import DataclassInstance
19
19
 
20
- _Ta = TypeVar("_Ta")
21
- _Tb = TypeVar("_Tb")
22
-
23
- _TFormatters: TypeAlias = dict[type[_Tb], Callable[[_Tb], str]]
20
+ _T = TypeVar("_T")
21
+ _TFormatters: TypeAlias = dict[type[_T], Callable[[_T], str]]
24
22
 
25
23
 
26
24
  _DEFAULT_FORMATTERS: _TFormatters = {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: streamlink
3
- Version: 8.6.2
3
+ Version: 8.6.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
@@ -36,7 +36,7 @@ Requires-Dist: exceptiongroup; python_version < "3.11"
36
36
  Requires-Dist: isodate
37
37
  Requires-Dist: lxml<8,>=5.0.0
38
38
  Requires-Dist: pycountry
39
- Requires-Dist: pycryptodome<4,>=3.4.3
39
+ Requires-Dist: pycryptodome<5,>=3.4.3
40
40
  Requires-Dist: PySocks!=1.5.7,>=1.5.6
41
41
  Requires-Dist: requests<3,>=2.30.0
42
42
  Requires-Dist: trio<1,>=0.25.0; python_version >= "3.13"
@@ -2,7 +2,7 @@ certifi
2
2
  isodate
3
3
  lxml<8,>=5.0.0
4
4
  pycountry
5
- pycryptodome<4,>=3.4.3
5
+ pycryptodome<5,>=3.4.3
6
6
  PySocks!=1.5.7,>=1.5.6
7
7
  requests<3,>=2.30.0
8
8
  trio-websocket<1,>=0.9.0
@@ -9,7 +9,7 @@ except AttributeError: # pragma: no cover
9
9
  from atexit import register as _atexit_register
10
10
  from pathlib import Path
11
11
 
12
- stdout = Path(devnull).open("wb")
12
+ stdout = Path(devnull).open("wb") # ruff: ignore[open-file-with-context-handler]
13
13
  _atexit_register(stdout.close)
14
14
  del _atexit_register
15
15
 
@@ -94,7 +94,7 @@ class ProgressFormatter:
94
94
  try:
95
95
  for idx, fn, _ in variable:
96
96
  static[idx] = fn(max_width)
97
- except Exception:
97
+ except Exception: # ruff: ignore[try-except-continue]
98
98
  continue
99
99
  break
100
100
 
@@ -19,7 +19,7 @@ class ConsoleStatusMessage(str):
19
19
 
20
20
 
21
21
  class ConsoleOutputStream(StreamWrapper):
22
- def __new__(cls, stream: TextIOWrapper) -> ConsoleOutputStream:
22
+ def __new__(cls, stream: TextIOWrapper) -> ConsoleOutputStream: # ruff: ignore[non-self-return-type]
23
23
  if stream.isatty():
24
24
  if (
25
25
  is_win32
@@ -13,7 +13,7 @@ class StreamWrapper:
13
13
  def wrap(cls, obj, attr):
14
14
  stream = getattr(obj, attr)
15
15
  if not isinstance(stream, TextIOWrapper):
16
- raise AttributeError(f"{stream!r} is not a TextIOWrapper object ({obj!r}, {attr!r})")
16
+ raise TypeError(f"{stream!r} is not a TextIOWrapper object ({obj!r}, {attr!r})")
17
17
 
18
18
  console_output_stream = cls(stream)
19
19
  console_output_stream._wrap(obj, attr)
@@ -265,6 +265,9 @@ def output_stream_http(
265
265
  user_agent = server.request.headers.get("User-Agent") or "unknown player"
266
266
  log.info(f"Got HTTP request from {user_agent}")
267
267
 
268
+ retry_streams = args.retry_streams or 10
269
+ retry_max = args.retry_max or 0
270
+ retry_attempts = 0
268
271
  stream_fd = prebuffer = None
269
272
  while not stream_fd and (not player or player.running):
270
273
  try: # ruff: ignore[too-many-statements-in-try-clause]
@@ -277,20 +280,35 @@ def output_stream_http(
277
280
  for stream_name in (resolve_stream_name(streams, s) for s in args.stream):
278
281
  if stream_name in streams:
279
282
  stream = streams[stream_name]
283
+ retry_attempts = 0
280
284
  break
281
285
  else:
282
- log.info("Stream not available, will re-fetch streams in 10 sec")
283
- sleep(10)
286
+ if retry_attempts >= retry_max > 0:
287
+ continuous = False
288
+ break
289
+ log.info(f"Stream not available, re-fetching streams in {retry_streams:.1f} second(s)")
290
+ retry_attempts += 1
291
+ sleep(retry_streams)
284
292
  continue
285
293
  except PluginError as err:
286
- log.error(f"Unable to fetch new streams: {err}")
294
+ if retry_attempts >= retry_max > 0:
295
+ continuous = False
296
+ break
297
+ log.error(f"Unable to fetch new streams, retrying in {retry_streams:.1f} second(s): {err}")
298
+ retry_attempts += 1
299
+ sleep(retry_streams)
287
300
  continue
288
301
 
289
- try:
290
- log.info(f"Opening stream: {stream_name} ({type(stream).shortname()})")
291
- stream_fd, prebuffer = open_stream(stream)
292
- except StreamError as err:
293
- log.error(err)
302
+ for i in range(args.retry_open):
303
+ try:
304
+ log.info(f"Opening stream: {stream_name} ({type(stream).shortname()})")
305
+ stream_fd, prebuffer = open_stream(stream)
306
+ break
307
+ except StreamError as err:
308
+ log.error(f"Try {i + 1}/{args.retry_open}: Could not open stream {stream} ({err})")
309
+ else:
310
+ server.shutdown()
311
+ raise StreamlinkCLIError(f"Could not open stream {stream}, tried {args.retry_open} times, exiting")
294
312
 
295
313
  if stream_fd and prebuffer:
296
314
  log.debug("Writing stream to player")
@@ -298,6 +316,7 @@ def output_stream_http(
298
316
  try:
299
317
  stream_runner.run(prebuffer)
300
318
  except OSError as err:
319
+ server.shutdown()
301
320
  raise StreamlinkCLIError() from err
302
321
 
303
322
  if not continuous:
@@ -525,7 +544,7 @@ def fetch_streams_with_retry(plugin: Plugin, interval: float, count: int) -> Map
525
544
  streams = None
526
545
 
527
546
  if not streams:
528
- log.info(f"Waiting for streams, retrying every {interval} second(s)")
547
+ log.info(f"Waiting for streams, retrying every {interval:.1f} second(s)")
529
548
  attempts = 0
530
549
 
531
550
  while not streams:
@@ -12,7 +12,7 @@ def _console_output_stream(monkeypatch: pytest.MonkeyPatch):
12
12
 
13
13
 
14
14
  def test_wrap_error():
15
- with pytest.raises(AttributeError):
15
+ with pytest.raises(TypeError):
16
16
  ConsoleOutputStream.wrap(sys, "version")
17
17
 
18
18
 
@@ -380,7 +380,7 @@ def test_handle_url_text_output(
380
380
  (
381
381
  "[cli][info] Found matching plugin plugin for URL plugin\n"
382
382
  + "[plugins.plugin][info] plugin log message\n"
383
- + "[cli][info] Waiting for streams, retrying every 1 second(s)\n"
383
+ + "[cli][info] Waiting for streams, retrying every 1.0 second(s)\n"
384
384
  + "error: No playable streams found on this URL: plugin\n"
385
385
  ),
386
386
  id="no-streams",
@@ -476,7 +476,7 @@ def test_handle_url_text_output(
476
476
  (
477
477
  "[cli][info] Found matching plugin plugin for URL plugin\n"
478
478
  + "[plugins.plugin][info] plugin log message\n"
479
- + "[cli][info] Waiting for streams, retrying every 1 second(s)\n"
479
+ + "[cli][info] Waiting for streams, retrying every 1.0 second(s)\n"
480
480
  + "error: fatal\n"
481
481
  ),
482
482
  id="fatal-plugin-error-on-second-attempt",
@@ -151,8 +151,10 @@ class TestMatchArgumentOverride:
151
151
  monkeypatch.setattr("argparse._", null_translations.gettext)
152
152
  monkeypatch.setattr("argparse.ngettext", null_translations.ngettext)
153
153
 
154
- @pytest.fixture(scope="module")
155
- def parser(self):
154
+ # noinspection nested-decorators
155
+ @pytest.fixture(scope="class")
156
+ @classmethod
157
+ def parser(cls):
156
158
  parser = ArgumentParser(exit_on_error=False)
157
159
  parser.add_argument("-a", "--one", dest="arg")
158
160
  parser.add_argument("-b", "--two", nargs=2)
@@ -4,6 +4,7 @@ import unittest
4
4
  from binascii import hexlify
5
5
  from functools import partial
6
6
  from threading import Event, Thread
7
+ from types import SimpleNamespace
7
8
  from typing import TYPE_CHECKING
8
9
  from unittest.mock import patch
9
10
 
@@ -206,7 +207,7 @@ class TestMixinStreamHLS(unittest.TestCase):
206
207
  super().__init__(*args, **kwargs)
207
208
  # FIXME: fix HTTPSession.request()
208
209
  # don't sleep on mocked HTTP request failures
209
- self._patch_http_retry_sleep = patch("streamlink.session.http.time.sleep")
210
+ self._patch_http_retry_sleep = patch("streamlink.session.http.time", SimpleNamespace(sleep=lambda _: None))
210
211
  self.mocker = requests_mock.Mocker()
211
212
  self.mocks = {}
212
213
 
@@ -6,6 +6,7 @@ from contextlib import closing, nullcontext
6
6
  from operator import itemgetter
7
7
  from socket import AF_INET, AF_INET6
8
8
  from ssl import SSLContext
9
+ from types import SimpleNamespace
9
10
  from typing import TYPE_CHECKING, Any
10
11
  from unittest.mock import Mock, PropertyMock, call
11
12
 
@@ -169,7 +170,7 @@ class TestHTTPSession:
169
170
  res = method("http://localhost")
170
171
  assert isinstance(res, requests.Response)
171
172
  assert res.text == "OK"
172
- assert mocked.called_once
173
+ assert mocked.call_count == 1
173
174
 
174
175
  @pytest.mark.parametrize(
175
176
  ("params", "expected"),
@@ -220,7 +221,7 @@ class TestHTTPSession:
220
221
  def test_read_timeout(self, monkeypatch: pytest.MonkeyPatch):
221
222
  mock_sleep = Mock()
222
223
  mock_request = Mock(side_effect=requests.Timeout)
223
- monkeypatch.setattr("streamlink.session.http.time.sleep", mock_sleep)
224
+ monkeypatch.setattr("streamlink.session.http.time", SimpleNamespace(sleep=mock_sleep))
224
225
  monkeypatch.setattr("streamlink.session.http.Session.request", mock_request)
225
226
 
226
227
  session = HTTPSession()