subliminal 2.6.0__tar.gz → 2.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. {subliminal-2.6.0 → subliminal-2.7.0}/.github/actions/prepare-tests/action.yaml +4 -4
  2. {subliminal-2.6.0 → subliminal-2.7.0}/.github/workflows/CI.yaml +23 -23
  3. {subliminal-2.6.0 → subliminal-2.7.0}/.github/workflows/docker-build.yaml +8 -8
  4. {subliminal-2.6.0 → subliminal-2.7.0}/.github/workflows/prepare-release-pr.yaml +2 -2
  5. {subliminal-2.6.0 → subliminal-2.7.0}/.github/workflows/publish-release.yaml +5 -5
  6. {subliminal-2.6.0 → subliminal-2.7.0}/.github/workflows/publish.yaml +2 -2
  7. {subliminal-2.6.0 → subliminal-2.7.0}/.github/workflows/scheduled-tests.yaml +2 -2
  8. {subliminal-2.6.0 → subliminal-2.7.0}/.github/workflows/tag-release.yaml +2 -2
  9. subliminal-2.7.0/.github/zizmor.yml +11 -0
  10. {subliminal-2.6.0 → subliminal-2.7.0}/.pre-commit-config.yaml +4 -4
  11. subliminal-2.7.0/.python-version-default +1 -0
  12. {subliminal-2.6.0 → subliminal-2.7.0}/.readthedocs.yaml +2 -2
  13. {subliminal-2.6.0 → subliminal-2.7.0}/HISTORY.rst +34 -0
  14. {subliminal-2.6.0 → subliminal-2.7.0}/PKG-INFO +2 -4
  15. {subliminal-2.6.0 → subliminal-2.7.0}/docs/assets/config.toml +1 -1
  16. {subliminal-2.6.0 → subliminal-2.7.0}/docs/user/configuration_file.rst +11 -4
  17. {subliminal-2.6.0 → subliminal-2.7.0}/docs/user/usage.rst +25 -0
  18. {subliminal-2.6.0 → subliminal-2.7.0}/hatch.toml +2 -2
  19. {subliminal-2.6.0 → subliminal-2.7.0}/pyproject.toml +1 -3
  20. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/archives.py +2 -2
  21. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/cli/cli.py +10 -3
  22. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/cli/commands/download_best.py +87 -15
  23. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/cli/generate_config.py +9 -2
  24. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/cli/helpers.py +124 -4
  25. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/core.py +16 -25
  26. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/addic7ed.py +2 -3
  27. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/gestdown.py +11 -51
  28. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/mock.py +2 -2
  29. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/opensubtitles.py +3 -4
  30. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/opensubtitlescom.py +17 -77
  31. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/podnapisi.py +2 -2
  32. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/subtis.py +3 -3
  33. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/subtitulamos.py +2 -2
  34. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/tvsubtitles.py +16 -32
  35. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/refiners/hash.py +2 -2
  36. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/refiners/metadata.py +6 -4
  37. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/refiners/tvdb.py +6 -2
  38. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/subtitle.py +142 -66
  39. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/utils.py +271 -4
  40. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/video.py +4 -6
  41. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_list_subtitles_episode_alternative_series.yaml +66 -51
  42. subliminal-2.7.0/tests/cassettes/providers/test_download_best_subtitles.yaml +1097 -0
  43. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cli/test_download.py +264 -4
  44. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cli/test_helpers.py +26 -1
  45. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_gestdown.py +1 -0
  46. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_providers.py +1 -1
  47. {subliminal-2.6.0 → subliminal-2.7.0}/tests/refiners/test_metadata.py +3 -3
  48. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_extensions.py +1 -7
  49. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_provider_pool.py +3 -3
  50. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_subtitle.py +115 -26
  51. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_utils.py +224 -0
  52. {subliminal-2.6.0 → subliminal-2.7.0}/tox.ini +4 -4
  53. subliminal-2.6.0/.github/zizmor.yml +0 -13
  54. subliminal-2.6.0/.python-version-default +0 -1
  55. subliminal-2.6.0/tests/cassettes/providers/test_download_best_subtitles.yaml +0 -966
  56. {subliminal-2.6.0 → subliminal-2.7.0}/.dockerignore +0 -0
  57. {subliminal-2.6.0 → subliminal-2.7.0}/.github/workflows/coverage.yaml +0 -0
  58. {subliminal-2.6.0 → subliminal-2.7.0}/.gitignore +0 -0
  59. {subliminal-2.6.0 → subliminal-2.7.0}/CONTRIBUTING.md +0 -0
  60. {subliminal-2.6.0 → subliminal-2.7.0}/Dockerfile +0 -0
  61. {subliminal-2.6.0 → subliminal-2.7.0}/LICENSE +0 -0
  62. {subliminal-2.6.0 → subliminal-2.7.0}/MANIFEST.in +0 -0
  63. {subliminal-2.6.0 → subliminal-2.7.0}/README.rst +0 -0
  64. {subliminal-2.6.0 → subliminal-2.7.0}/RELEASING.md +0 -0
  65. {subliminal-2.6.0 → subliminal-2.7.0}/changelog.d/.gitignore +0 -0
  66. {subliminal-2.6.0 → subliminal-2.7.0}/docs/Makefile +0 -0
  67. {subliminal-2.6.0 → subliminal-2.7.0}/docs/_intersphinx/README.md +0 -0
  68. {subliminal-2.6.0 → subliminal-2.7.0}/docs/_intersphinx/importlib_metadata_objects.inv +0 -0
  69. {subliminal-2.6.0 → subliminal-2.7.0}/docs/_intersphinx/importlib_metadata_objects.txt +0 -0
  70. {subliminal-2.6.0 → subliminal-2.7.0}/docs/_static/.gitignore +0 -0
  71. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/cache.rst +0 -0
  72. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/cli.rst +0 -0
  73. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/core.rst +0 -0
  74. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/exceptions.rst +0 -0
  75. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/extensions.rst +0 -0
  76. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/providers.rst +0 -0
  77. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/refiners.rst +0 -0
  78. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/score.rst +0 -0
  79. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/subtitle.rst +0 -0
  80. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/utils.rst +0 -0
  81. {subliminal-2.6.0 → subliminal-2.7.0}/docs/api/video.rst +0 -0
  82. {subliminal-2.6.0 → subliminal-2.7.0}/docs/assets/demo.gif +0 -0
  83. {subliminal-2.6.0 → subliminal-2.7.0}/docs/cassettes/test_usage.yaml +0 -0
  84. {subliminal-2.6.0 → subliminal-2.7.0}/docs/conf.py +0 -0
  85. {subliminal-2.6.0 → subliminal-2.7.0}/docs/conftest.py +0 -0
  86. {subliminal-2.6.0 → subliminal-2.7.0}/docs/index.rst +0 -0
  87. {subliminal-2.6.0 → subliminal-2.7.0}/docs/make.bat +0 -0
  88. {subliminal-2.6.0 → subliminal-2.7.0}/docs/user/changelog.rst +0 -0
  89. {subliminal-2.6.0 → subliminal-2.7.0}/docs/user/cli.rst +0 -0
  90. {subliminal-2.6.0 → subliminal-2.7.0}/docs/user/how_it_works.rst +0 -0
  91. {subliminal-2.6.0 → subliminal-2.7.0}/docs/user/installation.rst +0 -0
  92. {subliminal-2.6.0 → subliminal-2.7.0}/docs/user/provider_guide.rst +0 -0
  93. {subliminal-2.6.0 → subliminal-2.7.0}/scripts/.gitignore +0 -0
  94. {subliminal-2.6.0 → subliminal-2.7.0}/scripts/prepare-release-pr.py +0 -0
  95. {subliminal-2.6.0 → subliminal-2.7.0}/scripts/prepare_tests.py +0 -0
  96. {subliminal-2.6.0 → subliminal-2.7.0}/scripts/release.py +0 -0
  97. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/__init__.py +0 -0
  98. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/__main__.py +0 -0
  99. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/cache.py +0 -0
  100. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/cli/__init__.py +0 -0
  101. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/cli/commands/__init__.py +0 -0
  102. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/cli/commands/_format.py +0 -0
  103. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/converters/__init__.py +0 -0
  104. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/converters/addic7ed.py +0 -0
  105. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/converters/opensubtitles.py +0 -0
  106. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/converters/opensubtitlescom.py +0 -0
  107. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/converters/subtitulamos.py +0 -0
  108. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/converters/tvsubtitles.py +0 -0
  109. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/exceptions.py +0 -0
  110. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/extensions.py +0 -0
  111. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/matches.py +0 -0
  112. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/__init__.py +0 -0
  113. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/bsplayer.py +0 -0
  114. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/providers/napiprojekt.py +0 -0
  115. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/py.typed +0 -0
  116. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/refiners/__init__.py +0 -0
  117. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/refiners/omdb.py +0 -0
  118. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/refiners/tmdb.py +0 -0
  119. {subliminal-2.6.0 → subliminal-2.7.0}/src/subliminal/score.py +0 -0
  120. {subliminal-2.6.0 → subliminal-2.7.0}/tests/__init__.py +0 -0
  121. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_download_subtitle.yaml +0 -0
  122. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_get_show_id.yaml +0 -0
  123. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_get_show_id_country.yaml +0 -0
  124. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_get_show_id_quote_dots_mixed_case.yaml +0 -0
  125. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_get_show_id_with_comma.yaml +0 -0
  126. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_get_show_id_year.yaml +0 -0
  127. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_get_show_ids.yaml +0 -0
  128. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_list_subtitles.yaml +0 -0
  129. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_list_subtitles_episode_alternative_series.yaml +0 -0
  130. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_list_subtitles_show_with_asterisk.yaml +0 -0
  131. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_query.yaml +0 -0
  132. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_query_no_year.yaml +0 -0
  133. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_query_parsing.yaml +0 -0
  134. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_query_parsing_colon.yaml +0 -0
  135. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_query_parsing_dash.yaml +0 -0
  136. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_query_parsing_quote_dots_mixed_case.yaml +0 -0
  137. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_query_wrong_series.yaml +0 -0
  138. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/addic7ed/test_query_year.yaml +0 -0
  139. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/bsplayer/test_download_subtitle.yaml +0 -0
  140. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/bsplayer/test_list_subtitles_hash.yaml +0 -0
  141. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/bsplayer/test_login.yaml +0 -0
  142. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/bsplayer/test_logout.yaml +0 -0
  143. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/bsplayer/test_query_hash_size.yaml +0 -0
  144. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/cli/test_cli_download.yaml +0 -0
  145. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_download_subtitle.yaml +0 -0
  146. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_download_with_bom.yaml +0 -0
  147. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_get_title_and_show_id_alternative_name.yaml +0 -0
  148. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_get_title_and_show_id_no_year.yaml +0 -0
  149. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_get_title_and_show_id_only_title.yaml +0 -0
  150. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_get_title_and_show_id_with_tvdb_id.yaml +0 -0
  151. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_list_subtitles.yaml +0 -0
  152. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_query.yaml +0 -0
  153. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_query_all_series.yaml +0 -0
  154. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_query_no_language.yaml +0 -0
  155. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_query_parsing.yaml +0 -0
  156. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_query_parsing_colon.yaml +0 -0
  157. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_query_parsing_dash.yaml +0 -0
  158. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_query_parsing_quote_dots_mixed_case.yaml +0 -0
  159. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_query_wrong_series.yaml +0 -0
  160. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_search_show_id.yaml +0 -0
  161. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_search_show_id_error.yaml +0 -0
  162. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_search_show_id_incomplete.yaml +0 -0
  163. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_search_show_id_no_year.yaml +0 -0
  164. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_search_show_id_quote.yaml +0 -0
  165. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_search_show_series_tvdb_id.yaml +0 -0
  166. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/gestdown/test_show_with_asterisk.yaml +0 -0
  167. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/napiprojekt/test_download_subtitles.yaml +0 -0
  168. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/napiprojekt/test_list_subtitles.yaml +0 -0
  169. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/napiprojekt/test_query_microdvd.yaml +0 -0
  170. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/napiprojekt/test_query_srt.yaml +0 -0
  171. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/napiprojekt/test_query_srt_reencode.yaml +0 -0
  172. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/napiprojekt/test_query_wrong_hash.yaml +0 -0
  173. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_get_id.yaml +0 -0
  174. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_get_title.yaml +0 -0
  175. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_get_wrong_id.yaml +0 -0
  176. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_get_wrong_title.yaml +0 -0
  177. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_refine_episode.yaml +0 -0
  178. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_refine_episode_original_series.yaml +0 -0
  179. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_refine_episode_with_country.yaml +0 -0
  180. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_refine_episode_with_country_hoc_us.yaml +0 -0
  181. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_refine_episode_year.yaml +0 -0
  182. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_refine_movie.yaml +0 -0
  183. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_refine_movie_guess_alternative_title.yaml +0 -0
  184. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_search.yaml +0 -0
  185. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_search_page.yaml +0 -0
  186. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_search_type.yaml +0 -0
  187. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_search_wrong_title.yaml +0 -0
  188. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/omdb/test_search_year.yaml +0 -0
  189. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_download_subtitle.yaml +0 -0
  190. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_list_subtitles_episode.yaml +0 -0
  191. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_list_subtitles_movie.yaml +0 -0
  192. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_list_subtitles_movie_no_hash.yaml +0 -0
  193. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_login_bad_password.yaml +0 -0
  194. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_login_vip_bad_password.yaml +0 -0
  195. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_login_vip_login.yaml +0 -0
  196. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_no_operation.yaml +0 -0
  197. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_query_hash_size.yaml +0 -0
  198. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_query_imdb_id.yaml +0 -0
  199. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_query_not_enough_information.yaml +0 -0
  200. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_query_query_episode.yaml +0 -0
  201. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_query_query_movie.yaml +0 -0
  202. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_query_query_season_episode.yaml +0 -0
  203. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitles/test_query_wrong_hash_wrong_size.yaml +0 -0
  204. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_download_subtitle.yaml +0 -0
  205. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_list_subtitles_episode.yaml +0 -0
  206. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_list_subtitles_movie.yaml +0 -0
  207. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_list_subtitles_movie_no_hash.yaml +0 -0
  208. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_login.yaml +0 -0
  209. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_login_bad_password.yaml +0 -0
  210. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_logout.yaml +0 -0
  211. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_query_hash_size.yaml +0 -0
  212. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_query_imdb_id.yaml +0 -0
  213. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_query_max_result_pages.yaml +0 -0
  214. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_query_query_episode.yaml +0 -0
  215. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_query_query_movie.yaml +0 -0
  216. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_query_query_season_episode.yaml +0 -0
  217. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_query_tag_movie.yaml +0 -0
  218. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_query_wrong_hash_wrong_size.yaml +0 -0
  219. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_tag_match.yaml +0 -0
  220. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/opensubtitlescom/test_user_infos.yaml +0 -0
  221. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/podnapisi/test_download_subtitle.yaml +0 -0
  222. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/podnapisi/test_download_subtitles_with_title_unicode.yaml +0 -0
  223. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/podnapisi/test_list_subtitles_episode.yaml +0 -0
  224. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/podnapisi/test_list_subtitles_episode_alternative_series.yaml +0 -0
  225. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/podnapisi/test_list_subtitles_movie.yaml +0 -0
  226. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/podnapisi/test_query_episode.yaml +0 -0
  227. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/podnapisi/test_query_movie.yaml +0 -0
  228. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/providers/test_download_best_subtitles_min_score.yaml +0 -0
  229. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/providers/test_download_best_subtitles_only_one.yaml +0 -0
  230. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/providers/test_list_subtitles_providers_download.yaml +0 -0
  231. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtis/test_download_subtitle.yaml +0 -0
  232. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtis/test_list_subtitles_hash.yaml +0 -0
  233. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtis/test_list_subtitles_movie.yaml +0 -0
  234. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtis/test_list_subtitles_movie_alternative.yaml +0 -0
  235. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtis/test_list_subtitles_movie_with_size.yaml +0 -0
  236. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtis/test_list_subtitles_no_match.yaml +0 -0
  237. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_download_subtitle.yaml +0 -0
  238. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_download_subtitle_first_episode.yaml +0 -0
  239. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_download_subtitle_foo.yaml +0 -0
  240. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_download_subtitle_last_season.yaml +0 -0
  241. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_download_subtitle_year.yaml +0 -0
  242. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_list_subtitles_not_exist_episode.yaml +0 -0
  243. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_list_subtitles_not_exist_language.yaml +0 -0
  244. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_list_subtitles_not_exist_season.yaml +0 -0
  245. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_list_subtitles_not_exist_series.yaml +0 -0
  246. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/subtitulamos/test_list_subtitles_with_spanish_non_mx_search.yaml +0 -0
  247. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_get_movie_id.yaml +0 -0
  248. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_get_movie_id_failed.yaml +0 -0
  249. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_get_series_id.yaml +0 -0
  250. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_get_series_wrong_id.yaml +0 -0
  251. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_refine_episode.yaml +0 -0
  252. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_refine_episode_original_series.yaml +0 -0
  253. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_refine_episode_with_country.yaml +0 -0
  254. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_refine_episode_with_country_hoc_us.yaml +0 -0
  255. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_refine_episode_year.yaml +0 -0
  256. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_refine_movie.yaml +0 -0
  257. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_refine_movie_guess_alternative_title.yaml +0 -0
  258. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_search_movie.yaml +0 -0
  259. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_search_movie_page.yaml +0 -0
  260. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_search_movie_wrong_title.yaml +0 -0
  261. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_search_movie_year.yaml +0 -0
  262. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_search_series.yaml +0 -0
  263. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tmdb/test_search_series_wrong_name.yaml +0 -0
  264. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_get_series.yaml +0 -0
  265. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_get_series_actors.yaml +0 -0
  266. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_get_series_actors_wrong_id.yaml +0 -0
  267. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_get_series_wrong_id.yaml +0 -0
  268. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_login.yaml +0 -0
  269. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_login_error.yaml +0 -0
  270. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_query_series_episodes.yaml +0 -0
  271. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_query_series_episodes_wrong_season.yaml +0 -0
  272. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine.yaml +0 -0
  273. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_ambiguous.yaml +0 -0
  274. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_ambiguous_2.yaml +0 -0
  275. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_episode_alternative_series.yaml +0 -0
  276. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_episode_no_year.yaml +0 -0
  277. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_episode_partial.yaml +0 -0
  278. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_episode_with_comma.yaml +0 -0
  279. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_episode_with_country.yaml +0 -0
  280. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_episode_with_country_hoc_us.yaml +0 -0
  281. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_refine_episode_year.yaml +0 -0
  282. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_search_series.yaml +0 -0
  283. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvdb/test_search_series_wrong_name.yaml +0 -0
  284. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_download_subtitle.yaml +0 -0
  285. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_download_subtitle_with_quote.yaml +0 -0
  286. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_get_episode_ids.yaml +0 -0
  287. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_get_episode_ids_wrong_season.yaml +0 -0
  288. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_list_subtitles.yaml +0 -0
  289. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_list_subtitles_episode_alternative_series.yaml +0 -0
  290. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_query.yaml +0 -0
  291. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_query_no_year.yaml +0 -0
  292. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_query_with_quote.yaml +0 -0
  293. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_query_wrong_episode.yaml +0 -0
  294. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_query_wrong_series.yaml +0 -0
  295. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_search_show_id.yaml +0 -0
  296. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_search_show_id_ambiguous.yaml +0 -0
  297. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_search_show_id_error.yaml +0 -0
  298. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_search_show_id_incomplete.yaml +0 -0
  299. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_search_show_id_no_year.yaml +0 -0
  300. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_search_show_id_uk.yaml +0 -0
  301. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_search_show_id_us.yaml +0 -0
  302. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cassettes/tvsubtitles/test_search_show_id_year_in_title.yaml +0 -0
  303. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cli/test_cli.py +0 -0
  304. {subliminal-2.6.0 → subliminal-2.7.0}/tests/cli/test_generate_config.py +0 -0
  305. {subliminal-2.6.0 → subliminal-2.7.0}/tests/conftest.py +0 -0
  306. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_addic7ed.py +0 -0
  307. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_bsplayer.py +0 -0
  308. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_napiprojekt.py +0 -0
  309. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_opensubtitles.py +0 -0
  310. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_opensubtitlescom.py +0 -0
  311. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_podnapisi.py +0 -0
  312. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_subtis.py +0 -0
  313. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_subtitulamos.py +0 -0
  314. {subliminal-2.6.0 → subliminal-2.7.0}/tests/providers/test_tvsubtitles.py +0 -0
  315. {subliminal-2.6.0 → subliminal-2.7.0}/tests/refiners/test_hash.py +0 -0
  316. {subliminal-2.6.0 → subliminal-2.7.0}/tests/refiners/test_omdb.py +0 -0
  317. {subliminal-2.6.0 → subliminal-2.7.0}/tests/refiners/test_tmdb.py +0 -0
  318. {subliminal-2.6.0 → subliminal-2.7.0}/tests/refiners/test_tvdb.py +0 -0
  319. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_archives.py +0 -0
  320. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_cache.py +0 -0
  321. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_core.py +0 -0
  322. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_matches.py +0 -0
  323. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_provider.py +0 -0
  324. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_score.py +0 -0
  325. {subliminal-2.6.0 → subliminal-2.7.0}/tests/test_video.py +0 -0
@@ -10,13 +10,13 @@ runs:
10
10
  run: |
11
11
  echo "::error title=⛔ error hint::Support Linux, Windows, and macOS Only"
12
12
  exit 1
13
- - uses: actions/checkout@v4
13
+ - uses: actions/checkout@v7
14
14
  with:
15
15
  persist-credentials: false
16
16
  fetch-depth: 0
17
17
  - name: Cache test data
18
18
  id: cache-test-data
19
- uses: actions/cache@v4
19
+ uses: actions/cache@v5
20
20
  with:
21
21
  path: tests/data/
22
22
  enableCrossOsArchive: true
@@ -34,7 +34,7 @@ runs:
34
34
  with:
35
35
  packages: rar
36
36
  version: 1.0
37
- - uses: actions/setup-python@v5
37
+ - uses: actions/setup-python@v6
38
38
  if: steps.cache-test-data.outputs.cache-hit != 'true'
39
39
  with:
40
40
  python-version-file: .python-version-default
@@ -52,7 +52,7 @@ runs:
52
52
  tox -e prepare-tests
53
53
 
54
54
  # - name: Upload files for test
55
- # uses: actions/upload-artifact@v4
55
+ # uses: actions/upload-artifact@v7
56
56
  # with:
57
57
  # name: tests-data
58
58
  # path: tests/data/
@@ -20,7 +20,7 @@ jobs:
20
20
  check-manifest:
21
21
  runs-on: ubuntu-latest
22
22
  steps:
23
- - uses: actions/checkout@v4
23
+ - uses: actions/checkout@v7
24
24
  with:
25
25
  persist-credentials: false
26
26
  - run: pipx run check-manifest --ignore "_version.py"
@@ -28,10 +28,10 @@ jobs:
28
28
  pre-commit:
29
29
  runs-on: ubuntu-latest
30
30
  steps:
31
- - uses: actions/checkout@v4
31
+ - uses: actions/checkout@v7
32
32
  with:
33
33
  persist-credentials: false
34
- - uses: actions/setup-python@v5
34
+ - uses: actions/setup-python@v6
35
35
  with:
36
36
  python-version-file: .python-version-default
37
37
  - uses: pre-commit/action@v3.0.1
@@ -41,10 +41,10 @@ jobs:
41
41
  permissions:
42
42
  contents: read
43
43
  steps:
44
- - uses: actions/checkout@v4
44
+ - uses: actions/checkout@v7
45
45
  with:
46
46
  persist-credentials: false
47
- - uses: actions/setup-python@v5
47
+ - uses: actions/setup-python@v6
48
48
  with:
49
49
  python-version-file: .python-version-default
50
50
  - name: Install hatch
@@ -58,10 +58,10 @@ jobs:
58
58
  name: Build docs and run doctests
59
59
  runs-on: ubuntu-latest
60
60
  steps:
61
- - uses: actions/checkout@v4
61
+ - uses: actions/checkout@v7
62
62
  with:
63
63
  persist-credentials: false
64
- - uses: actions/setup-python@v5
64
+ - uses: actions/setup-python@v6
65
65
  with:
66
66
  # Keep in sync with tox/docs, hatch.toml and .readthedocs.yaml.
67
67
  python-version-file: .python-version-default
@@ -76,7 +76,7 @@ jobs:
76
76
  - name: Check changelog
77
77
  run: hatch run changelog:run
78
78
 
79
- - uses: actions/upload-artifact@v4
79
+ - uses: actions/upload-artifact@v7
80
80
  with:
81
81
  name: docs
82
82
  path: docs/_build/
@@ -86,10 +86,10 @@ jobs:
86
86
  runs-on: ubuntu-latest
87
87
 
88
88
  steps:
89
- - uses: actions/checkout@v4
89
+ - uses: actions/checkout@v7
90
90
  with:
91
91
  persist-credentials: false
92
- - uses: actions/setup-python@v5
92
+ - uses: actions/setup-python@v6
93
93
  with:
94
94
  python-version-file: .python-version-default
95
95
  cache: pip
@@ -104,7 +104,7 @@ jobs:
104
104
  runs-on: ubuntu-latest
105
105
 
106
106
  steps:
107
- - uses: actions/checkout@v4
107
+ - uses: actions/checkout@v7
108
108
  with:
109
109
  persist-credentials: false
110
110
  fetch-depth: 0
@@ -122,7 +122,7 @@ jobs:
122
122
  runs-on: ubuntu-latest
123
123
 
124
124
  steps:
125
- - uses: actions/checkout@v4
125
+ - uses: actions/checkout@v7
126
126
  with:
127
127
  persist-credentials: false
128
128
  fetch-depth: 0
@@ -142,10 +142,10 @@ jobs:
142
142
  # Created by the build-and-inspect-python-package action above.
143
143
  py: ${{ fromJson(needs.build-package.outputs.supported-python-versions) }}
144
144
  steps:
145
- - uses: actions/checkout@v4
145
+ - uses: actions/checkout@v7
146
146
  with:
147
147
  persist-credentials: false
148
- - uses: actions/setup-python@v5
148
+ - uses: actions/setup-python@v6
149
149
  with:
150
150
  python-version: ${{ matrix.py }}
151
151
  allow-prereleases: true
@@ -181,7 +181,7 @@ jobs:
181
181
  shell: bash
182
182
 
183
183
  - name: Store coverage file
184
- uses: actions/upload-artifact@v4
184
+ uses: actions/upload-artifact@v7
185
185
  with:
186
186
  name: coverage-${{ matrix.os }}-${{ matrix.py }}
187
187
  path: .coverage*
@@ -196,17 +196,17 @@ jobs:
196
196
  pull-requests: write
197
197
  contents: write
198
198
  steps:
199
- - uses: actions/checkout@v4
199
+ - uses: actions/checkout@v7
200
200
  with:
201
201
  # py-cov-action/python-coverage-comment-action needs git credentials
202
202
  persist-credentials: true
203
- - uses: actions/setup-python@v5
203
+ - uses: actions/setup-python@v6
204
204
  with:
205
205
  python-version-file: .python-version-default
206
206
  - uses: hynek/setup-cached-uv@v2
207
207
 
208
208
  - name: Download coverage data
209
- uses: actions/download-artifact@v4
209
+ uses: actions/download-artifact@v8
210
210
  with:
211
211
  pattern: coverage-*
212
212
  merge-multiple: true
@@ -222,7 +222,7 @@ jobs:
222
222
  coverage report --skip-covered --skip-empty --show-missing --format=markdown >> $GITHUB_STEP_SUMMARY
223
223
 
224
224
  - name: Upload HTML report if check failed.
225
- uses: actions/upload-artifact@v4
225
+ uses: actions/upload-artifact@v7
226
226
  with:
227
227
  name: html-report
228
228
  path: htmlcov
@@ -234,7 +234,7 @@ jobs:
234
234
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
235
235
 
236
236
  - name: Store Pull Request comment to be posted
237
- uses: actions/upload-artifact@v4
237
+ uses: actions/upload-artifact@v7
238
238
  if: steps.coverage_comment.outputs.COMMENT_FILE_WRITTEN == 'true'
239
239
  with:
240
240
  # If you use a different name, update COMMENT_ARTIFACT_NAME accordingly
@@ -247,10 +247,10 @@ jobs:
247
247
  runs-on: ubuntu-latest
248
248
  needs: [build-package, prepare-test]
249
249
  steps:
250
- - uses: actions/checkout@v4
250
+ - uses: actions/checkout@v7
251
251
  with:
252
252
  persist-credentials: false
253
- - uses: actions/setup-python@v5
253
+ - uses: actions/setup-python@v6
254
254
  id: setup
255
255
  with:
256
256
  python-version-file: .python-version-default
@@ -287,7 +287,7 @@ jobs:
287
287
  shell: bash
288
288
 
289
289
  - name: Store coverage file
290
- uses: actions/upload-artifact@v4
290
+ uses: actions/upload-artifact@v7
291
291
  if: ${{ failure() }}
292
292
  with:
293
293
  name: core-coverage
@@ -35,12 +35,12 @@ jobs:
35
35
  steps:
36
36
  - name: Checkout repository
37
37
  if: github.event_name == 'push' || github.event_name == 'pull_request'
38
- uses: actions/checkout@v4
38
+ uses: actions/checkout@v7
39
39
  with:
40
40
  persist-credentials: false
41
41
  - name: Checkout repository
42
42
  if: github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch'
43
- uses: actions/checkout@v4
43
+ uses: actions/checkout@v7
44
44
  with:
45
45
  ref: ${{ inputs.tag-name }}
46
46
  persist-credentials: false
@@ -50,15 +50,15 @@ jobs:
50
50
  github.event_name == 'push'
51
51
  || github.event_name == 'workflow_call'
52
52
  || github.event_name == 'workflow_dispatch'
53
- uses: docker/setup-qemu-action@v3
53
+ uses: docker/setup-qemu-action@v4
54
54
 
55
55
  - name: Set up Docker Buildx
56
- uses: docker/setup-buildx-action@v3
56
+ uses: docker/setup-buildx-action@v4
57
57
  with:
58
58
  cache-binary: false
59
59
 
60
60
  - name: Log in to the Container registry
61
- uses: docker/login-action@v3
61
+ uses: docker/login-action@v4
62
62
  with:
63
63
  registry: ${{ env.REGISTRY }}
64
64
  username: ${{ github.actor }}
@@ -66,7 +66,7 @@ jobs:
66
66
 
67
67
  - name: Extract metadata (tags, labels) for Docker
68
68
  id: meta
69
- uses: docker/metadata-action@v5
69
+ uses: docker/metadata-action@v6
70
70
  with:
71
71
  images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
72
72
  tags: |
@@ -76,7 +76,7 @@ jobs:
76
76
  type=semver,pattern={{major}},enable=${{ !startsWith(github.ref, 'refs/tags/0.') }}
77
77
 
78
78
  - name: Test building Docker image
79
- uses: docker/build-push-action@v6
79
+ uses: docker/build-push-action@v7
80
80
  if: github.event_name == 'pull_request'
81
81
  with:
82
82
  context: .
@@ -86,7 +86,7 @@ jobs:
86
86
  cache-to: type=gha,mode=max
87
87
 
88
88
  - name: Build and push Docker image
89
- uses: docker/build-push-action@v6
89
+ uses: docker/build-push-action@v7
90
90
  if: |
91
91
  github.event_name == 'push'
92
92
  || github.event_name == 'workflow_call'
@@ -29,14 +29,14 @@ jobs:
29
29
  pull-requests: write
30
30
 
31
31
  steps:
32
- - uses: actions/checkout@v4
32
+ - uses: actions/checkout@v7
33
33
  with:
34
34
  fetch-depth: 0
35
35
  # persist-credentials is needed in order for us to push the release branch.
36
36
  persist-credentials: true
37
37
 
38
38
  - name: Set up Python
39
- uses: actions/setup-python@v5
39
+ uses: actions/setup-python@v6
40
40
  with:
41
41
  python-version-file: .python-version-default
42
42
  cache: pip
@@ -31,12 +31,12 @@ jobs:
31
31
  runs-on: ubuntu-latest
32
32
  steps:
33
33
  - name: Checkout
34
- uses: actions/checkout@v4
34
+ uses: actions/checkout@v7
35
35
  if: github.event_name == 'push'
36
36
  with:
37
37
  persist-credentials: false
38
38
  - name: Checkout
39
- uses: actions/checkout@v4
39
+ uses: actions/checkout@v7
40
40
  if: |
41
41
  github.event_name == 'workflow_dispatch'
42
42
  || github.event_name == 'workflow_call'
@@ -63,19 +63,19 @@ jobs:
63
63
  # Publish a Github release when a tag was pushed, or it's called with a tag.
64
64
  steps:
65
65
  - name: Checkout
66
- uses: actions/checkout@v4
66
+ uses: actions/checkout@v7
67
67
  with:
68
68
  fetch-tags: true
69
69
  ref: ${{ needs.build-package.outputs.tag }}
70
70
  persist-credentials: false
71
71
 
72
72
  - name: Download packages built by build-and-inspect-python-package
73
- uses: actions/download-artifact@v4
73
+ uses: actions/download-artifact@v8
74
74
  with:
75
75
  name: Packages
76
76
  path: dist
77
77
  - name: Publish GitHub Release
78
- uses: softprops/action-gh-release@v2
78
+ uses: softprops/action-gh-release@v3
79
79
  with:
80
80
  files: dist/*
81
81
  generate_release_notes: true
@@ -20,7 +20,7 @@ jobs:
20
20
  name: Build & verify package
21
21
  runs-on: ubuntu-latest
22
22
  steps:
23
- - uses: actions/checkout@v4
23
+ - uses: actions/checkout@v7
24
24
  with:
25
25
  fetch-depth: 0
26
26
  persist-credentials: false
@@ -45,7 +45,7 @@ jobs:
45
45
  && github.event.action == 'published'
46
46
  steps:
47
47
  - name: Download packages built by build-and-inspect-python-package
48
- uses: actions/download-artifact@v4
48
+ uses: actions/download-artifact@v8
49
49
  with:
50
50
  name: Packages
51
51
  path: dist
@@ -24,10 +24,10 @@ jobs:
24
24
  || github.event_name == 'workflow_dispatch'
25
25
  runs-on: ubuntu-latest
26
26
  steps:
27
- - uses: actions/checkout@v4
27
+ - uses: actions/checkout@v7
28
28
  with:
29
29
  persist-credentials: false
30
- - uses: actions/setup-python@v5
30
+ - uses: actions/setup-python@v6
31
31
  with:
32
32
  python-version: "3.x"
33
33
  - name: Prepare tests
@@ -24,7 +24,7 @@ jobs:
24
24
  name: Build & verify package
25
25
  runs-on: ubuntu-latest
26
26
  steps:
27
- - uses: actions/checkout@v4
27
+ - uses: actions/checkout@v7
28
28
  with:
29
29
  fetch-depth: 0
30
30
  persist-credentials: false
@@ -72,7 +72,7 @@ jobs:
72
72
  env:
73
73
  RELEASE_VERSION: ${{ needs.define-tag.outputs.tag }}
74
74
  steps:
75
- - uses: actions/checkout@v4
75
+ - uses: actions/checkout@v7
76
76
  with:
77
77
  fetch-depth: 0
78
78
  # keep credentials to create a tag
@@ -0,0 +1,11 @@
1
+ rules:
2
+ dangerous-triggers:
3
+ ignore:
4
+ - coverage.yaml:3:1
5
+ unpinned-uses:
6
+ config:
7
+ policies:
8
+ "*": ref-pin
9
+ superfluous-actions:
10
+ ignore:
11
+ - publish-release.yaml:78:15
@@ -8,19 +8,19 @@ repos:
8
8
  - id: end-of-file-fixer
9
9
 
10
10
  - repo: https://github.com/crate-ci/typos
11
- rev: v1.40.0
11
+ rev: v1.45.0
12
12
  hooks:
13
13
  - id: typos
14
14
 
15
15
  - repo: https://github.com/astral-sh/ruff-pre-commit
16
- rev: v0.14.9
16
+ rev: v0.15.10
17
17
  hooks:
18
18
  - id: ruff
19
19
  args: [--fix, --unsafe-fixes]
20
20
  - id: ruff-format
21
21
 
22
22
  - repo: https://github.com/abravalheri/validate-pyproject
23
- rev: v0.24.1
23
+ rev: v0.25
24
24
  hooks:
25
25
  - id: validate-pyproject
26
26
  name: validate-pyproject
@@ -33,7 +33,7 @@ repos:
33
33
  require_serial: true
34
34
 
35
35
  - repo: https://github.com/woodruffw/zizmor-pre-commit
36
- rev: v1.18.0
36
+ rev: v1.23.1
37
37
  hooks:
38
38
  - id: zizmor
39
39
 
@@ -0,0 +1 @@
1
+ 3.13
@@ -4,10 +4,10 @@
4
4
  version: 2
5
5
 
6
6
  build:
7
- os: ubuntu-22.04
7
+ os: ubuntu-lts-latest
8
8
  tools:
9
9
  # Keep in sync with CI.yaml/docs, hatch.toml and tox/docs.
10
- python: "3.12"
10
+ python: "3.13"
11
11
 
12
12
  python:
13
13
  install:
@@ -2,6 +2,40 @@
2
2
 
3
3
  .. towncrier release notes start
4
4
 
5
+ 2.7.0 (2026-07-21)
6
+ ^^^^^^^^^^^^^^^^^^
7
+
8
+ Changes
9
+ -------
10
+
11
+ - Rename language_type to category. Deprecate ``--language-type-suffix`` for ``--category-suffix`` (`#1344 <https://github.com/Diaoul/subliminal/issues/1344>`__)
12
+ - make EmbeddedSubtitle subtitle_id unique (`#1347 <https://github.com/Diaoul/subliminal/issues/1347>`__)
13
+ - Safely call Guessit and format output (`#1351 <https://github.com/Diaoul/subliminal/issues/1351>`__)
14
+
15
+
16
+ CLI Changes
17
+ -----------
18
+
19
+ - add a ``--subtitle-categories`` option to replace ``-hi/-HI`` and ``-fo/-FO`` (`#1357 <https://github.com/Diaoul/subliminal/issues/1357>`__)
20
+ - check for undefined or deprecated entries in the config file (`#1358 <https://github.com/Diaoul/subliminal/issues/1358>`__)
21
+ - Allow ``--name`` to be a sed-like ``s/pattern/replacement/flags`` substitution, applied to the path of each
22
+ file individually, to parameterize the guessed name per file (`#1362 <https://github.com/Diaoul/subliminal/issues/1362>`__)
23
+ - allow multiple use of sed-like ``--name`` options (`#1364 <https://github.com/Diaoul/subliminal/issues/1364>`__)
24
+
25
+
26
+ Documentation
27
+ -------------
28
+
29
+ - fix docs for config file with the subtitle_categories option (`#1360 <https://github.com/Diaoul/subliminal/issues/1360>`__)
30
+
31
+
32
+ Misc
33
+ ----
34
+
35
+ - Drop Python 3.9 (`#1345 <https://github.com/Diaoul/subliminal/issues/1345>`__)
36
+ - fix gestdown tests (`#1354 <https://github.com/Diaoul/subliminal/issues/1354>`__)
37
+
38
+
5
39
  2.6.0 (2026-02-20)
6
40
  ^^^^^^^^^^^^^^^^^^
7
41
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: subliminal
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: Subtitles, faster than your thoughts
5
5
  Project-URL: homepage, https://github.com/Diaoul/subliminal
6
6
  Project-URL: repository, https://github.com/Diaoul/subliminal
@@ -16,7 +16,6 @@ Classifier: License :: OSI Approved :: MIT License
16
16
  Classifier: Operating System :: OS Independent
17
17
  Classifier: Programming Language :: Python
18
18
  Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.9
20
19
  Classifier: Programming Language :: Python :: 3.10
21
20
  Classifier: Programming Language :: Python :: 3.11
22
21
  Classifier: Programming Language :: Python :: 3.12
@@ -24,7 +23,7 @@ Classifier: Programming Language :: Python :: 3.13
24
23
  Classifier: Programming Language :: Python :: 3.14
25
24
  Classifier: Topic :: Multimedia :: Video
26
25
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
27
- Requires-Python: >=3.9
26
+ Requires-Python: >=3.10
28
27
  Requires-Dist: babelfish>=0.6.1
29
28
  Requires-Dist: beautifulsoup4>=4.4.0
30
29
  Requires-Dist: chardet>=5.0
@@ -56,7 +55,6 @@ Requires-Dist: rarfile>=2.7; extra == 'rar'
56
55
  Provides-Extra: tests
57
56
  Requires-Dist: colorama; extra == 'tests'
58
57
  Requires-Dist: coverage[toml]>=7; extra == 'tests'
59
- Requires-Dist: importlib-metadata>=4.6; (python_version < '3.10') and extra == 'tests'
60
58
  Requires-Dist: pytest-cov; extra == 'tests'
61
59
  Requires-Dist: pytest-xdist; extra == 'tests'
62
60
  Requires-Dist: pytest>=6.0; extra == 'tests'
@@ -22,7 +22,7 @@ provider = ["addic7ed", "opensubtitlescom", "opensubtitles"]
22
22
  refiner = ["metadata", "hash", "omdb"]
23
23
  ignore_refiner = ["tmdb"]
24
24
  language = ["fr", "en", "pt-br"]
25
- foreign_only = false
25
+ subtitle_categories = "n,hi"
26
26
  encoding = "utf-8"
27
27
  min_score = 50
28
28
  archives = true
@@ -12,7 +12,7 @@ Sections
12
12
 
13
13
  The configuration file supports different sections or tables:
14
14
 
15
- - a ``[default]`` table, corresponding to the options of the :ref:`cli-subliminal-download` command.
15
+ - a ``[default]`` table, corresponding to the options of the :ref:`cli-subliminal` command.
16
16
 
17
17
  - ``[refiner.<refiner_name>]`` and ``[provider.<provider_name>]`` tables to specify refiner and provider options.
18
18
 
@@ -24,9 +24,16 @@ CLI arguments (like ``path``) cannot be specified in the configuration file.
24
24
 
25
25
  Options that can be used multiple times (like ``--language``) need to be defined as arrays.
26
26
 
27
- ``hearing_impaired`` and ``foreign_only`` can take three values: "true", "false" or "[]".
28
- They mean that hearing impaired (or foreign-only) subtitles will be, respectively,
29
- ranked first, ranked last or not given any particular rank, for subtitles with identical scores.
27
+ Hyphens in parameter names need to be substituted by underscores in the config file:
28
+ ``--cache-dir=/tmp`` → ``cache_dir = "/tmp"``.
29
+
30
+ .. note::
31
+ ``hearing_impaired`` and ``foreign_only`` can take three values: "true", "false" or "[]".
32
+ They mean that hearing impaired (or foreign-only) subtitles will be, respectively,
33
+ ranked first, ranked last or not given any particular rank, for subtitles with identical scores.
34
+
35
+ .. deprecated:: 2.7.04
36
+ Use ``--subtitle-categories`` instead.
30
37
 
31
38
 
32
39
  Example
@@ -52,6 +52,31 @@ See :ref:`cli` for more details on the available commands and options.
52
52
  $ python -m subliminal download -h
53
53
 
54
54
 
55
+ Parameterized name
56
+ ^^^^^^^^^^^^^^^^^^^
57
+
58
+ The ``--name/-n`` option lets you override the file name that is used to guess information about a video.
59
+ In addition to a static alternative name, you can use a
60
+ `sed <https://www.man7.org/linux/man-pages/man1/sed.1.html>`_-like substitution pattern
61
+ ``s/pattern/replacement/flags`` to override the names of all the files in a folder.
62
+ The pattern needs to be a valid Python regex. Back-references (``\1``, ``\2``, …) are available in the
63
+ replacement, and the ``g`` (replace all occurrences) and ``i`` (case-insensitive) flags are supported::
64
+
65
+ $ subliminal download -l pl \
66
+ --name 's/.*YP-1R-([0-9]+)x([0-9]+).*/My Little Pony Friendship Is Magic S\1E\2.mkv/' \
67
+ */YP-1R-*.mkv
68
+
69
+ Unlike sed, ``&`` is a literal character (not the whole match), so titles containing an ampersand need
70
+ no escaping::
71
+
72
+ $ subliminal download -l pl \
73
+ --name 's/.*_-_([0-9]+)_.*/Panty & Stocking with Garterbelt S01E\1.mkv/' \
74
+ *Garterbelt_-_*.mkv
75
+
76
+ The substitution is applied to the path of each file (after the optional conversion to an absolute path
77
+ with ``--use-absolute-path``), so the pattern can also match parent directories. Any file whose path does
78
+ not match is left untouched and scanned as-is.
79
+
55
80
  Nautilus/Nemo integration
56
81
  -------------------------
57
82
  See the dedicated `project page <https://github.com/Diaoul/nautilus-subliminal>`_ for more information.
@@ -53,7 +53,7 @@ description = "build and check documentation"
53
53
  dev-mode = false
54
54
  features = ["docs"]
55
55
  # Keep in sync with CI.yaml/docs, tox/docs and .readthedocs.yaml.
56
- python = "3.12"
56
+ python = "3.13"
57
57
 
58
58
  [envs.docs.scripts]
59
59
  build = "sphinx-build -n -T -W --keep-going --color -b html docs docs/_build/html"
@@ -80,7 +80,7 @@ description = "Run the tests suite"
80
80
  features = ["tests"]
81
81
 
82
82
  [[envs.tests.matrix]]
83
- python = ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
83
+ python = ["3.10", "3.11", "3.12", "3.13", "3.14"]
84
84
 
85
85
  [envs.tests.env-vars]
86
86
  COVERAGE_PROCESS_START = "pyproject.toml"
@@ -7,7 +7,7 @@ build-backend = "hatchling.build"
7
7
  [project]
8
8
  name = "subliminal"
9
9
  description = "Subtitles, faster than your thoughts"
10
- requires-python = ">=3.9"
10
+ requires-python = ">=3.10"
11
11
  readme = "README.rst"
12
12
  license = { text = "MIT" }
13
13
  authors = [{ name = "Antoine Bertin", email = "diaoulael@gmail.com" }]
@@ -24,7 +24,6 @@ classifiers = [
24
24
  "Operating System :: OS Independent",
25
25
  "Programming Language :: Python",
26
26
  "Programming Language :: Python :: 3",
27
- "Programming Language :: Python :: 3.9",
28
27
  "Programming Language :: Python :: 3.10",
29
28
  "Programming Language :: Python :: 3.11",
30
29
  "Programming Language :: Python :: 3.12",
@@ -75,7 +74,6 @@ tests = [
75
74
  "colorama", # used in scripts/
76
75
  "vcrpy>=5", # keep synchronized with docs dependencies
77
76
  "win32-setctime; sys_platform=='win32'",
78
- "importlib_metadata>=4.6; python_version<'3.10'",
79
77
  ]
80
78
  types = [
81
79
  "mypy",
@@ -9,7 +9,7 @@ import warnings
9
9
  from pathlib import Path
10
10
  from zipfile import BadZipfile
11
11
 
12
- from guessit import guessit # type: ignore[import-untyped]
12
+ from subliminal.utils import safely_guessit
13
13
 
14
14
  from .exceptions import ArchiveError
15
15
  from .video import VIDEO_EXTENSIONS, Video
@@ -131,7 +131,7 @@ def scan_archive_rar(path: str | os.PathLike, name: str | None = None) -> Video:
131
131
  video_path = os.path.join(dir_path, video_filename)
132
132
 
133
133
  repl = name if name else video_path
134
- video = Video.fromguess(video_path, guessit(repl))
134
+ video = Video.fromguess(video_path, safely_guessit(repl))
135
135
 
136
136
  # size
137
137
  video.size = file_info.file_size