streamlink 6.7.2__tar.gz → 6.7.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (620) hide show
  1. {streamlink-6.7.2 → streamlink-6.7.3}/CHANGELOG.md +18 -0
  2. {streamlink-6.7.2 → streamlink-6.7.3}/PKG-INFO +1 -1
  3. {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/test_onbuild.py +7 -1
  4. {streamlink-6.7.2 → streamlink-6.7.3}/dev-requirements.txt +2 -2
  5. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_build/man/streamlink.1 +1 -1
  6. {streamlink-6.7.2 → streamlink-6.7.3}/docs/changelog.md +18 -0
  7. {streamlink-6.7.2 → streamlink-6.7.3}/docs/install.rst +1 -1
  8. {streamlink-6.7.2 → streamlink-6.7.3}/setup.py +1 -1
  9. streamlink-6.7.3/src/streamlink/_version.py +1 -0
  10. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/useragents.py +6 -6
  11. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/_validators.py +5 -1
  12. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mangomolo.py +5 -2
  13. streamlink-6.7.3/src/streamlink/plugins/pluto.py +230 -0
  14. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/showroom.py +1 -1
  15. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/twitch.py +6 -8
  16. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vkplay.py +4 -4
  17. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/webbrowser.py +9 -7
  18. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/PKG-INFO +1 -1
  19. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/formatter.py +5 -4
  20. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/path.py +26 -4
  21. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/test_formatter.py +17 -0
  22. streamlink-6.7.3/tests/cli/utils/test_path.py +193 -0
  23. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mangomolo.py +8 -0
  24. streamlink-6.7.3/tests/plugins/test_pluto.py +32 -0
  25. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vkplay.py +3 -1
  26. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_api_validate.py +9 -2
  27. {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/test_webbrowser.py +21 -3
  28. streamlink-6.7.2/src/streamlink/_version.py +0 -1
  29. streamlink-6.7.2/src/streamlink/plugins/pluto.py +0 -189
  30. streamlink-6.7.2/tests/cli/utils/test_path.py +0 -81
  31. streamlink-6.7.2/tests/plugins/test_pluto.py +0 -60
  32. {streamlink-6.7.2 → streamlink-6.7.3}/AUTHORS +0 -0
  33. {streamlink-6.7.2 → streamlink-6.7.3}/LICENSE +0 -0
  34. {streamlink-6.7.2 → streamlink-6.7.3}/MANIFEST.in +0 -0
  35. {streamlink-6.7.2 → streamlink-6.7.3}/README.md +0 -0
  36. {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/__init__.py +0 -0
  37. {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/commands.py +0 -0
  38. {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/onbuild.py +0 -0
  39. {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/plugins_json.py +0 -0
  40. {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/test_build_backend.py +0 -0
  41. {streamlink-6.7.2 → streamlink-6.7.3}/build_backend/test_plugins_json.py +0 -0
  42. {streamlink-6.7.2 → streamlink-6.7.3}/completions/bash/streamlink +0 -0
  43. {streamlink-6.7.2 → streamlink-6.7.3}/completions/zsh/_streamlink +0 -0
  44. {streamlink-6.7.2 → streamlink-6.7.3}/docs/Makefile +0 -0
  45. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_man.rst +0 -0
  46. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/apple-touch-icon.png +0 -0
  47. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/favicon-16x16.png +0 -0
  48. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/favicon-32x32.png +0 -0
  49. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/favicon.ico +0 -0
  50. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/icon-ffmpeg.svg +0 -0
  51. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/icon-python.svg +0 -0
  52. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/icon.svg +0 -0
  53. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/opengraph-image.png +0 -0
  54. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/site.webmanifest +0 -0
  55. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_static/styles/custom.css +0 -0
  56. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_templates/base.html +0 -0
  57. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_templates/page.html +0 -0
  58. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_templates/sidebar/brand.html +0 -0
  59. {streamlink-6.7.2 → streamlink-6.7.3}/docs/_templates/sidebar/github-buttons.html +0 -0
  60. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/cache.rst +0 -0
  61. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/exceptions.rst +0 -0
  62. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/options.rst +0 -0
  63. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/plugin.rst +0 -0
  64. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/session.rst +0 -0
  65. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/stream.rst +0 -0
  66. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/streamlink.rst +0 -0
  67. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/validate.rst +0 -0
  68. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api/webbrowser.rst +0 -0
  69. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api.rst +0 -0
  70. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api_guide/quickstart.rst +0 -0
  71. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api_guide/validate.rst +0 -0
  72. {streamlink-6.7.2 → streamlink-6.7.3}/docs/api_guide.rst +0 -0
  73. {streamlink-6.7.2 → streamlink-6.7.3}/docs/applications.rst +0 -0
  74. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/config.rst +0 -0
  75. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/metadata.rst +0 -0
  76. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/plugin-sideloading.rst +0 -0
  77. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/plugins/crunchyroll.rst +0 -0
  78. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/plugins/twitch.rst +0 -0
  79. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/plugins.rst +0 -0
  80. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/protocols.rst +0 -0
  81. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/proxy.rst +0 -0
  82. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli/tutorial.rst +0 -0
  83. {streamlink-6.7.2 → streamlink-6.7.3}/docs/cli.rst +0 -0
  84. {streamlink-6.7.2 → streamlink-6.7.3}/docs/conf.py +0 -0
  85. {streamlink-6.7.2 → streamlink-6.7.3}/docs/deprecations.rst +0 -0
  86. {streamlink-6.7.2 → streamlink-6.7.3}/docs/developing.rst +0 -0
  87. {streamlink-6.7.2 → streamlink-6.7.3}/docs/docutils.conf +0 -0
  88. {streamlink-6.7.2 → streamlink-6.7.3}/docs/donate.rst +0 -0
  89. {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_argparse.py +0 -0
  90. {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_github.py +0 -0
  91. {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_html_template_vars.py +0 -0
  92. {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_plugins.py +0 -0
  93. {streamlink-6.7.2 → streamlink-6.7.3}/docs/ext_releaseref.py +0 -0
  94. {streamlink-6.7.2 → streamlink-6.7.3}/docs/index.rst +0 -0
  95. {streamlink-6.7.2 → streamlink-6.7.3}/docs/migrations.rst +0 -0
  96. {streamlink-6.7.2 → streamlink-6.7.3}/docs/players.rst +0 -0
  97. {streamlink-6.7.2 → streamlink-6.7.3}/docs/plugins.rst +0 -0
  98. {streamlink-6.7.2 → streamlink-6.7.3}/docs/thirdparty.rst +0 -0
  99. {streamlink-6.7.2 → streamlink-6.7.3}/docs-requirements.txt +0 -0
  100. {streamlink-6.7.2 → streamlink-6.7.3}/icon.svg +0 -0
  101. {streamlink-6.7.2 → streamlink-6.7.3}/pyproject.toml +0 -0
  102. {streamlink-6.7.2 → streamlink-6.7.3}/script/build-shell-completions.sh +0 -0
  103. {streamlink-6.7.2 → streamlink-6.7.3}/setup.cfg +0 -0
  104. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/__init__.py +0 -0
  105. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/__main__.py +0 -0
  106. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/api.py +0 -0
  107. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/buffers.py +0 -0
  108. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/cache.py +0 -0
  109. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/compat.py +0 -0
  110. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/exceptions.py +0 -0
  111. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/logger.py +0 -0
  112. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/options.py +0 -0
  113. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/packages/__init__.py +0 -0
  114. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/packages/requests_file.py +0 -0
  115. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/__init__.py +0 -0
  116. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/__init__.py +0 -0
  117. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/http_session.py +0 -0
  118. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/__init__.py +0 -0
  119. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/_exception.py +0 -0
  120. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/_schemas.py +0 -0
  121. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/validate/_validate.py +0 -0
  122. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/api/websocket.py +0 -0
  123. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugin/plugin.py +0 -0
  124. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/__init__.py +0 -0
  125. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/abematv.py +0 -0
  126. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/adultswim.py +0 -0
  127. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/afreeca.py +0 -0
  128. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/albavision.py +0 -0
  129. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/aloula.py +0 -0
  130. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/app17.py +0 -0
  131. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ard_live.py +0 -0
  132. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ard_mediathek.py +0 -0
  133. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/artetv.py +0 -0
  134. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/atpchallenger.py +0 -0
  135. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/atresplayer.py +0 -0
  136. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bbciplayer.py +0 -0
  137. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bfmtv.py +0 -0
  138. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bigo.py +0 -0
  139. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bilibili.py +0 -0
  140. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/blazetv.py +0 -0
  141. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/bloomberg.py +0 -0
  142. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/booyah.py +0 -0
  143. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/brightcove.py +0 -0
  144. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/btv.py +0 -0
  145. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cbsnews.py +0 -0
  146. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cdnbg.py +0 -0
  147. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ceskatelevize.py +0 -0
  148. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cinergroup.py +0 -0
  149. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/clubbingtv.py +0 -0
  150. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cmmedia.py +0 -0
  151. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/cnews.py +0 -0
  152. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/crunchyroll.py +0 -0
  153. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dailymotion.py +0 -0
  154. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dash.py +0 -0
  155. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/delfi.py +0 -0
  156. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/deutschewelle.py +0 -0
  157. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dlive.py +0 -0
  158. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dogan.py +0 -0
  159. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/dogus.py +0 -0
  160. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/drdk.py +0 -0
  161. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/earthcam.py +0 -0
  162. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/euronews.py +0 -0
  163. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/facebook.py +0 -0
  164. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/filmon.py +0 -0
  165. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/galatasaraytv.py +0 -0
  166. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/goltelevision.py +0 -0
  167. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/goodgame.py +0 -0
  168. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/googledrive.py +0 -0
  169. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/gulli.py +0 -0
  170. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/hiplayer.py +0 -0
  171. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/hls.py +0 -0
  172. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/http.py +0 -0
  173. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/htv.py +0 -0
  174. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/huajiao.py +0 -0
  175. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/huya.py +0 -0
  176. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/idf1.py +0 -0
  177. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/indihometv.py +0 -0
  178. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/invintus.py +0 -0
  179. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/kugou.py +0 -0
  180. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/linelive.py +0 -0
  181. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/livestream.py +0 -0
  182. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/lnk.py +0 -0
  183. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/lrt.py +0 -0
  184. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ltv_lsm_lv.py +0 -0
  185. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mdstrm.py +0 -0
  186. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mediaklikk.py +0 -0
  187. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mediavitrina.py +0 -0
  188. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mildom.py +0 -0
  189. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mitele.py +0 -0
  190. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mixcloud.py +0 -0
  191. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mjunoon.py +0 -0
  192. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/mrtmk.py +0 -0
  193. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/n13tv.py +0 -0
  194. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nasaplus.py +0 -0
  195. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nhkworld.py +0 -0
  196. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nicolive.py +0 -0
  197. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nimotv.py +0 -0
  198. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nos.py +0 -0
  199. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nownews.py +0 -0
  200. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nowtvtr.py +0 -0
  201. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/nrk.py +0 -0
  202. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/okru.py +0 -0
  203. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/olympicchannel.py +0 -0
  204. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/oneplusone.py +0 -0
  205. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/onetv.py +0 -0
  206. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/openrectv.py +0 -0
  207. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/pandalive.py +0 -0
  208. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/piaulizaportal.py +0 -0
  209. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/picarto.py +0 -0
  210. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/piczel.py +0 -0
  211. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/pixiv.py +0 -0
  212. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/pluzz.py +0 -0
  213. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/radiko.py +0 -0
  214. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/radionet.py +0 -0
  215. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/raiplay.py +0 -0
  216. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/reuters.py +0 -0
  217. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/rtpa.py +0 -0
  218. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/rtpplay.py +0 -0
  219. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/rtve.py +0 -0
  220. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/rtvs.py +0 -0
  221. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ruv.py +0 -0
  222. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/sbscokr.py +0 -0
  223. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/sportal.py +0 -0
  224. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/sportschau.py +0 -0
  225. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ssh101.py +0 -0
  226. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/stadium.py +0 -0
  227. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/steam.py +0 -0
  228. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/streamable.py +0 -0
  229. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/streann.py +0 -0
  230. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/stv.py +0 -0
  231. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/svtplay.py +0 -0
  232. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/swisstxt.py +0 -0
  233. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/telefe.py +0 -0
  234. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/telemadrid.py +0 -0
  235. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tf1.py +0 -0
  236. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/trovo.py +0 -0
  237. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/turkuvaz.py +0 -0
  238. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv360.py +0 -0
  239. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv3cat.py +0 -0
  240. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv4play.py +0 -0
  241. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv5monde.py +0 -0
  242. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv8.py +0 -0
  243. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tv999.py +0 -0
  244. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvibo.py +0 -0
  245. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tviplayer.py +0 -0
  246. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvp.py +0 -0
  247. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvrby.py +0 -0
  248. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvrplus.py +0 -0
  249. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/tvtoya.py +0 -0
  250. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/twitcasting.py +0 -0
  251. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ustreamtv.py +0 -0
  252. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/ustvnow.py +0 -0
  253. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vidio.py +0 -0
  254. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vimeo.py +0 -0
  255. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vinhlongtv.py +0 -0
  256. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vk.py +0 -0
  257. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/vtvgo.py +0 -0
  258. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/webtv.py +0 -0
  259. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/welt.py +0 -0
  260. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/wwenetwork.py +0 -0
  261. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/youtube.py +0 -0
  262. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/yupptv.py +0 -0
  263. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zattoo.py +0 -0
  264. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zdf_mediathek.py +0 -0
  265. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zeenews.py +0 -0
  266. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zengatv.py +0 -0
  267. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/plugins/zhanqi.py +0 -0
  268. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/py.typed +0 -0
  269. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/__init__.py +0 -0
  270. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/http.py +0 -0
  271. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/http.pyi +0 -0
  272. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/options.py +0 -0
  273. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/plugins.py +0 -0
  274. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/session/session.py +0 -0
  275. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/__init__.py +0 -0
  276. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/dash/__init__.py +0 -0
  277. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/dash/dash.py +0 -0
  278. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/dash/manifest.py +0 -0
  279. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/dash/segment.py +0 -0
  280. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/ffmpegmux.py +0 -0
  281. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/file.py +0 -0
  282. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/filtered.py +0 -0
  283. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/hls/__init__.py +0 -0
  284. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/hls/hls.py +0 -0
  285. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/hls/m3u8.py +0 -0
  286. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/hls/segment.py +0 -0
  287. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/http.py +0 -0
  288. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/segmented/__init__.py +0 -0
  289. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/segmented/concurrent.py +0 -0
  290. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/segmented/segment.py +0 -0
  291. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/segmented/segmented.py +0 -0
  292. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/stream.py +0 -0
  293. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/stream/wrappers.py +0 -0
  294. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/user_input.py +0 -0
  295. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/__init__.py +0 -0
  296. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/args.py +0 -0
  297. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/cache.py +0 -0
  298. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/crypto.py +0 -0
  299. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/data.py +0 -0
  300. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/formatter.py +0 -0
  301. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/l10n.py +0 -0
  302. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/module.py +0 -0
  303. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/named_pipe.py +0 -0
  304. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/parse.py +0 -0
  305. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/path.py +0 -0
  306. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/processoutput.py +0 -0
  307. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/random.py +0 -0
  308. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/socket.py +0 -0
  309. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/times.py +0 -0
  310. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/utils/url.py +0 -0
  311. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/__init__.py +0 -0
  312. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/__init__.py +0 -0
  313. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/client.py +0 -0
  314. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/connection.py +0 -0
  315. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/__init__.py +0 -0
  316. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/browser.py +0 -0
  317. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/debugger.py +0 -0
  318. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/dom.py +0 -0
  319. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/emulation.py +0 -0
  320. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/fetch.py +0 -0
  321. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/input_.py +0 -0
  322. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/inspector.py +0 -0
  323. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/io.py +0 -0
  324. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/network.py +0 -0
  325. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/page.py +0 -0
  326. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/runtime.py +0 -0
  327. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/security.py +0 -0
  328. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/target.py +0 -0
  329. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/devtools/util.py +0 -0
  330. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/cdp/exceptions.py +0 -0
  331. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/chromium.py +0 -0
  332. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink/webbrowser/exceptions.py +0 -0
  333. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/SOURCES.txt +0 -0
  334. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/dependency_links.txt +0 -0
  335. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/entry_points.txt +0 -0
  336. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/requires.txt +0 -0
  337. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink.egg-info/top_level.txt +0 -0
  338. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/__init__.py +0 -0
  339. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/__main__.py +0 -0
  340. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/_parser.py +0 -0
  341. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/argparser.py +0 -0
  342. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/compat.py +0 -0
  343. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/console.py +0 -0
  344. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/constants.py +0 -0
  345. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/main.py +0 -0
  346. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/__init__.py +0 -0
  347. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/abc.py +0 -0
  348. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/file.py +0 -0
  349. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/http.py +0 -0
  350. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/output/player.py +0 -0
  351. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/py.typed +0 -0
  352. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/streamrunner.py +0 -0
  353. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/__init__.py +0 -0
  354. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/player.py +0 -0
  355. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/progress.py +0 -0
  356. {streamlink-6.7.2 → streamlink-6.7.3}/src/streamlink_cli/utils/versioncheck.py +0 -0
  357. {streamlink-6.7.2 → streamlink-6.7.3}/tests/__init__.py +0 -0
  358. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/__init__.py +0 -0
  359. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/output/__init__.py +0 -0
  360. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/output/test_file.py +0 -0
  361. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/output/test_player.py +0 -0
  362. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_argparser.py +0 -0
  363. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_cmdline.py +0 -0
  364. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_cmdline_title.py +0 -0
  365. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_console.py +0 -0
  366. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main.py +0 -0
  367. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main_check_file_output.py +0 -0
  368. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main_formatter.py +0 -0
  369. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main_logging.py +0 -0
  370. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_main_setup_config_args.py +0 -0
  371. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_plugin_args_and_options.py +0 -0
  372. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/test_streamrunner.py +0 -0
  373. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/__init__.py +0 -0
  374. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/test_player.py +0 -0
  375. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/test_progress.py +0 -0
  376. {streamlink-6.7.2 → streamlink-6.7.3}/tests/cli/utils/test_versioncheck.py +0 -0
  377. {streamlink-6.7.2 → streamlink-6.7.3}/tests/conftest.py +0 -0
  378. {streamlink-6.7.2 → streamlink-6.7.3}/tests/mixins/__init__.py +0 -0
  379. {streamlink-6.7.2 → streamlink-6.7.3}/tests/mixins/stream_hls.py +0 -0
  380. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/__init__.py +0 -0
  381. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/override/testplugin.py +0 -0
  382. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/testplugin.py +0 -0
  383. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/testplugin_invalid.py +0 -0
  384. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugin/testplugin_missing.py +0 -0
  385. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/__init__.py +0 -0
  386. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/conftest.py +0 -0
  387. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_abematv.py +0 -0
  388. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_adultswim.py +0 -0
  389. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_afreeca.py +0 -0
  390. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_albavision.py +0 -0
  391. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_aloula.py +0 -0
  392. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_app17.py +0 -0
  393. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ard_live.py +0 -0
  394. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ard_mediathek.py +0 -0
  395. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_artetv.py +0 -0
  396. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_atpchallenger.py +0 -0
  397. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_atresplayer.py +0 -0
  398. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bbciplayer.py +0 -0
  399. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bfmtv.py +0 -0
  400. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bigo.py +0 -0
  401. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bilibili.py +0 -0
  402. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_blazetv.py +0 -0
  403. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_bloomberg.py +0 -0
  404. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_booyah.py +0 -0
  405. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_brightcove.py +0 -0
  406. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_btv.py +0 -0
  407. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cbsnews.py +0 -0
  408. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cdnbg.py +0 -0
  409. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ceskatelevize.py +0 -0
  410. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cinergroup.py +0 -0
  411. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_clubbingtv.py +0 -0
  412. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cmmedia.py +0 -0
  413. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_cnews.py +0 -0
  414. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_crunchyroll.py +0 -0
  415. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dailymotion.py +0 -0
  416. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dash.py +0 -0
  417. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_delfi.py +0 -0
  418. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_deutschewelle.py +0 -0
  419. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dlive.py +0 -0
  420. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dogan.py +0 -0
  421. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_dogus.py +0 -0
  422. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_drdk.py +0 -0
  423. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_earthcam.py +0 -0
  424. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_euronews.py +0 -0
  425. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_facebook.py +0 -0
  426. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_filmon.py +0 -0
  427. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_galatasaraytv.py +0 -0
  428. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_goltelevision.py +0 -0
  429. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_goodgame.py +0 -0
  430. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_googledrive.py +0 -0
  431. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_gulli.py +0 -0
  432. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_hiplayer.py +0 -0
  433. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_hls.py +0 -0
  434. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_http.py +0 -0
  435. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_htv.py +0 -0
  436. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_huajiao.py +0 -0
  437. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_huya.py +0 -0
  438. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_idf1.py +0 -0
  439. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_indihometv.py +0 -0
  440. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_invintus.py +0 -0
  441. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_kugou.py +0 -0
  442. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_linelive.py +0 -0
  443. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_livestream.py +0 -0
  444. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_lnk.py +0 -0
  445. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_lrt.py +0 -0
  446. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ltv_lsm_lv.py +0 -0
  447. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mdstrm.py +0 -0
  448. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mediaklikk.py +0 -0
  449. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mediavitrina.py +0 -0
  450. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mildom.py +0 -0
  451. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mitele.py +0 -0
  452. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mixcloud.py +0 -0
  453. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mjunoon.py +0 -0
  454. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_mrtmk.py +0 -0
  455. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_n13tv.py +0 -0
  456. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nasaplus.py +0 -0
  457. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nhkworld.py +0 -0
  458. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nicolive.py +0 -0
  459. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nimotv.py +0 -0
  460. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nos.py +0 -0
  461. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nownews.py +0 -0
  462. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nowtvtr.py +0 -0
  463. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_nrk.py +0 -0
  464. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_okru.py +0 -0
  465. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_olympicchannel.py +0 -0
  466. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_oneplusone.py +0 -0
  467. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_onetv.py +0 -0
  468. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_openrectv.py +0 -0
  469. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_pandalive.py +0 -0
  470. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_piaulizaportal.py +0 -0
  471. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_picarto.py +0 -0
  472. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_piczel.py +0 -0
  473. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_pixiv.py +0 -0
  474. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_pluzz.py +0 -0
  475. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_radiko.py +0 -0
  476. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_radionet.py +0 -0
  477. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_raiplay.py +0 -0
  478. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_reuters.py +0 -0
  479. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_rtpa.py +0 -0
  480. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_rtpplay.py +0 -0
  481. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_rtve.py +0 -0
  482. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_rtvs.py +0 -0
  483. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ruv.py +0 -0
  484. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_sbscokr.py +0 -0
  485. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_showroom.py +0 -0
  486. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_sportal.py +0 -0
  487. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_sportschau.py +0 -0
  488. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ssh101.py +0 -0
  489. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_stadium.py +0 -0
  490. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_steam.py +0 -0
  491. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_streamable.py +0 -0
  492. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_streann.py +0 -0
  493. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_stv.py +0 -0
  494. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_svtplay.py +0 -0
  495. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_swisstxt.py +0 -0
  496. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_telefe.py +0 -0
  497. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_telemadrid.py +0 -0
  498. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tf1.py +0 -0
  499. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_trovo.py +0 -0
  500. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_turkuvaz.py +0 -0
  501. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv360.py +0 -0
  502. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv3cat.py +0 -0
  503. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv4play.py +0 -0
  504. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv5monde.py +0 -0
  505. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv8.py +0 -0
  506. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tv999.py +0 -0
  507. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvibo.py +0 -0
  508. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tviplayer.py +0 -0
  509. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvp.py +0 -0
  510. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvrby.py +0 -0
  511. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvrplus.py +0 -0
  512. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_tvtoya.py +0 -0
  513. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_twitcasting.py +0 -0
  514. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_twitch.py +0 -0
  515. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ustreamtv.py +0 -0
  516. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_ustvnow.py +0 -0
  517. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vidio.py +0 -0
  518. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vimeo.py +0 -0
  519. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vinhlongtv.py +0 -0
  520. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vk.py +0 -0
  521. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_vtvgo.py +0 -0
  522. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_webtv.py +0 -0
  523. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_welt.py +0 -0
  524. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_wwenetwork.py +0 -0
  525. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_youtube.py +0 -0
  526. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_yupptv.py +0 -0
  527. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zattoo.py +0 -0
  528. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zdf_mediathek.py +0 -0
  529. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zeenews.py +0 -0
  530. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zengatv.py +0 -0
  531. {streamlink-6.7.2 → streamlink-6.7.3}/tests/plugins/test_zhanqi.py +0 -0
  532. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/__init__.py +0 -0
  533. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/custom +0 -0
  534. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/primary +0 -0
  535. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/primary.testplugin +0 -0
  536. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/secondary +0 -0
  537. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/cli/config/secondary.testplugin +0 -0
  538. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_1.mpd +0 -0
  539. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_10.mpd +0 -0
  540. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_11_static.mpd +0 -0
  541. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_2.mpd +0 -0
  542. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_3.mpd +0 -0
  543. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_8.mpd +0 -0
  544. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_9.mpd +0 -0
  545. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_no_duration.mpd +0 -0
  546. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p1.mpd +0 -0
  547. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p2.mpd +0 -0
  548. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p3.mpd +0 -0
  549. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p4.mpd +0 -0
  550. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_segment_list_p5.mpd +0 -0
  551. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_timeline_continued_p1.mpd +0 -0
  552. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_dynamic_timeline_continued_p2.mpd +0 -0
  553. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_nested_baseurls.mpd +0 -0
  554. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_no_segment_list_or_template.mpd +0 -0
  555. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_segment_list.mpd +0 -0
  556. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_segments_byterange.mpd +0 -0
  557. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_segments_dynamic_number.mpd +0 -0
  558. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_static_no_publish_time.mpd +0 -0
  559. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_suggested_presentation_delay.mpd +0 -0
  560. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/dash/test_timeline_ids.mpd +0 -0
  561. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_1.m3u8 +0 -0
  562. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_2.m3u8 +0 -0
  563. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_date.m3u8 +0 -0
  564. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_master.m3u8 +0 -0
  565. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_master_twitch_vod.m3u8 +0 -0
  566. {streamlink-6.7.2 → streamlink-6.7.3}/tests/resources/hls/test_multivariant_bandwidth.m3u8 +0 -0
  567. {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/__init__.py +0 -0
  568. {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/test_http.py +0 -0
  569. {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/test_options.py +0 -0
  570. {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/test_plugins.py +0 -0
  571. {streamlink-6.7.2 → streamlink-6.7.3}/tests/session/test_session.py +0 -0
  572. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/__init__.py +0 -0
  573. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/dash/__init__.py +0 -0
  574. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/dash/test_dash.py +0 -0
  575. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/dash/test_manifest.py +0 -0
  576. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/hls/__init__.py +0 -0
  577. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/hls/test_hls.py +0 -0
  578. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/hls/test_hls_filtered.py +0 -0
  579. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/hls/test_m3u8.py +0 -0
  580. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_ffmpegmux.py +0 -0
  581. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_file.py +0 -0
  582. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_segmented.py +0 -0
  583. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_stream_json.py +0 -0
  584. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_stream_to_url.py +0 -0
  585. {streamlink-6.7.2 → streamlink-6.7.3}/tests/stream/test_stream_wrappers.py +0 -0
  586. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_api_websocket.py +0 -0
  587. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_buffers.py +0 -0
  588. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_cache.py +0 -0
  589. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_compat.py +0 -0
  590. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_logger.py +0 -0
  591. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_options.py +0 -0
  592. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_plugin.py +0 -0
  593. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_plugin_userinput.py +0 -0
  594. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_plugins.py +0 -0
  595. {streamlink-6.7.2 → streamlink-6.7.3}/tests/test_streamlink_api.py +0 -0
  596. {streamlink-6.7.2 → streamlink-6.7.3}/tests/testutils/__init__.py +0 -0
  597. {streamlink-6.7.2 → streamlink-6.7.3}/tests/testutils/handshake.py +0 -0
  598. {streamlink-6.7.2 → streamlink-6.7.3}/tests/testutils/test_handshake.py +0 -0
  599. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/__init__.py +0 -0
  600. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_args.py +0 -0
  601. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_cache.py +0 -0
  602. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_crypto.py +0 -0
  603. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_data.py +0 -0
  604. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_formatter.py +0 -0
  605. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_l10n.py +0 -0
  606. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_module.py +0 -0
  607. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_named_pipe.py +0 -0
  608. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_parse.py +0 -0
  609. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_path.py +0 -0
  610. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_processoutput.py +0 -0
  611. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_random.py +0 -0
  612. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_times.py +0 -0
  613. {streamlink-6.7.2 → streamlink-6.7.3}/tests/utils/test_url.py +0 -0
  614. {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/__init__.py +0 -0
  615. {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/cdp/__init__.py +0 -0
  616. {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/cdp/conftest.py +0 -0
  617. {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/cdp/test_client.py +0 -0
  618. {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/cdp/test_connection.py +0 -0
  619. {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/conftest.py +0 -0
  620. {streamlink-6.7.2 → streamlink-6.7.3}/tests/webbrowser/test_chromium.py +0 -0
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## streamlink 6.7.3 (2024-04-14)
4
+
5
+ Patch release:
6
+
7
+ - Fixed: file output paths being able to exceed max file/directory name length ([#5921](https://github.com/streamlink/streamlink/pull/5921), [#5925](https://github.com/streamlink/streamlink/pull/5925))
8
+ - Fixed: propagation of `KeyboardInterrupt`/`SystemExit` in `streamlink.webbrowser` ([#5930](https://github.com/streamlink/streamlink/pull/5930))
9
+ - Fixed: compatibility with `exceptiongroup<=1.1.1` ([#5930](https://github.com/streamlink/streamlink/pull/5930))
10
+ - Fixed: `plugin.api.validate.parse_qsd` input type validation ([#5932](https://github.com/streamlink/streamlink/pull/5932))
11
+ - Updated plugins:
12
+ - mangomolo: fixed missing referer header and updated URL matcher ([#5923](https://github.com/streamlink/streamlink/pull/5923), [#5926](https://github.com/streamlink/streamlink/pull/5926))
13
+ - pluto: rewritten plugin ([#5910](https://github.com/streamlink/streamlink/pull/5910))
14
+ - showroom: fixed geo-block check preventing stream access ([#5911](https://github.com/streamlink/streamlink/pull/5911))
15
+ - vkplay: updated URL matcher ([#5908](https://github.com/streamlink/streamlink/pull/5908))
16
+ - Tests: fixed test failure when running tests from the `bdist` build directory ([#5933](https://github.com/streamlink/streamlink/pull/5933))
17
+
18
+ [Full changelog](https://github.com/streamlink/streamlink/compare/6.7.2...6.7.3)
19
+
20
+
3
21
  ## streamlink 6.7.2 (2024-03-23)
4
22
 
5
23
  Patch release:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: streamlink
3
- Version: 6.7.2
3
+ Version: 6.7.3
4
4
  Summary: Streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of choice.
5
5
  Author: Streamlink
6
6
  Author-email: streamlink@protonmail.com
@@ -38,7 +38,13 @@ def build(request: pytest.FixtureRequest, tmp_path: Path, template_fields: dict)
38
38
  (pkg_dir / "streamlink").mkdir(parents=True)
39
39
  shutil.copy(PROJECT_ROOT / "pyproject.toml", tmp_path / "pyproject.toml")
40
40
  shutil.copy(PROJECT_ROOT / "setup.py", tmp_path / "setup.py")
41
- shutil.copy(PROJECT_ROOT / "src" / "streamlink" / "_version.py", pkg_dir / "streamlink" / "_version.py")
41
+
42
+ # Lookup for the path from the root source directory
43
+ if Path(PROJECT_ROOT / "src" / "streamlink" / "_version.py").exists():
44
+ shutil.copy(PROJECT_ROOT / "src" / "streamlink" / "_version.py", pkg_dir / "streamlink" / "_version.py")
45
+ else: # pragma: no cover
46
+ # We didn't find it, use the build location
47
+ shutil.copy(PROJECT_ROOT / "streamlink" / "_version.py", pkg_dir / "streamlink" / "_version.py")
42
48
 
43
49
  options = dict(
44
50
  is_source=is_source,
@@ -15,10 +15,10 @@ pytest-cov
15
15
  coverage[toml]
16
16
 
17
17
  # code-linting
18
- ruff ==0.3.2
18
+ ruff ==0.3.7
19
19
 
20
20
  # typing
21
- mypy ==1.8.0
21
+ mypy ==1.9.0
22
22
  lxml-stubs
23
23
  trio-typing
24
24
  types-freezegun
@@ -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" "Mar 23, 2024" "6.7.2" "Streamlink"
30
+ .TH "STREAMLINK" "1" "Apr 14, 2024" "6.7.3" "Streamlink"
31
31
  .SH NAME
32
32
  streamlink \- extracts streams from various services and pipes them into a video player of choice
33
33
  .SH SYNOPSIS
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## streamlink 6.7.3 (2024-04-14)
4
+
5
+ Patch release:
6
+
7
+ - Fixed: file output paths being able to exceed max file/directory name length ([#5921](https://github.com/streamlink/streamlink/pull/5921), [#5925](https://github.com/streamlink/streamlink/pull/5925))
8
+ - Fixed: propagation of `KeyboardInterrupt`/`SystemExit` in `streamlink.webbrowser` ([#5930](https://github.com/streamlink/streamlink/pull/5930))
9
+ - Fixed: compatibility with `exceptiongroup<=1.1.1` ([#5930](https://github.com/streamlink/streamlink/pull/5930))
10
+ - Fixed: `plugin.api.validate.parse_qsd` input type validation ([#5932](https://github.com/streamlink/streamlink/pull/5932))
11
+ - Updated plugins:
12
+ - mangomolo: fixed missing referer header and updated URL matcher ([#5923](https://github.com/streamlink/streamlink/pull/5923), [#5926](https://github.com/streamlink/streamlink/pull/5926))
13
+ - pluto: rewritten plugin ([#5910](https://github.com/streamlink/streamlink/pull/5910))
14
+ - showroom: fixed geo-block check preventing stream access ([#5911](https://github.com/streamlink/streamlink/pull/5911))
15
+ - vkplay: updated URL matcher ([#5908](https://github.com/streamlink/streamlink/pull/5908))
16
+ - Tests: fixed test failure when running tests from the `bdist` build directory ([#5933](https://github.com/streamlink/streamlink/pull/5933))
17
+
18
+ [Full changelog](https://github.com/streamlink/streamlink/compare/6.7.2...6.7.3)
19
+
20
+
3
21
  ## streamlink 6.7.2 (2024-03-23)
4
22
 
5
23
  Patch release:
@@ -262,7 +262,7 @@ Package availability
262
262
  --------------------
263
263
 
264
264
  Packaging is not done by the Streamlink maintainers themselves except for
265
- the `PyPI package <PyPI package and source code_>`_,
265
+ the `PyPI package <pypi-package-and-source-code_>`_,
266
266
  the `Windows installers + portable builds <Windows binaries_>`_,
267
267
  and the `Linux AppImages <Linux AppImages_>`_.
268
268
 
@@ -90,5 +90,5 @@ if __name__ == "__main__":
90
90
  cmdclass=get_cmdclasses(cmdclass),
91
91
  entry_points=entry_points,
92
92
  data_files=data_files,
93
- version="6.7.2",
93
+ version="6.7.3",
94
94
  )
@@ -0,0 +1 @@
1
+ __version__ = "6.7.3"
@@ -1,11 +1,11 @@
1
- ANDROID = "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.90 Mobile Safari/537.36"
2
- CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
1
+ ANDROID = "Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.80 Mobile Safari/537.36"
2
+ CHROME = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
3
3
  CHROME_OS = "Mozilla/5.0 (X11; CrOS x86_64 15633.69.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.212 Safari/537.36"
4
- FIREFOX = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0"
4
+ FIREFOX = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0"
5
5
  IE_11 = "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
6
- IPHONE = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Mobile/15E148 Safari/604.1"
7
- OPERA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 OPR/108.0.0.0"
8
- SAFARI = "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Safari/605.1.15"
6
+ IPHONE = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Mobile/15E148 Safari/604.1"
7
+ OPERA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0"
8
+ SAFARI = "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Safari/605.1.15"
9
9
 
10
10
  # Backwards compatibility
11
11
  EDGE = CHROME
@@ -651,4 +651,8 @@ def validator_parse_qsd(*args, **kwargs) -> TransformSchema:
651
651
  :raise ValidationError: On parsing error
652
652
  """
653
653
 
654
- return TransformSchema(_parse_qsd, *args, **kwargs, exception=ValidationError, schema=None)
654
+ def parser(*_args, **_kwargs):
655
+ validate(AnySchema(str, bytes), _args[0])
656
+ return _parse_qsd(*_args, **_kwargs, exception=ValidationError, schema=None)
657
+
658
+ return TransformSchema(parser, *args, **kwargs)
@@ -1,5 +1,6 @@
1
1
  """
2
2
  $description OTT video platform owned by Alpha Technology Group
3
+ $url player.mangomolo.com
3
4
  $url media.gov.kw
4
5
  $type live
5
6
  """
@@ -23,7 +24,7 @@ log = logging.getLogger(__name__)
23
24
  )
24
25
  @pluginmatcher(
25
26
  name="mediagovkw",
26
- pattern=re.compile(r"https?://media\.gov\.kw/"),
27
+ pattern=re.compile(r"https?://(www\.)?media\.gov\.kw/"),
27
28
  )
28
29
  class Mangomolo(Plugin):
29
30
  def _get_player_url(self):
@@ -38,10 +39,12 @@ class Mangomolo(Plugin):
38
39
  self.url = update_scheme("https://", player_url)
39
40
 
40
41
  def _get_streams(self):
42
+ headers = {}
41
43
  if not self.matches["mangomoloplayer"]:
44
+ headers["Referer"] = self.url
42
45
  self._get_player_url()
43
46
 
44
- hls_url = self.session.http.get(self.url, schema=validate.Schema(
47
+ hls_url = self.session.http.get(self.url, headers=headers, schema=validate.Schema(
45
48
  re.compile(r"src\s*:\s*(?P<q>[\"'])(?P<url>https?://\S+?\.m3u8\S*?)(?P=q)"),
46
49
  validate.none_or_all(validate.get("url")),
47
50
  ))
@@ -0,0 +1,230 @@
1
+ """
2
+ $description Live TV and video on-demand service owned by Paramount Streaming.
3
+ $url pluto.tv
4
+ $type live, vod
5
+ $metadata id
6
+ $metadata author
7
+ $metadata category
8
+ $metadata title
9
+ """
10
+
11
+ import logging
12
+ import re
13
+ from urllib.parse import parse_qsl, urljoin
14
+ from uuid import uuid4
15
+
16
+ from streamlink.exceptions import PluginError
17
+ from streamlink.plugin import Plugin, pluginmatcher
18
+ from streamlink.plugin.api import useragents, validate
19
+ from streamlink.stream.hls import HLSStream, HLSStreamReader, HLSStreamWriter
20
+ from streamlink.utils.url import update_qsd
21
+
22
+
23
+ log = logging.getLogger(__name__)
24
+
25
+
26
+ class PlutoHLSStreamWriter(HLSStreamWriter):
27
+ ad_re = re.compile(r"_ad/creative/|creative/\d+_ad/|dai\.google\.com|Pluto_TV_OandO/.*(Bumper|plutotv_filler)")
28
+
29
+ def should_filter_segment(self, segment):
30
+ return self.ad_re.search(segment.uri) is not None or super().should_filter_segment(segment)
31
+
32
+
33
+ class PlutoHLSStreamReader(HLSStreamReader):
34
+ __writer__ = PlutoHLSStreamWriter
35
+
36
+
37
+ class PlutoHLSStream(HLSStream):
38
+ __shortname__ = "hls-pluto"
39
+ __reader__ = PlutoHLSStreamReader
40
+
41
+
42
+ @pluginmatcher(
43
+ name="live",
44
+ pattern=re.compile(
45
+ r"https?://(?:www\.)?pluto\.tv/(?:\w{2}/)?live-tv/(?P<id>[^/]+)/?$",
46
+ ),
47
+ )
48
+ @pluginmatcher(
49
+ name="series",
50
+ pattern=re.compile(
51
+ r"https?://(?:www\.)?pluto\.tv/(?:\w{2}/)?on-demand/series/(?P<id_s>[^/]+)(?:/season/\d+)?/episode/(?P<id_e>[^/]+)/?$",
52
+ ),
53
+ )
54
+ @pluginmatcher(
55
+ name="movies",
56
+ pattern=re.compile(
57
+ r"https?://(?:www\.)?pluto\.tv/(?:\w{2}/)?on-demand/movies/(?P<id>[^/]+)/?$",
58
+ ),
59
+ )
60
+ class Pluto(Plugin):
61
+ def __init__(self, *args, **kwargs):
62
+ super().__init__(*args, **kwargs)
63
+ self.session.http.headers.update({"User-Agent": useragents.FIREFOX})
64
+ self._app_version = None
65
+ self._device_version = re.search(r"Firefox/(\d+(?:\.\d+)*)", useragents.FIREFOX)[1]
66
+ self._client_id = str(uuid4())
67
+
68
+ @property
69
+ def app_version(self):
70
+ if self._app_version:
71
+ return self._app_version
72
+
73
+ self._app_version = self.session.http.get(
74
+ self.url,
75
+ schema=validate.Schema(
76
+ validate.parse_html(),
77
+ validate.xml_xpath_string(".//head/meta[@name='appVersion']/@content"),
78
+ validate.any(None, str),
79
+ ),
80
+ )
81
+ if not self._app_version:
82
+ raise PluginError("Could not find pluto app version")
83
+
84
+ log.debug(f"{self._app_version=}")
85
+
86
+ return self._app_version
87
+
88
+ def _get_api_data(self, request):
89
+ log.debug(f"_get_api_data: {request=}")
90
+
91
+ schema_paths = validate.any(
92
+ validate.all(
93
+ {
94
+ "paths": [
95
+ validate.all(
96
+ {
97
+ "type": str,
98
+ "path": str,
99
+ },
100
+ validate.union_get("type", "path"),
101
+ ),
102
+ ],
103
+ },
104
+ validate.get("paths"),
105
+ ),
106
+ validate.all(
107
+ {
108
+ "path": str,
109
+ },
110
+ validate.transform(lambda obj: [("hls", obj["path"])]),
111
+ ),
112
+ )
113
+ schema_live = [{
114
+ "name": str,
115
+ "id": str,
116
+ "slug": str,
117
+ "stitched": schema_paths,
118
+ }]
119
+ schema_vod = [{
120
+ "name": str,
121
+ "id": str,
122
+ "slug": str,
123
+ "genre": str,
124
+ "stitched": validate.any(schema_paths, {}),
125
+ validate.optional("seasons"): [{
126
+ "episodes": [{
127
+ "name": str,
128
+ "_id": str,
129
+ "slug": str,
130
+ "stitched": schema_paths,
131
+ }],
132
+ }],
133
+ }]
134
+
135
+ return self.session.http.get(
136
+ "https://boot.pluto.tv/v4/start",
137
+ params={
138
+ "appName": "web",
139
+ "appVersion": self.app_version,
140
+ "deviceVersion": self._device_version,
141
+ "deviceModel": "web",
142
+ "deviceMake": "firefox",
143
+ "deviceType": "web",
144
+ "clientID": self._client_id,
145
+ "clientModelNumber": "1.0.0",
146
+ **request,
147
+ },
148
+ schema=validate.Schema(
149
+ validate.parse_json(),
150
+ {
151
+ "servers": {
152
+ "stitcher": validate.url(),
153
+ },
154
+ "stitcherParams": str,
155
+ "sessionToken": str,
156
+ validate.optional("EPG"): schema_live,
157
+ validate.optional("VOD"): schema_vod,
158
+ },
159
+ ),
160
+ )
161
+
162
+ def _get_streams_live(self):
163
+ data = self._get_api_data({"channelSlug": self.match["id"]})
164
+ epg = data.get("EPG", [])
165
+ media = next((e for e in epg if e["id"] == self.match["id"]), None)
166
+ if not media:
167
+ return
168
+
169
+ self.id = media["id"]
170
+ self.title = media["name"]
171
+
172
+ return data, media["stitched"]
173
+
174
+ def _get_streams_series(self):
175
+ data = self._get_api_data({"seriesIDs": self.match["id_s"]})
176
+ vod = data.get("VOD", [])
177
+ media = next((v for v in vod if v["id"] == self.match["id_s"]), None)
178
+ if not media:
179
+ return
180
+ seasons = media.get("seasons", [])
181
+ episode = next((e for s in seasons for e in s["episodes"] if e["_id"] == self.match["id_e"]), None)
182
+ if not episode:
183
+ return
184
+
185
+ self.id = episode["_id"]
186
+ self.author = media["name"]
187
+ self.category = media["genre"]
188
+ self.title = episode["name"]
189
+
190
+ return data, episode["stitched"]
191
+
192
+ def _get_streams_movies(self):
193
+ data = self._get_api_data({"seriesIDs": self.match["id"]})
194
+ vod = data.get("VOD", [])
195
+ media = next((v for v in vod if v["id"] == self.match["id"]), None)
196
+ if not media:
197
+ return
198
+
199
+ self.id = media["id"]
200
+ self.category = media["genre"]
201
+ self.title = media["name"]
202
+
203
+ return data, media["stitched"]
204
+
205
+ def _get_streams(self):
206
+ res = None
207
+ if self.matches["live"]:
208
+ res = self._get_streams_live()
209
+ elif self.matches["series"]:
210
+ res = self._get_streams_series()
211
+ elif self.matches["movies"]:
212
+ res = self._get_streams_movies()
213
+
214
+ if not res:
215
+ return
216
+
217
+ data, paths = res
218
+ for mediatype, path in paths:
219
+ if mediatype != "hls":
220
+ continue
221
+
222
+ params = dict(parse_qsl(data["stitcherParams"]))
223
+ params["jwt"] = data["sessionToken"]
224
+ url = urljoin(data["servers"]["stitcher"], path)
225
+ url = update_qsd(url, params)
226
+
227
+ return PlutoHLSStream.parse_variant_playlist(self.session, url)
228
+
229
+
230
+ __plugin__ = Pluto
@@ -84,7 +84,7 @@ class Showroom(Plugin):
84
84
  )
85
85
 
86
86
  res = self.session.http.get(url, acceptable_status=(200, 403, 404))
87
- if res.headers["Content-Type"] != "application/x-mpegURL":
87
+ if res.headers["Content-Type"] not in ("application/x-mpegURL", "application/vnd.apple.mpegurl"):
88
88
  log.error("This stream is restricted")
89
89
  return
90
90
 
@@ -541,7 +541,7 @@ class TwitchClientIntegrity:
541
541
  headers: Mapping[str, str],
542
542
  device_id: str,
543
543
  ) -> Optional[Tuple[str, int]]:
544
- from exceptiongroup import BaseExceptionGroup, catch # noqa: PLC0415, I001
544
+ from exceptiongroup import BaseExceptionGroup # noqa: PLC0415, I001
545
545
  from streamlink.webbrowser.cdp import CDPClient, CDPClientSession, devtools # noqa: PLC0415
546
546
 
547
547
  url = f"https://www.twitch.tv/{channel}"
@@ -565,19 +565,17 @@ class TwitchClientIntegrity:
565
565
  await client_session.loaded(frame_id)
566
566
  return await client_session.evaluate(js_get_integrity_token, timeout=eval_timeout)
567
567
 
568
- def handle_error(exc_grp: BaseExceptionGroup) -> None:
569
- for err in exc_grp.exceptions:
570
- log.error(f"{type(err).__name__}: {err}")
571
-
572
- with catch({ # type: ignore[dict-item] # bug in exceptiongroup==1.2.0
573
- Exception: handle_error, # type: ignore[dict-item] # bug in exceptiongroup==1.2.0
574
- }):
568
+ try:
575
569
  client_integrity = CDPClient.launch(
576
570
  session,
577
571
  acquire_client_integrity_token,
578
572
  # headless mode gets detected by Twitch, so we have to disable it regardless the user config
579
573
  headless=False,
580
574
  )
575
+ except BaseExceptionGroup:
576
+ log.exception("Failed acquiring client integrity token")
577
+ except Exception as err:
578
+ log.error(err)
581
579
 
582
580
  if not client_integrity:
583
581
  return None
@@ -1,6 +1,6 @@
1
1
  """
2
2
  $description Russian live-streaming platform for gaming and esports, owned by VKontakte.
3
- $url vkplay.live
3
+ $url live.vkplay.ru
4
4
  $type live
5
5
  $metadata id
6
6
  $metadata author
@@ -20,13 +20,13 @@ log = logging.getLogger(__name__)
20
20
 
21
21
 
22
22
  @pluginmatcher(re.compile(
23
- r"https?://vkplay\.live/(?P<channel_name>\w+)/?$",
23
+ r"https?://(?:live\.vkplay\.ru|vkplay\.live)/(?P<channel_name>\w+)/?$",
24
24
  ))
25
25
  class VKplay(Plugin):
26
- API_URL = "https://api.vkplay.live/v1"
26
+ API_URL = "https://api.live.vkplay.ru/v1"
27
27
 
28
28
  def _get_streams(self):
29
- self.author = self.match.group("channel_name")
29
+ self.author = self.match["channel_name"]
30
30
  log.debug(f"Channel name: {self.author}")
31
31
 
32
32
  data = self.session.http.get(
@@ -8,7 +8,7 @@ from subprocess import DEVNULL
8
8
  from typing import AsyncContextManager, AsyncGenerator, Generator, List, Optional, Union
9
9
 
10
10
  import trio
11
- from exceptiongroup import BaseExceptionGroup, catch
11
+ from exceptiongroup import BaseExceptionGroup
12
12
 
13
13
  from streamlink.utils.path import resolve_executable
14
14
  from streamlink.webbrowser.exceptions import WebbrowserError
@@ -80,12 +80,7 @@ class _WebbrowserLauncher:
80
80
 
81
81
  @asynccontextmanager
82
82
  async def launch(self) -> AsyncGenerator[trio.Nursery, None]:
83
- def handle_baseexception(exc_grp: BaseExceptionGroup) -> None:
84
- raise exc_grp.exceptions[0] from exc_grp.exceptions[0].__context__
85
-
86
- with catch({ # type: ignore[dict-item] # bug in exceptiongroup==1.2.0
87
- (KeyboardInterrupt, SystemExit): handle_baseexception, # type: ignore[dict-item] # bug in exceptiongroup==1.2.0
88
- }):
83
+ try:
89
84
  async with trio.open_nursery() as nursery:
90
85
  log.info(f"Launching web browser: {self.executable}")
91
86
  # the process is run in a separate task
@@ -113,6 +108,13 @@ class _WebbrowserLauncher:
113
108
  log.debug("Waiting for web browser process to terminate")
114
109
  # once the application logic is done, cancel the entire task group and terminate/kill the process
115
110
  nursery.cancel_scope.cancel()
111
+ except BaseExceptionGroup as exc_grp: # TODO: py310 support end: use except*
112
+ exc: Union[BaseException, BaseExceptionGroup, None] = exc_grp.subgroup((KeyboardInterrupt, SystemExit))
113
+ if not exc: # not a KeyboardInterrupt or SystemExit
114
+ raise
115
+ while isinstance(exc, BaseExceptionGroup): # get the first actual exception in the potentially nested groups
116
+ exc = exc.exceptions[0]
117
+ raise exc from exc.__context__
116
118
 
117
119
  async def _task_process_watcher(self, process: trio.Process, nursery: trio.Nursery) -> None:
118
120
  """Task for cancelling the launch task group if the user closes the browser or if it exits early on its own"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: streamlink
3
- Version: 6.7.2
3
+ Version: 6.7.3
4
4
  Summary: Streamlink is a command-line utility that extracts streams from various services and pipes them into a video player of choice.
5
5
  Author: Streamlink
6
6
  Author-email: streamlink@protonmail.com
@@ -2,17 +2,18 @@ from pathlib import Path
2
2
  from typing import Optional
3
3
 
4
4
  from streamlink.utils.formatter import Formatter as _BaseFormatter
5
- from streamlink_cli.utils.path import replace_chars, replace_path
5
+ from streamlink_cli.utils.path import replace_chars, replace_path, truncate_path
6
6
 
7
7
 
8
8
  class Formatter(_BaseFormatter):
9
9
  title = _BaseFormatter.format
10
10
 
11
- def path(self, pathlike: str, charmap: Optional[str] = None) -> Path:
11
+ def path(self, pathlike: str, charmap: Optional[str] = None, max_filename_length: int = 255) -> Path:
12
12
  def mapper(s):
13
13
  return replace_chars(s, charmap)
14
14
 
15
- def format_part(part):
16
- return self._format(part, mapper, {})
15
+ def format_part(part: str, isfile: bool) -> str:
16
+ formatted = self._format(part, mapper, {})
17
+ return truncate_path(formatted, max_filename_length, keep_extension=isfile)
17
18
 
18
19
  return replace_path(pathlike, format_part)
@@ -35,9 +35,31 @@ def replace_chars(path: str, charmap: Optional[str] = None, replacement: str = R
35
35
  return pattern.sub(replacement, path)
36
36
 
37
37
 
38
- def replace_path(pathlike: Union[str, Path], mapper: Callable[[str], str]) -> Path:
39
- def get_part(part):
40
- newpart = mapper(part)
38
+ # This method does not take care of unicode modifier characters when truncating
39
+ def truncate_path(path: str, length: int = 255, keep_extension: bool = True) -> str:
40
+ parts = path.rsplit(".", 1)
41
+
42
+ # no file name extension (no dot separator in path or file name extension too long):
43
+ # truncate the whole thing
44
+ if not keep_extension or len(parts) == 1 or len(parts[1]) > 10:
45
+ encoded = path.encode("utf-8")
46
+ truncated = encoded[:length]
47
+ decoded = truncated.decode("utf-8", errors="ignore")
48
+ return decoded
49
+
50
+ # truncate file name, but keep file name extension
51
+ encoded = parts[0].encode("utf-8")
52
+ truncated = encoded[:length - len(parts[1]) - 1]
53
+ decoded = truncated.decode("utf-8", errors="ignore")
54
+ return f"{decoded}.{parts[1]}"
55
+
56
+
57
+ def replace_path(pathlike: Union[str, Path], mapper: Callable[[str, bool], str]) -> Path:
58
+ def get_part(part: str, isfile: bool) -> str:
59
+ newpart = mapper(part, isfile)
41
60
  return REPLACEMENT if part != newpart and newpart in SPECIAL_PATH_PARTS else newpart
42
61
 
43
- return Path(*(get_part(part) for part in Path(pathlike).expanduser().parts))
62
+ parts = Path(pathlike).expanduser().parts
63
+ last = len(parts) - 1
64
+
65
+ return Path(*(get_part(part, i == last) for i, part in enumerate(parts)))
@@ -1,6 +1,7 @@
1
1
  from datetime import datetime
2
2
  from os.path import sep
3
3
  from pathlib import Path
4
+ from string import ascii_letters as alphabet
4
5
  from unittest.mock import Mock, call, patch
5
6
 
6
7
  import pytest
@@ -79,3 +80,19 @@ class TestCLIFormatter:
79
80
  path = formatter.path(f"{{current}}{sep}{{parent}}{sep}{{dots}}{sep}{{separator}}{sep}foo{sep}.{sep}..{sep}bar")
80
81
  assert path == Path("_", "_", "...", "_", "foo", ".", "..", "bar"), \
81
82
  "Formats the path's parts separately and ignores current and parent directories in substitutions only"
83
+
84
+ def test_path_truncation_ascii(self, formatter: Formatter):
85
+ formatter.mapping.update({
86
+ "dir": lambda: alphabet * 10,
87
+ "file": lambda: alphabet * 10,
88
+ })
89
+ path = formatter.path(f"{{dir}}.fakeext{sep}{{file}}.ext")
90
+ assert path == Path((alphabet * 10)[:255], f"{(alphabet * 10)[:251]}.ext")
91
+
92
+ def test_path_truncation_unicode(self, formatter: Formatter):
93
+ formatter.mapping.update({
94
+ "dir": lambda: "🐻" * 512,
95
+ "file": lambda: "🐻" * 512,
96
+ })
97
+ path = formatter.path(f"{{dir}}.fakeext{sep}{{file}}.ext")
98
+ assert path == Path("🐻" * 63, f"{'🐻' * 62}.ext")