mkv-episode-matcher 0.1.11__tar.gz → 0.1.13__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.

Potentially problematic release.


This version of mkv-episode-matcher might be problematic. Click here for more details.

Files changed (133) hide show
  1. mkv_episode_matcher-0.1.13/.python-version +1 -0
  2. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/PKG-INFO +10 -13
  3. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/episode_matcher.py +38 -14
  4. mkv_episode_matcher-0.1.13/mkv_episode_matcher/notebooks/whisper.ipynb +122 -0
  5. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/utils.py +5 -0
  6. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/PKG-INFO +10 -13
  7. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/SOURCES.txt +3 -1
  8. mkv_episode_matcher-0.1.13/mkv_episode_matcher.egg-info/requires.txt +8 -0
  9. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/pyproject.toml +10 -16
  10. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/setup.cfg +1 -1
  11. mkv_episode_matcher-0.1.13/uv.lock +395 -0
  12. mkv_episode_matcher-0.1.11/mkv_episode_matcher/requirements.txt +0 -7
  13. mkv_episode_matcher-0.1.11/mkv_episode_matcher.egg-info/requires.txt +0 -7
  14. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.gitattributes +0 -0
  15. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.github/funding.yml +0 -0
  16. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.github/workflows/python-publish.yml +0 -0
  17. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.gitignore +0 -0
  18. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.gitmodules +0 -0
  19. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.readthedocs.yml +0 -0
  20. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.vscode/settings.json +0 -0
  21. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/README.rst +0 -0
  22. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.1-py3-none-any.whl +0 -0
  23. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.1.tar.gz +0 -0
  24. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.2-py3-none-any.whl +0 -0
  25. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.2.tar.gz +0 -0
  26. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.3-py3-none-any.whl +0 -0
  27. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.3.tar.gz +0 -0
  28. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.4-py3-none-any.whl +0 -0
  29. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.4.tar.gz +0 -0
  30. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.5-py3-none-any.whl +0 -0
  31. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.5.tar.gz +0 -0
  32. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/Makefile +0 -0
  33. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/doctrees/environment.pickle +0 -0
  34. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/doctrees/index.doctree +0 -0
  35. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.buildinfo +0 -0
  36. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/api.doctree +0 -0
  37. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/environment.pickle +0 -0
  38. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/generated/mkv_episode_matcher.doctree +0 -0
  39. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/index.doctree +0 -0
  40. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/mkv_episode_matcher.doctree +0 -0
  41. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/readme.doctree +0 -0
  42. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/api.rst.txt +0 -0
  43. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/generated/mkv_episode_matcher.rst.txt +0 -0
  44. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/index.rst.txt +0 -0
  45. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/mkv_episode_matcher.rst.txt +0 -0
  46. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/readme.rst.txt +0 -0
  47. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  48. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/alabaster.css +0 -0
  49. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/basic.css +0 -0
  50. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/badge_only.css +0 -0
  51. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  52. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  53. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  54. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  55. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  56. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  57. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  58. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  59. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  60. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  61. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  62. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  63. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  64. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  65. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  66. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  67. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  68. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/theme.css +0 -0
  69. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/custom.css +0 -0
  70. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/debug.css +0 -0
  71. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/doctools.js +0 -0
  72. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/documentation_options.js +0 -0
  73. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/file.png +0 -0
  74. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/jquery.js +0 -0
  75. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/js/badge_only.js +0 -0
  76. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  77. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/js/html5shiv.min.js +0 -0
  78. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/js/theme.js +0 -0
  79. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/language_data.js +0 -0
  80. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/minus.png +0 -0
  81. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/plus.png +0 -0
  82. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/pygments.css +0 -0
  83. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  84. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/scripts/furo.js +0 -0
  85. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +0 -0
  86. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/scripts/furo.js.map +0 -0
  87. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/searchtools.js +0 -0
  88. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/skeleton.css +0 -0
  89. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/sphinx_highlight.js +0 -0
  90. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/styles/furo-extensions.css +0 -0
  91. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/styles/furo-extensions.css.map +0 -0
  92. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/styles/furo.css +0 -0
  93. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/styles/furo.css.map +0 -0
  94. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/api.html +0 -0
  95. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/generated/mkv_episode_matcher.html +0 -0
  96. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/genindex.html +0 -0
  97. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/index.html +0 -0
  98. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/mkv_episode_matcher.html +0 -0
  99. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/objects.inv +0 -0
  100. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/py-modindex.html +0 -0
  101. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/readme.html +0 -0
  102. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/search.html +0 -0
  103. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/searchindex.js +0 -0
  104. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/api.rst +0 -0
  105. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/conf.py +0 -0
  106. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/generated/mkv_episode_matcher.rst +0 -0
  107. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/index.rst +0 -0
  108. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/make.bat +0 -0
  109. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/mkv_episode_matcher.rst +0 -0
  110. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/readme.rst +0 -0
  111. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/requirements.txt +0 -0
  112. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/.gitattributes +0 -0
  113. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/__init__.py +0 -0
  114. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/__main__.py +0 -0
  115. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/config.py +0 -0
  116. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/.gitignore +0 -0
  117. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/SubZero.py +0 -0
  118. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/dictionaries/data.py +0 -0
  119. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/post_processing.py +0 -0
  120. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/README.md +0 -0
  121. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/__init__.py +0 -0
  122. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/imagemaker.py +0 -0
  123. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/pgs2srt.py +0 -0
  124. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/pgsreader.py +0 -0
  125. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/requirements.txt +0 -0
  126. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/mkv_to_srt.py +0 -0
  127. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/notebooks/get_subtitles_test.ipynb +0 -0
  128. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/tmdb_client.py +0 -0
  129. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/dependency_links.txt +0 -0
  130. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/entry_points.txt +0 -0
  131. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/top_level.txt +0 -0
  132. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/setup.py +0 -0
  133. {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/tests/__init__.py +0 -0
@@ -0,0 +1 @@
1
+ 3.12
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mkv-episode-matcher
3
- Version: 0.1.11
3
+ Version: 0.1.13
4
4
  Summary: The MKV Episode Matcher is a tool for identifying TV series episodes from MKV files and renaming the files accordingly.
5
5
  Home-page: https://github.com/Jsakkos/mkv-episode-matcher
6
6
  Author: Jonathan Sakkos
@@ -11,22 +11,19 @@ Project-URL: Issues, https://github.com/Jsakkos/mkv-episode-matcher/issues
11
11
  Project-URL: Source, https://github.com/Jsakkos/mkv-episode-matcher
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Programming Language :: Python
14
- Classifier: Programming Language :: Python :: 3.8
15
- Classifier: Programming Language :: Python :: 3.9
16
- Classifier: Programming Language :: Python :: 3.10
17
- Classifier: Programming Language :: Python :: 3.11
18
14
  Classifier: Programming Language :: Python :: 3.12
19
15
  Classifier: Programming Language :: Python :: Implementation :: CPython
20
16
  Classifier: Programming Language :: Python :: Implementation :: PyPy
21
- Requires-Python: >=3.8
17
+ Requires-Python: >=3.12
22
18
  Description-Content-Type: text/x-rst
23
- Requires-Dist: requests
24
- Requires-Dist: loguru
25
- Requires-Dist: pillow
26
- Requires-Dist: configparser
27
- Requires-Dist: tmdb_client
28
- Requires-Dist: pytesseract
29
- Requires-Dist: opensubtitlescom
19
+ Requires-Dist: configparser>=7.1.0
20
+ Requires-Dist: ffmpeg>=1.4
21
+ Requires-Dist: loguru>=0.7.2
22
+ Requires-Dist: numpy>=2.1.3
23
+ Requires-Dist: opensubtitlescom>=0.1.5
24
+ Requires-Dist: pytesseract>=0.3.13
25
+ Requires-Dist: requests>=2.32.3
26
+ Requires-Dist: tmdb-client>=0.0.1
30
27
 
31
28
  ===================
32
29
  MKV Episode Matcher
@@ -8,7 +8,7 @@ from mkv_episode_matcher.__main__ import CACHE_DIR, CONFIG_FILE
8
8
  from mkv_episode_matcher.config import get_config
9
9
  from mkv_episode_matcher.mkv_to_srt import convert_mkv_to_srt
10
10
  from mkv_episode_matcher.tmdb_client import fetch_show_id
11
- from mkv_episode_matcher.utils import check_filename, cleanup_ocr_files, get_subtitles
11
+ from mkv_episode_matcher.utils import check_filename, cleanup_ocr_files, get_subtitles,clean_text
12
12
 
13
13
 
14
14
  # hash_data = {}
@@ -16,46 +16,70 @@ from mkv_episode_matcher.utils import check_filename, cleanup_ocr_files, get_sub
16
16
  def process_show(season=None, dry_run=False, get_subs=False):
17
17
  """
18
18
  Process the show by downloading episode images and finding matching episodes.
19
-
20
19
  Args:
21
20
  season (int, optional): The season number to process. If provided, only that season will be processed. Defaults to None.
22
- force (bool, optional): Whether to force re-processing of episodes even if they already exist. Defaults to False.
23
21
  dry_run (bool, optional): Whether to perform a dry run without actually processing the episodes. Defaults to False.
24
- threshold (float, optional): The threshold value for matching episodes. Defaults to None.
22
+ get_subs (bool, optional): Whether to download subtitles for the episodes. Defaults to False.
25
23
  """
26
24
  config = get_config(CONFIG_FILE)
27
25
  show_dir = config.get("show_dir")
28
- show_name = os.path.basename(show_dir)
26
+ show_name = clean_text(os.path.basename(show_dir))
29
27
  logger.info(f"Processing show '{show_name}'...")
28
+
30
29
  show_id = fetch_show_id(show_name)
31
-
32
30
  if show_id is None:
33
31
  logger.error(f"Could not find show '{os.path.basename(show_dir)}' on TMDb.")
34
32
  return
33
+
34
+ # Get all season directories
35
35
  season_paths = [
36
36
  os.path.join(show_dir, d)
37
37
  for d in os.listdir(show_dir)
38
38
  if os.path.isdir(os.path.join(show_dir, d))
39
39
  ]
40
+
41
+ # Filter seasons to only include those with .mkv files
42
+ valid_season_paths = []
43
+ for season_path in season_paths:
44
+ mkv_files = [
45
+ f for f in os.listdir(season_path)
46
+ if f.endswith(".mkv")
47
+ ]
48
+ if mkv_files:
49
+ valid_season_paths.append(season_path)
50
+
51
+ if not valid_season_paths:
52
+ logger.warning(f"No seasons with .mkv files found in show '{show_name}'")
53
+ return
54
+
40
55
  logger.info(
41
- f"Found {len(season_paths)} seasons for show '{os.path.basename(show_dir)}'"
56
+ f"Found {len(valid_season_paths)} seasons with .mkv files for show '{show_name}'"
42
57
  )
58
+
59
+ # Extract season numbers from valid paths
43
60
  seasons_to_process = [
44
- int(os.path.basename(season_path).split()[-1]) for season_path in season_paths
61
+ int(os.path.basename(season_path).split()[-1])
62
+ for season_path in valid_season_paths
45
63
  ]
64
+
46
65
  if get_subs:
47
66
  get_subtitles(show_id, seasons=set(seasons_to_process))
67
+
48
68
  if season is not None:
69
+ # If specific season requested, check if it has .mkv files
70
+ season_path = os.path.join(show_dir, f"Season {season}")
71
+ if season_path not in valid_season_paths:
72
+ logger.warning(f"Season {season} has no .mkv files to process")
73
+ return
74
+
49
75
  mkv_files = [
50
- os.path.join(show_dir, season)
51
- for f in os.listdir(show_dir)
76
+ os.path.join(season_path, f)
77
+ for f in os.listdir(season_path)
52
78
  if f.endswith(".mkv")
53
79
  ]
54
-
55
- season_path = os.path.join(show_dir, f"Season {season}")
56
80
  else:
57
- for season_path in os.listdir(show_dir):
58
- season_path = os.path.join(show_dir, season_path)
81
+ # Process all valid seasons
82
+ for season_path in valid_season_paths:
59
83
  mkv_files = [
60
84
  os.path.join(season_path, f)
61
85
  for f in os.listdir(season_path)
@@ -0,0 +1,122 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [
8
+ {
9
+ "ename": "OSError",
10
+ "evalue": "[WinError 126] The specified module could not be found. Error loading \"c:\\Users\\Jonathan\\anaconda3\\envs\\whisper\\Lib\\site-packages\\torch\\lib\\fbgemm.dll\" or one of its dependencies.",
11
+ "output_type": "error",
12
+ "traceback": [
13
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
14
+ "\u001b[1;31mOSError\u001b[0m Traceback (most recent call last)",
15
+ "Cell \u001b[1;32mIn[1], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mwhisper\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mos\u001b[39;00m\n",
16
+ "File \u001b[1;32mc:\\Users\\Jonathan\\anaconda3\\envs\\whisper\\Lib\\site-packages\\whisper\\__init__.py:8\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mwarnings\u001b[39;00m\n\u001b[0;32m 6\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtyping\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m List, Optional, Union\n\u001b[1;32m----> 8\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mtorch\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mtqdm\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m tqdm\n\u001b[0;32m 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01maudio\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m load_audio, log_mel_spectrogram, pad_or_trim\n",
17
+ "File \u001b[1;32mc:\\Users\\Jonathan\\anaconda3\\envs\\whisper\\Lib\\site-packages\\torch\\__init__.py:148\u001b[0m\n\u001b[0;32m 146\u001b[0m err \u001b[38;5;241m=\u001b[39m ctypes\u001b[38;5;241m.\u001b[39mWinError(ctypes\u001b[38;5;241m.\u001b[39mget_last_error())\n\u001b[0;32m 147\u001b[0m err\u001b[38;5;241m.\u001b[39mstrerror \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m Error loading \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdll\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m or one of its dependencies.\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m--> 148\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err\n\u001b[0;32m 150\u001b[0m kernel32\u001b[38;5;241m.\u001b[39mSetErrorMode(prev_error_mode)\n\u001b[0;32m 153\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_preload_cuda_deps\u001b[39m(lib_folder, lib_name):\n",
18
+ "\u001b[1;31mOSError\u001b[0m: [WinError 126] The specified module could not be found. Error loading \"c:\\Users\\Jonathan\\anaconda3\\envs\\whisper\\Lib\\site-packages\\torch\\lib\\fbgemm.dll\" or one of its dependencies."
19
+ ]
20
+ }
21
+ ],
22
+ "source": [
23
+ "import whisper\n",
24
+ "import os\n",
25
+ "\n"
26
+ ]
27
+ },
28
+ {
29
+ "cell_type": "code",
30
+ "execution_count": null,
31
+ "metadata": {},
32
+ "outputs": [
33
+ {
34
+ "ename": "",
35
+ "evalue": "",
36
+ "output_type": "error",
37
+ "traceback": [
38
+ "\u001b[1;31mRunning cells with 'MKV-GPU (Python 3.8.10)' requires the ipykernel package.\n",
39
+ "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n",
40
+ "\u001b[1;31mCommand: 'conda install -n MKV-GPU ipykernel --update-deps --force-reinstall'"
41
+ ]
42
+ }
43
+ ],
44
+ "source": [
45
+ "import torch\n",
46
+ "\n",
47
+ "if torch.cuda.is_available():\n",
48
+ " print(f\"CUDA is available. Using GPU: {torch.cuda.get_device_name(0)}\")\n",
49
+ "else:\n",
50
+ " print(\"CUDA is not available. Using CPU.\")\n",
51
+ "\n",
52
+ "# It will print out the GPU that you are using."
53
+ ]
54
+ },
55
+ {
56
+ "cell_type": "code",
57
+ "execution_count": null,
58
+ "metadata": {},
59
+ "outputs": [
60
+ {
61
+ "ename": "",
62
+ "evalue": "",
63
+ "output_type": "error",
64
+ "traceback": [
65
+ "\u001b[1;31mRunning cells with 'MKV-GPU (Python 3.8.10)' requires the ipykernel package.\n",
66
+ "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n",
67
+ "\u001b[1;31mCommand: 'conda install -n MKV-GPU ipykernel --update-deps --force-reinstall'"
68
+ ]
69
+ }
70
+ ],
71
+ "source": [
72
+ "model = whisper.load_model(\"base\") # Replace \"base\" with the desired model size\n",
73
+ "result = model.transcribe(r\"C:\\Users\\Jonathan\\output_audio.wav\")\n",
74
+ "\n",
75
+ "# Print or save the transcription\n",
76
+ "print(result[\"text\"])"
77
+ ]
78
+ },
79
+ {
80
+ "cell_type": "code",
81
+ "execution_count": null,
82
+ "metadata": {},
83
+ "outputs": [
84
+ {
85
+ "ename": "",
86
+ "evalue": "",
87
+ "output_type": "error",
88
+ "traceback": [
89
+ "\u001b[1;31mRunning cells with 'MKV-GPU (Python 3.8.10)' requires the ipykernel package.\n",
90
+ "\u001b[1;31mRun the following command to install 'ipykernel' into the Python environment. \n",
91
+ "\u001b[1;31mCommand: 'conda install -n MKV-GPU ipykernel --update-deps --force-reinstall'"
92
+ ]
93
+ }
94
+ ],
95
+ "source": [
96
+ "# ffmpeg -i \"E:\\Video\\Seinfeld\\Season 5\\Seinfeld - Season 5 (Disc 1)-A1_t02.mkv\" -t 300 -map 0:a:0 -acodec pcm_s16le -ac 1 output_audio.wav\n",
97
+ "# works for make a .wav file of the first 5 mins"
98
+ ]
99
+ }
100
+ ],
101
+ "metadata": {
102
+ "kernelspec": {
103
+ "display_name": "mkv",
104
+ "language": "python",
105
+ "name": "python3"
106
+ },
107
+ "language_info": {
108
+ "codemirror_mode": {
109
+ "name": "ipython",
110
+ "version": 3
111
+ },
112
+ "file_extension": ".py",
113
+ "mimetype": "text/x-python",
114
+ "name": "python",
115
+ "nbconvert_exporter": "python",
116
+ "pygments_lexer": "ipython3",
117
+ "version": "3.11.9"
118
+ }
119
+ },
120
+ "nbformat": 4,
121
+ "nbformat_minor": 2
122
+ }
@@ -229,3 +229,8 @@ def cleanup_ocr_files(show_dir):
229
229
  if os.path.exists(ocr_dir_path):
230
230
  logger.info(f"Cleaning up OCR files in {ocr_dir_path}")
231
231
  shutil.rmtree(ocr_dir_path)
232
+ def clean_text(text):
233
+ # Remove brackets, parentheses, and their content
234
+ cleaned_text = re.sub(r'\[.*?\]|\(.*?\)|\{.*?\}', '', text)
235
+ # Strip leading/trailing whitespace
236
+ return cleaned_text.strip()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mkv-episode-matcher
3
- Version: 0.1.11
3
+ Version: 0.1.13
4
4
  Summary: The MKV Episode Matcher is a tool for identifying TV series episodes from MKV files and renaming the files accordingly.
5
5
  Home-page: https://github.com/Jsakkos/mkv-episode-matcher
6
6
  Author: Jonathan Sakkos
@@ -11,22 +11,19 @@ Project-URL: Issues, https://github.com/Jsakkos/mkv-episode-matcher/issues
11
11
  Project-URL: Source, https://github.com/Jsakkos/mkv-episode-matcher
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Programming Language :: Python
14
- Classifier: Programming Language :: Python :: 3.8
15
- Classifier: Programming Language :: Python :: 3.9
16
- Classifier: Programming Language :: Python :: 3.10
17
- Classifier: Programming Language :: Python :: 3.11
18
14
  Classifier: Programming Language :: Python :: 3.12
19
15
  Classifier: Programming Language :: Python :: Implementation :: CPython
20
16
  Classifier: Programming Language :: Python :: Implementation :: PyPy
21
- Requires-Python: >=3.8
17
+ Requires-Python: >=3.12
22
18
  Description-Content-Type: text/x-rst
23
- Requires-Dist: requests
24
- Requires-Dist: loguru
25
- Requires-Dist: pillow
26
- Requires-Dist: configparser
27
- Requires-Dist: tmdb_client
28
- Requires-Dist: pytesseract
29
- Requires-Dist: opensubtitlescom
19
+ Requires-Dist: configparser>=7.1.0
20
+ Requires-Dist: ffmpeg>=1.4
21
+ Requires-Dist: loguru>=0.7.2
22
+ Requires-Dist: numpy>=2.1.3
23
+ Requires-Dist: opensubtitlescom>=0.1.5
24
+ Requires-Dist: pytesseract>=0.3.13
25
+ Requires-Dist: requests>=2.32.3
26
+ Requires-Dist: tmdb-client>=0.0.1
30
27
 
31
28
  ===================
32
29
  MKV Episode Matcher
@@ -1,11 +1,13 @@
1
1
  .gitattributes
2
2
  .gitignore
3
3
  .gitmodules
4
+ .python-version
4
5
  .readthedocs.yml
5
6
  README.rst
6
7
  pyproject.toml
7
8
  setup.cfg
8
9
  setup.py
10
+ uv.lock
9
11
  .github/funding.yml
10
12
  .github/workflows/python-publish.yml
11
13
  .vscode/settings.json
@@ -105,7 +107,6 @@ mkv_episode_matcher/__main__.py
105
107
  mkv_episode_matcher/config.py
106
108
  mkv_episode_matcher/episode_matcher.py
107
109
  mkv_episode_matcher/mkv_to_srt.py
108
- mkv_episode_matcher/requirements.txt
109
110
  mkv_episode_matcher/tmdb_client.py
110
111
  mkv_episode_matcher/utils.py
111
112
  mkv_episode_matcher.egg-info/PKG-INFO
@@ -125,4 +126,5 @@ mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/SubZero.py
125
126
  mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/post_processing.py
126
127
  mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/dictionaries/data.py
127
128
  mkv_episode_matcher/notebooks/get_subtitles_test.ipynb
129
+ mkv_episode_matcher/notebooks/whisper.ipynb
128
130
  tests/__init__.py
@@ -0,0 +1,8 @@
1
+ configparser>=7.1.0
2
+ ffmpeg>=1.4
3
+ loguru>=0.7.2
4
+ numpy>=2.1.3
5
+ opensubtitlescom>=0.1.5
6
+ pytesseract>=0.3.13
7
+ requests>=2.32.3
8
+ tmdb-client>=0.0.1
@@ -10,32 +10,27 @@ name = "mkv-episode-matcher"
10
10
  description = "The MKV Episode Matcher is a tool for identifying TV series episodes from MKV files and renaming the files accordingly."
11
11
  dynamic = ["version"]
12
12
  readme = "README.rst"
13
- requires-python = ">=3.8"
14
- license = { text = "MIT" }
15
- keywords = []
16
13
  authors = [
17
14
  { name = "Jsakkos", email = "jonathansakkos@protonmail.com" },
18
15
  ]
16
+ requires-python = ">=3.12"
17
+ license = { text = "MIT" }
19
18
  classifiers = [
20
19
  "Development Status :: 4 - Beta",
21
20
  "Programming Language :: Python",
22
- "Programming Language :: Python :: 3.8",
23
- "Programming Language :: Python :: 3.9",
24
- "Programming Language :: Python :: 3.10",
25
- "Programming Language :: Python :: 3.11",
26
21
  "Programming Language :: Python :: 3.12",
27
22
  "Programming Language :: Python :: Implementation :: CPython",
28
23
  "Programming Language :: Python :: Implementation :: PyPy",
29
24
  ]
30
-
31
25
  dependencies = [
32
- "requests",
33
- "loguru",
34
- "pillow",
35
- "configparser",
36
- "tmdb_client",
37
- "pytesseract",
38
- "opensubtitlescom",
26
+ "configparser>=7.1.0",
27
+ "ffmpeg>=1.4",
28
+ "loguru>=0.7.2",
29
+ "numpy>=2.1.3",
30
+ "opensubtitlescom>=0.1.5",
31
+ "pytesseract>=0.3.13",
32
+ "requests>=2.32.3",
33
+ "tmdb-client>=0.0.1",
39
34
  ]
40
35
 
41
36
  [project.urls]
@@ -69,7 +64,6 @@ omit = [
69
64
  ]
70
65
 
71
66
  [tool.coverage.paths]
72
- calcy = ["mkv-episode-matcher/mkv_episode_matcher", "*/mkv-episode-matcher/mkv_episode_matcher"]
73
67
  tests = ["tests", "*/mkv_episode_matcher/tests"]
74
68
 
75
69
  [tool.coverage.report]
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = mkv_episode_matcher
3
- version = 0.1.11
3
+ version = 0.1.13
4
4
  author = Jonathan Sakkos
5
5
  author_email = jonathansakkos@protonmail.com
6
6
  description = The MKV Episode Matcher is a tool for identifying TV series episodes from MKV files and renaming the files accordingly.