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.
- mkv_episode_matcher-0.1.13/.python-version +1 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/PKG-INFO +10 -13
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/episode_matcher.py +38 -14
- mkv_episode_matcher-0.1.13/mkv_episode_matcher/notebooks/whisper.ipynb +122 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/utils.py +5 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/PKG-INFO +10 -13
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/SOURCES.txt +3 -1
- mkv_episode_matcher-0.1.13/mkv_episode_matcher.egg-info/requires.txt +8 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/pyproject.toml +10 -16
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/setup.cfg +1 -1
- mkv_episode_matcher-0.1.13/uv.lock +395 -0
- mkv_episode_matcher-0.1.11/mkv_episode_matcher/requirements.txt +0 -7
- mkv_episode_matcher-0.1.11/mkv_episode_matcher.egg-info/requires.txt +0 -7
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.gitattributes +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.github/funding.yml +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.github/workflows/python-publish.yml +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.gitignore +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.gitmodules +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.readthedocs.yml +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/.vscode/settings.json +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/README.rst +0 -0
- {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
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.1.tar.gz +0 -0
- {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
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.2.tar.gz +0 -0
- {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
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.3.tar.gz +0 -0
- {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
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.4.tar.gz +0 -0
- {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
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/dist/mkv_episode_matcher-0.1.5.tar.gz +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/Makefile +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/doctrees/environment.pickle +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/doctrees/index.doctree +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.buildinfo +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/api.doctree +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/environment.pickle +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/generated/mkv_episode_matcher.doctree +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/index.doctree +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/mkv_episode_matcher.doctree +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/.doctrees/readme.doctree +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/api.rst.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/generated/mkv_episode_matcher.rst.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/index.rst.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/mkv_episode_matcher.rst.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_sources/readme.rst.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/alabaster.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/basic.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/badge_only.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/css/theme.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/custom.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/debug.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/doctools.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/documentation_options.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/file.png +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/jquery.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/js/badge_only.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/js/html5shiv-printshiv.min.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/js/html5shiv.min.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/js/theme.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/language_data.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/minus.png +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/plus.png +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/pygments.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/scripts/furo.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/scripts/furo.js.map +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/searchtools.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/skeleton.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/sphinx_highlight.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/styles/furo-extensions.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/styles/furo-extensions.css.map +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/styles/furo.css +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/_static/styles/furo.css.map +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/api.html +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/generated/mkv_episode_matcher.html +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/genindex.html +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/index.html +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/mkv_episode_matcher.html +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/objects.inv +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/py-modindex.html +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/readme.html +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/search.html +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/_build/html/searchindex.js +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/api.rst +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/conf.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/generated/mkv_episode_matcher.rst +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/index.rst +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/make.bat +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/mkv_episode_matcher.rst +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/readme.rst +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/docs/requirements.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/.gitattributes +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/__init__.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/__main__.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/config.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/.gitignore +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/SubZero.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/dictionaries/data.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/post_processing.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/README.md +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/__init__.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/imagemaker.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/pgs2srt.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/pgsreader.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/libraries/pgs2srt/requirements.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/mkv_to_srt.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/notebooks/get_subtitles_test.ipynb +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/tmdb_client.py +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/dependency_links.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/entry_points.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/top_level.txt +0 -0
- {mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/setup.py +0 -0
- {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.
|
|
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.
|
|
17
|
+
Requires-Python: >=3.12
|
|
22
18
|
Description-Content-Type: text/x-rst
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist: pytesseract
|
|
29
|
-
Requires-Dist:
|
|
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
|
{mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher/episode_matcher.py
RENAMED
|
@@ -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
|
-
|
|
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(
|
|
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])
|
|
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(
|
|
51
|
-
for f in os.listdir(
|
|
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
|
-
|
|
58
|
-
|
|
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()
|
{mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: mkv-episode-matcher
|
|
3
|
-
Version: 0.1.
|
|
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.
|
|
17
|
+
Requires-Python: >=3.12
|
|
22
18
|
Description-Content-Type: text/x-rst
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist: pytesseract
|
|
29
|
-
Requires-Dist:
|
|
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
|
{mkv_episode_matcher-0.1.11 → mkv_episode_matcher-0.1.13}/mkv_episode_matcher.egg-info/SOURCES.txt
RENAMED
|
@@ -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
|
|
@@ -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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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.
|
|
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.
|