subliminal 2.6.0__tar.gz → 2.7.1__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.1}/.github/actions/prepare-tests/action.yaml +4 -4
  2. {subliminal-2.6.0 → subliminal-2.7.1}/.github/workflows/CI.yaml +66 -24
  3. {subliminal-2.6.0 → subliminal-2.7.1}/.github/workflows/docker-build.yaml +8 -8
  4. {subliminal-2.6.0 → subliminal-2.7.1}/.github/workflows/prepare-release-pr.yaml +2 -2
  5. {subliminal-2.6.0 → subliminal-2.7.1}/.github/workflows/publish-release.yaml +5 -5
  6. {subliminal-2.6.0 → subliminal-2.7.1}/.github/workflows/publish.yaml +2 -2
  7. {subliminal-2.6.0 → subliminal-2.7.1}/.github/workflows/scheduled-tests.yaml +2 -2
  8. {subliminal-2.6.0 → subliminal-2.7.1}/.github/workflows/tag-release.yaml +2 -2
  9. subliminal-2.7.1/.github/zizmor.yml +11 -0
  10. {subliminal-2.6.0 → subliminal-2.7.1}/.pre-commit-config.yaml +4 -4
  11. subliminal-2.7.1/.python-version-default +1 -0
  12. {subliminal-2.6.0 → subliminal-2.7.1}/.readthedocs.yaml +2 -2
  13. {subliminal-2.6.0 → subliminal-2.7.1}/HISTORY.rst +44 -0
  14. {subliminal-2.6.0 → subliminal-2.7.1}/PKG-INFO +3 -4
  15. {subliminal-2.6.0 → subliminal-2.7.1}/docs/assets/config.toml +1 -1
  16. {subliminal-2.6.0 → subliminal-2.7.1}/docs/user/configuration_file.rst +11 -4
  17. {subliminal-2.6.0 → subliminal-2.7.1}/docs/user/usage.rst +25 -0
  18. {subliminal-2.6.0 → subliminal-2.7.1}/hatch.toml +2 -2
  19. {subliminal-2.6.0 → subliminal-2.7.1}/pyproject.toml +2 -3
  20. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/archives.py +2 -2
  21. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/cli/cli.py +10 -3
  22. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/cli/commands/download_best.py +87 -15
  23. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/cli/generate_config.py +9 -2
  24. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/cli/helpers.py +124 -4
  25. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/core.py +16 -25
  26. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/addic7ed.py +2 -3
  27. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/gestdown.py +11 -51
  28. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/mock.py +2 -2
  29. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/opensubtitles.py +3 -4
  30. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/opensubtitlescom.py +17 -77
  31. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/podnapisi.py +2 -2
  32. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/subtis.py +3 -3
  33. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/subtitulamos.py +2 -2
  34. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/tvsubtitles.py +16 -32
  35. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/refiners/hash.py +2 -2
  36. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/refiners/metadata.py +6 -4
  37. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/refiners/tvdb.py +6 -2
  38. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/subtitle.py +142 -66
  39. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/utils.py +271 -4
  40. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/video.py +4 -6
  41. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_list_subtitles_episode_alternative_series.yaml +66 -51
  42. subliminal-2.7.1/tests/cassettes/providers/test_download_best_subtitles.yaml +1097 -0
  43. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cli/test_download.py +264 -4
  44. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cli/test_helpers.py +26 -1
  45. {subliminal-2.6.0 → subliminal-2.7.1}/tests/conftest.py +2 -1
  46. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_gestdown.py +1 -0
  47. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_providers.py +1 -1
  48. {subliminal-2.6.0 → subliminal-2.7.1}/tests/refiners/test_metadata.py +3 -3
  49. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_extensions.py +1 -7
  50. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_provider_pool.py +3 -3
  51. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_subtitle.py +115 -26
  52. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_utils.py +224 -0
  53. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_video.py +10 -2
  54. {subliminal-2.6.0 → subliminal-2.7.1}/tox.ini +4 -4
  55. subliminal-2.6.0/.github/zizmor.yml +0 -13
  56. subliminal-2.6.0/.python-version-default +0 -1
  57. subliminal-2.6.0/tests/cassettes/providers/test_download_best_subtitles.yaml +0 -966
  58. {subliminal-2.6.0 → subliminal-2.7.1}/.dockerignore +0 -0
  59. {subliminal-2.6.0 → subliminal-2.7.1}/.github/workflows/coverage.yaml +0 -0
  60. {subliminal-2.6.0 → subliminal-2.7.1}/.gitignore +0 -0
  61. {subliminal-2.6.0 → subliminal-2.7.1}/CONTRIBUTING.md +0 -0
  62. {subliminal-2.6.0 → subliminal-2.7.1}/Dockerfile +0 -0
  63. {subliminal-2.6.0 → subliminal-2.7.1}/LICENSE +0 -0
  64. {subliminal-2.6.0 → subliminal-2.7.1}/MANIFEST.in +0 -0
  65. {subliminal-2.6.0 → subliminal-2.7.1}/README.rst +0 -0
  66. {subliminal-2.6.0 → subliminal-2.7.1}/RELEASING.md +0 -0
  67. {subliminal-2.6.0 → subliminal-2.7.1}/changelog.d/.gitignore +0 -0
  68. {subliminal-2.6.0 → subliminal-2.7.1}/docs/Makefile +0 -0
  69. {subliminal-2.6.0 → subliminal-2.7.1}/docs/_intersphinx/README.md +0 -0
  70. {subliminal-2.6.0 → subliminal-2.7.1}/docs/_intersphinx/importlib_metadata_objects.inv +0 -0
  71. {subliminal-2.6.0 → subliminal-2.7.1}/docs/_intersphinx/importlib_metadata_objects.txt +0 -0
  72. {subliminal-2.6.0 → subliminal-2.7.1}/docs/_static/.gitignore +0 -0
  73. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/cache.rst +0 -0
  74. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/cli.rst +0 -0
  75. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/core.rst +0 -0
  76. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/exceptions.rst +0 -0
  77. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/extensions.rst +0 -0
  78. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/providers.rst +0 -0
  79. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/refiners.rst +0 -0
  80. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/score.rst +0 -0
  81. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/subtitle.rst +0 -0
  82. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/utils.rst +0 -0
  83. {subliminal-2.6.0 → subliminal-2.7.1}/docs/api/video.rst +0 -0
  84. {subliminal-2.6.0 → subliminal-2.7.1}/docs/assets/demo.gif +0 -0
  85. {subliminal-2.6.0 → subliminal-2.7.1}/docs/cassettes/test_usage.yaml +0 -0
  86. {subliminal-2.6.0 → subliminal-2.7.1}/docs/conf.py +0 -0
  87. {subliminal-2.6.0 → subliminal-2.7.1}/docs/conftest.py +0 -0
  88. {subliminal-2.6.0 → subliminal-2.7.1}/docs/index.rst +0 -0
  89. {subliminal-2.6.0 → subliminal-2.7.1}/docs/make.bat +0 -0
  90. {subliminal-2.6.0 → subliminal-2.7.1}/docs/user/changelog.rst +0 -0
  91. {subliminal-2.6.0 → subliminal-2.7.1}/docs/user/cli.rst +0 -0
  92. {subliminal-2.6.0 → subliminal-2.7.1}/docs/user/how_it_works.rst +0 -0
  93. {subliminal-2.6.0 → subliminal-2.7.1}/docs/user/installation.rst +0 -0
  94. {subliminal-2.6.0 → subliminal-2.7.1}/docs/user/provider_guide.rst +0 -0
  95. {subliminal-2.6.0 → subliminal-2.7.1}/scripts/.gitignore +0 -0
  96. {subliminal-2.6.0 → subliminal-2.7.1}/scripts/prepare-release-pr.py +0 -0
  97. {subliminal-2.6.0 → subliminal-2.7.1}/scripts/prepare_tests.py +0 -0
  98. {subliminal-2.6.0 → subliminal-2.7.1}/scripts/release.py +0 -0
  99. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/__init__.py +0 -0
  100. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/__main__.py +0 -0
  101. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/cache.py +0 -0
  102. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/cli/__init__.py +0 -0
  103. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/cli/commands/__init__.py +0 -0
  104. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/cli/commands/_format.py +0 -0
  105. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/converters/__init__.py +0 -0
  106. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/converters/addic7ed.py +0 -0
  107. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/converters/opensubtitles.py +0 -0
  108. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/converters/opensubtitlescom.py +0 -0
  109. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/converters/subtitulamos.py +0 -0
  110. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/converters/tvsubtitles.py +0 -0
  111. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/exceptions.py +0 -0
  112. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/extensions.py +0 -0
  113. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/matches.py +0 -0
  114. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/__init__.py +0 -0
  115. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/bsplayer.py +0 -0
  116. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/providers/napiprojekt.py +0 -0
  117. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/py.typed +0 -0
  118. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/refiners/__init__.py +0 -0
  119. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/refiners/omdb.py +0 -0
  120. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/refiners/tmdb.py +0 -0
  121. {subliminal-2.6.0 → subliminal-2.7.1}/src/subliminal/score.py +0 -0
  122. {subliminal-2.6.0 → subliminal-2.7.1}/tests/__init__.py +0 -0
  123. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_download_subtitle.yaml +0 -0
  124. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_get_show_id.yaml +0 -0
  125. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_get_show_id_country.yaml +0 -0
  126. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_get_show_id_quote_dots_mixed_case.yaml +0 -0
  127. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_get_show_id_with_comma.yaml +0 -0
  128. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_get_show_id_year.yaml +0 -0
  129. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_get_show_ids.yaml +0 -0
  130. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_list_subtitles.yaml +0 -0
  131. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_list_subtitles_episode_alternative_series.yaml +0 -0
  132. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_list_subtitles_show_with_asterisk.yaml +0 -0
  133. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_query.yaml +0 -0
  134. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_query_no_year.yaml +0 -0
  135. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_query_parsing.yaml +0 -0
  136. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_query_parsing_colon.yaml +0 -0
  137. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_query_parsing_dash.yaml +0 -0
  138. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_query_parsing_quote_dots_mixed_case.yaml +0 -0
  139. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_query_wrong_series.yaml +0 -0
  140. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/addic7ed/test_query_year.yaml +0 -0
  141. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/bsplayer/test_download_subtitle.yaml +0 -0
  142. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/bsplayer/test_list_subtitles_hash.yaml +0 -0
  143. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/bsplayer/test_login.yaml +0 -0
  144. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/bsplayer/test_logout.yaml +0 -0
  145. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/bsplayer/test_query_hash_size.yaml +0 -0
  146. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/cli/test_cli_download.yaml +0 -0
  147. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_download_subtitle.yaml +0 -0
  148. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_download_with_bom.yaml +0 -0
  149. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_get_title_and_show_id_alternative_name.yaml +0 -0
  150. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_get_title_and_show_id_no_year.yaml +0 -0
  151. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_get_title_and_show_id_only_title.yaml +0 -0
  152. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_get_title_and_show_id_with_tvdb_id.yaml +0 -0
  153. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_list_subtitles.yaml +0 -0
  154. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_query.yaml +0 -0
  155. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_query_all_series.yaml +0 -0
  156. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_query_no_language.yaml +0 -0
  157. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_query_parsing.yaml +0 -0
  158. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_query_parsing_colon.yaml +0 -0
  159. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_query_parsing_dash.yaml +0 -0
  160. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_query_parsing_quote_dots_mixed_case.yaml +0 -0
  161. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_query_wrong_series.yaml +0 -0
  162. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_search_show_id.yaml +0 -0
  163. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_search_show_id_error.yaml +0 -0
  164. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_search_show_id_incomplete.yaml +0 -0
  165. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_search_show_id_no_year.yaml +0 -0
  166. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_search_show_id_quote.yaml +0 -0
  167. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_search_show_series_tvdb_id.yaml +0 -0
  168. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/gestdown/test_show_with_asterisk.yaml +0 -0
  169. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/napiprojekt/test_download_subtitles.yaml +0 -0
  170. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/napiprojekt/test_list_subtitles.yaml +0 -0
  171. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/napiprojekt/test_query_microdvd.yaml +0 -0
  172. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/napiprojekt/test_query_srt.yaml +0 -0
  173. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/napiprojekt/test_query_srt_reencode.yaml +0 -0
  174. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/napiprojekt/test_query_wrong_hash.yaml +0 -0
  175. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_get_id.yaml +0 -0
  176. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_get_title.yaml +0 -0
  177. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_get_wrong_id.yaml +0 -0
  178. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_get_wrong_title.yaml +0 -0
  179. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_refine_episode.yaml +0 -0
  180. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_refine_episode_original_series.yaml +0 -0
  181. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_refine_episode_with_country.yaml +0 -0
  182. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_refine_episode_with_country_hoc_us.yaml +0 -0
  183. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_refine_episode_year.yaml +0 -0
  184. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_refine_movie.yaml +0 -0
  185. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_refine_movie_guess_alternative_title.yaml +0 -0
  186. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_search.yaml +0 -0
  187. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_search_page.yaml +0 -0
  188. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_search_type.yaml +0 -0
  189. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_search_wrong_title.yaml +0 -0
  190. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/omdb/test_search_year.yaml +0 -0
  191. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_download_subtitle.yaml +0 -0
  192. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_list_subtitles_episode.yaml +0 -0
  193. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_list_subtitles_movie.yaml +0 -0
  194. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_list_subtitles_movie_no_hash.yaml +0 -0
  195. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_login_bad_password.yaml +0 -0
  196. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_login_vip_bad_password.yaml +0 -0
  197. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_login_vip_login.yaml +0 -0
  198. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_no_operation.yaml +0 -0
  199. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_query_hash_size.yaml +0 -0
  200. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_query_imdb_id.yaml +0 -0
  201. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_query_not_enough_information.yaml +0 -0
  202. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_query_query_episode.yaml +0 -0
  203. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_query_query_movie.yaml +0 -0
  204. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_query_query_season_episode.yaml +0 -0
  205. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitles/test_query_wrong_hash_wrong_size.yaml +0 -0
  206. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_download_subtitle.yaml +0 -0
  207. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_list_subtitles_episode.yaml +0 -0
  208. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_list_subtitles_movie.yaml +0 -0
  209. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_list_subtitles_movie_no_hash.yaml +0 -0
  210. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_login.yaml +0 -0
  211. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_login_bad_password.yaml +0 -0
  212. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_logout.yaml +0 -0
  213. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_query_hash_size.yaml +0 -0
  214. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_query_imdb_id.yaml +0 -0
  215. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_query_max_result_pages.yaml +0 -0
  216. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_query_query_episode.yaml +0 -0
  217. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_query_query_movie.yaml +0 -0
  218. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_query_query_season_episode.yaml +0 -0
  219. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_query_tag_movie.yaml +0 -0
  220. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_query_wrong_hash_wrong_size.yaml +0 -0
  221. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_tag_match.yaml +0 -0
  222. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/opensubtitlescom/test_user_infos.yaml +0 -0
  223. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/podnapisi/test_download_subtitle.yaml +0 -0
  224. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/podnapisi/test_download_subtitles_with_title_unicode.yaml +0 -0
  225. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/podnapisi/test_list_subtitles_episode.yaml +0 -0
  226. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/podnapisi/test_list_subtitles_episode_alternative_series.yaml +0 -0
  227. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/podnapisi/test_list_subtitles_movie.yaml +0 -0
  228. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/podnapisi/test_query_episode.yaml +0 -0
  229. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/podnapisi/test_query_movie.yaml +0 -0
  230. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/providers/test_download_best_subtitles_min_score.yaml +0 -0
  231. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/providers/test_download_best_subtitles_only_one.yaml +0 -0
  232. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/providers/test_list_subtitles_providers_download.yaml +0 -0
  233. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtis/test_download_subtitle.yaml +0 -0
  234. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtis/test_list_subtitles_hash.yaml +0 -0
  235. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtis/test_list_subtitles_movie.yaml +0 -0
  236. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtis/test_list_subtitles_movie_alternative.yaml +0 -0
  237. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtis/test_list_subtitles_movie_with_size.yaml +0 -0
  238. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtis/test_list_subtitles_no_match.yaml +0 -0
  239. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_download_subtitle.yaml +0 -0
  240. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_download_subtitle_first_episode.yaml +0 -0
  241. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_download_subtitle_foo.yaml +0 -0
  242. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_download_subtitle_last_season.yaml +0 -0
  243. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_download_subtitle_year.yaml +0 -0
  244. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_list_subtitles_not_exist_episode.yaml +0 -0
  245. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_list_subtitles_not_exist_language.yaml +0 -0
  246. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_list_subtitles_not_exist_season.yaml +0 -0
  247. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_list_subtitles_not_exist_series.yaml +0 -0
  248. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/subtitulamos/test_list_subtitles_with_spanish_non_mx_search.yaml +0 -0
  249. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_get_movie_id.yaml +0 -0
  250. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_get_movie_id_failed.yaml +0 -0
  251. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_get_series_id.yaml +0 -0
  252. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_get_series_wrong_id.yaml +0 -0
  253. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_refine_episode.yaml +0 -0
  254. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_refine_episode_original_series.yaml +0 -0
  255. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_refine_episode_with_country.yaml +0 -0
  256. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_refine_episode_with_country_hoc_us.yaml +0 -0
  257. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_refine_episode_year.yaml +0 -0
  258. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_refine_movie.yaml +0 -0
  259. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_refine_movie_guess_alternative_title.yaml +0 -0
  260. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_search_movie.yaml +0 -0
  261. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_search_movie_page.yaml +0 -0
  262. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_search_movie_wrong_title.yaml +0 -0
  263. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_search_movie_year.yaml +0 -0
  264. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_search_series.yaml +0 -0
  265. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tmdb/test_search_series_wrong_name.yaml +0 -0
  266. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_get_series.yaml +0 -0
  267. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_get_series_actors.yaml +0 -0
  268. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_get_series_actors_wrong_id.yaml +0 -0
  269. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_get_series_wrong_id.yaml +0 -0
  270. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_login.yaml +0 -0
  271. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_login_error.yaml +0 -0
  272. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_query_series_episodes.yaml +0 -0
  273. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_query_series_episodes_wrong_season.yaml +0 -0
  274. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine.yaml +0 -0
  275. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_ambiguous.yaml +0 -0
  276. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_ambiguous_2.yaml +0 -0
  277. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_episode_alternative_series.yaml +0 -0
  278. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_episode_no_year.yaml +0 -0
  279. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_episode_partial.yaml +0 -0
  280. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_episode_with_comma.yaml +0 -0
  281. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_episode_with_country.yaml +0 -0
  282. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_episode_with_country_hoc_us.yaml +0 -0
  283. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_refine_episode_year.yaml +0 -0
  284. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_search_series.yaml +0 -0
  285. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvdb/test_search_series_wrong_name.yaml +0 -0
  286. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_download_subtitle.yaml +0 -0
  287. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_download_subtitle_with_quote.yaml +0 -0
  288. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_get_episode_ids.yaml +0 -0
  289. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_get_episode_ids_wrong_season.yaml +0 -0
  290. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_list_subtitles.yaml +0 -0
  291. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_list_subtitles_episode_alternative_series.yaml +0 -0
  292. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_query.yaml +0 -0
  293. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_query_no_year.yaml +0 -0
  294. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_query_with_quote.yaml +0 -0
  295. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_query_wrong_episode.yaml +0 -0
  296. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_query_wrong_series.yaml +0 -0
  297. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_search_show_id.yaml +0 -0
  298. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_search_show_id_ambiguous.yaml +0 -0
  299. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_search_show_id_error.yaml +0 -0
  300. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_search_show_id_incomplete.yaml +0 -0
  301. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_search_show_id_no_year.yaml +0 -0
  302. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_search_show_id_uk.yaml +0 -0
  303. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_search_show_id_us.yaml +0 -0
  304. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cassettes/tvsubtitles/test_search_show_id_year_in_title.yaml +0 -0
  305. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cli/test_cli.py +0 -0
  306. {subliminal-2.6.0 → subliminal-2.7.1}/tests/cli/test_generate_config.py +0 -0
  307. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_addic7ed.py +0 -0
  308. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_bsplayer.py +0 -0
  309. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_napiprojekt.py +0 -0
  310. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_opensubtitles.py +0 -0
  311. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_opensubtitlescom.py +0 -0
  312. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_podnapisi.py +0 -0
  313. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_subtis.py +0 -0
  314. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_subtitulamos.py +0 -0
  315. {subliminal-2.6.0 → subliminal-2.7.1}/tests/providers/test_tvsubtitles.py +0 -0
  316. {subliminal-2.6.0 → subliminal-2.7.1}/tests/refiners/test_hash.py +0 -0
  317. {subliminal-2.6.0 → subliminal-2.7.1}/tests/refiners/test_omdb.py +0 -0
  318. {subliminal-2.6.0 → subliminal-2.7.1}/tests/refiners/test_tmdb.py +0 -0
  319. {subliminal-2.6.0 → subliminal-2.7.1}/tests/refiners/test_tvdb.py +0 -0
  320. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_archives.py +0 -0
  321. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_cache.py +0 -0
  322. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_core.py +0 -0
  323. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_matches.py +0 -0
  324. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_provider.py +0 -0
  325. {subliminal-2.6.0 → subliminal-2.7.1}/tests/test_score.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,32 +181,74 @@ 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*
188
188
  include-hidden-files: true
189
189
  if-no-files-found: error
190
190
 
191
+ test-freebsd:
192
+ name: Test on FreeBSD
193
+ runs-on: ubuntu-latest
194
+ needs: prepare-test
195
+ timeout-minutes: 10
196
+ if: github.event_name == 'push'
197
+ steps:
198
+ - uses: actions/checkout@v7
199
+ with:
200
+ persist-credentials: false
201
+ fetch-depth: 0
202
+ - name: Prepare tests
203
+ uses: ./.github/actions/prepare-tests
204
+ - name: Display downloaded files
205
+ run: ls -R tests/data
206
+ - name: Test in FreeBSD
207
+ uses: vmactions/freebsd-vm@v1
208
+ with:
209
+ release: "15.0"
210
+ usesh: true
211
+ prepare: |
212
+ pkg install -y python3 databases/py-sqlite3 devel/py-hatch git-lite
213
+ run: |
214
+ set -e
215
+ PY_VERSION=$(python3 -c 'import platform; print(".".join(platform.python_version_tuple()[:2]))')
216
+ echo "Picked Python ${PY_VERSION}"
217
+ export ENV="tests.py${PY_VERSION}"
218
+ export FORCE_COLOR="1"
219
+ export CI_RUN="yes"
220
+ export COVERAGE_FILE=".coverage.freebsd.${PY_VERSION}"
221
+ hatch -v env create "${ENV}"
222
+ hatch -v run "${ENV}:test-cov"
223
+
224
+ - name: Store coverage file
225
+ uses: actions/upload-artifact@v7
226
+ with:
227
+ name: coverage-freebsd
228
+ path: .coverage*
229
+ include-hidden-files: true
230
+ if-no-files-found: error
231
+
191
232
  coverage:
192
233
  name: Coverage
193
234
  runs-on: ubuntu-latest
194
- needs: test
235
+ needs: [test, test-freebsd]
236
+ if: ${{ !cancelled() && needs.test.result == 'success' && (needs.test-freebsd.result == 'success' || needs.test-freebsd.result == 'skipped') }}
195
237
  permissions:
196
238
  pull-requests: write
197
239
  contents: write
198
240
  steps:
199
- - uses: actions/checkout@v4
241
+ - uses: actions/checkout@v7
200
242
  with:
201
243
  # py-cov-action/python-coverage-comment-action needs git credentials
202
244
  persist-credentials: true
203
- - uses: actions/setup-python@v5
245
+ - uses: actions/setup-python@v6
204
246
  with:
205
247
  python-version-file: .python-version-default
206
248
  - uses: hynek/setup-cached-uv@v2
207
249
 
208
250
  - name: Download coverage data
209
- uses: actions/download-artifact@v4
251
+ uses: actions/download-artifact@v8
210
252
  with:
211
253
  pattern: coverage-*
212
254
  merge-multiple: true
@@ -222,7 +264,7 @@ jobs:
222
264
  coverage report --skip-covered --skip-empty --show-missing --format=markdown >> $GITHUB_STEP_SUMMARY
223
265
 
224
266
  - name: Upload HTML report if check failed.
225
- uses: actions/upload-artifact@v4
267
+ uses: actions/upload-artifact@v7
226
268
  with:
227
269
  name: html-report
228
270
  path: htmlcov
@@ -234,7 +276,7 @@ jobs:
234
276
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
235
277
 
236
278
  - name: Store Pull Request comment to be posted
237
- uses: actions/upload-artifact@v4
279
+ uses: actions/upload-artifact@v7
238
280
  if: steps.coverage_comment.outputs.COMMENT_FILE_WRITTEN == 'true'
239
281
  with:
240
282
  # If you use a different name, update COMMENT_ARTIFACT_NAME accordingly
@@ -247,10 +289,10 @@ jobs:
247
289
  runs-on: ubuntu-latest
248
290
  needs: [build-package, prepare-test]
249
291
  steps:
250
- - uses: actions/checkout@v4
292
+ - uses: actions/checkout@v7
251
293
  with:
252
294
  persist-credentials: false
253
- - uses: actions/setup-python@v5
295
+ - uses: actions/setup-python@v6
254
296
  id: setup
255
297
  with:
256
298
  python-version-file: .python-version-default
@@ -287,7 +329,7 @@ jobs:
287
329
  shell: bash
288
330
 
289
331
  - name: Store coverage file
290
- uses: actions/upload-artifact@v4
332
+ uses: actions/upload-artifact@v7
291
333
  if: ${{ failure() }}
292
334
  with:
293
335
  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,50 @@
2
2
 
3
3
  .. towncrier release notes start
4
4
 
5
+ 2.7.1 (2026-07-22)
6
+ ^^^^^^^^^^^^^^^^^^
7
+
8
+ Misc
9
+ ----
10
+
11
+ - fix test for compatibility with guessit>=4 (`#1368 <https://github.com/Diaoul/subliminal/issues/1368>`__)
12
+ - add CI tests for FreeBSD (`#1370 <https://github.com/Diaoul/subliminal/issues/1370>`__)
13
+
14
+
15
+ 2.7.0 (2026-07-21)
16
+ ^^^^^^^^^^^^^^^^^^
17
+
18
+ Changes
19
+ -------
20
+
21
+ - Rename language_type to category. Deprecate ``--language-type-suffix`` for ``--category-suffix`` (`#1344 <https://github.com/Diaoul/subliminal/issues/1344>`__)
22
+ - make EmbeddedSubtitle subtitle_id unique (`#1347 <https://github.com/Diaoul/subliminal/issues/1347>`__)
23
+ - Safely call Guessit and format output (`#1351 <https://github.com/Diaoul/subliminal/issues/1351>`__)
24
+
25
+
26
+ CLI Changes
27
+ -----------
28
+
29
+ - add a ``--subtitle-categories`` option to replace ``-hi/-HI`` and ``-fo/-FO`` (`#1357 <https://github.com/Diaoul/subliminal/issues/1357>`__)
30
+ - check for undefined or deprecated entries in the config file (`#1358 <https://github.com/Diaoul/subliminal/issues/1358>`__)
31
+ - Allow ``--name`` to be a sed-like ``s/pattern/replacement/flags`` substitution, applied to the path of each
32
+ file individually, to parameterize the guessed name per file (`#1362 <https://github.com/Diaoul/subliminal/issues/1362>`__)
33
+ - allow multiple use of sed-like ``--name`` options (`#1364 <https://github.com/Diaoul/subliminal/issues/1364>`__)
34
+
35
+
36
+ Documentation
37
+ -------------
38
+
39
+ - fix docs for config file with the subtitle_categories option (`#1360 <https://github.com/Diaoul/subliminal/issues/1360>`__)
40
+
41
+
42
+ Misc
43
+ ----
44
+
45
+ - Drop Python 3.9 (`#1345 <https://github.com/Diaoul/subliminal/issues/1345>`__)
46
+ - fix gestdown tests (`#1354 <https://github.com/Diaoul/subliminal/issues/1354>`__)
47
+
48
+
5
49
  2.6.0 (2026-02-20)
6
50
  ^^^^^^^^^^^^^^^^^^
7
51
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: subliminal
3
- Version: 2.6.0
3
+ Version: 2.7.1
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,7 @@ 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'
58
+ Requires-Dist: packaging; extra == 'tests'
60
59
  Requires-Dist: pytest-cov; extra == 'tests'
61
60
  Requires-Dist: pytest-xdist; extra == 'tests'
62
61
  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"