mkv-episode-matcher 0.1.12__tar.gz → 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mkv-episode-matcher might be problematic. Click here for more details.
- mkv_episode_matcher-0.2.0/.coverage +0 -0
- mkv_episode_matcher-0.2.0/.github/workflows/documentation.yml +41 -0
- mkv_episode_matcher-0.2.0/.vscode/settings.json +15 -0
- mkv_episode_matcher-0.2.0/PKG-INFO +117 -0
- mkv_episode_matcher-0.2.0/README.md +90 -0
- mkv_episode_matcher-0.2.0/docs/api/index.md +38 -0
- mkv_episode_matcher-0.2.0/docs/cli.md +91 -0
- mkv_episode_matcher-0.2.0/docs/configuration.md +105 -0
- mkv_episode_matcher-0.2.0/docs/installation.md +51 -0
- mkv_episode_matcher-0.2.0/docs/quickstart.md +79 -0
- mkv_episode_matcher-0.2.0/docs/tips.md +152 -0
- mkv_episode_matcher-0.2.0/mkdocs.yml +82 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/__main__.py +8 -4
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/episode_matcher.py +40 -27
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/SubZero.py +38 -12
- mkv_episode_matcher-0.2.0/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/dictionaries/data.py +16700 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/post_processing.py +125 -80
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/imagemaker.py +7 -5
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/pgs2srt.py +49 -20
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/pgsreader.py +53 -49
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/mkv_to_srt.py +150 -22
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/utils.py +19 -18
- mkv_episode_matcher-0.2.0/mkv_episode_matcher.egg-info/PKG-INFO +117 -0
- mkv_episode_matcher-0.2.0/mkv_episode_matcher.egg-info/SOURCES.txt +57 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/pyproject.toml +45 -10
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/setup.cfg +3 -3
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/setup.py +3 -2
- mkv_episode_matcher-0.2.0/tests/test_improvements.py +59 -0
- mkv_episode_matcher-0.2.0/uv.lock +679 -0
- mkv_episode_matcher-0.1.12/.readthedocs.yml +0 -34
- mkv_episode_matcher-0.1.12/.vscode/settings.json +0 -11
- mkv_episode_matcher-0.1.12/PKG-INFO +0 -113
- mkv_episode_matcher-0.1.12/README.md +0 -0
- mkv_episode_matcher-0.1.12/README.rst +0 -86
- mkv_episode_matcher-0.1.12/docs/Makefile +0 -20
- mkv_episode_matcher-0.1.12/docs/_build/doctrees/environment.pickle +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/doctrees/index.doctree +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/.buildinfo +0 -4
- mkv_episode_matcher-0.1.12/docs/_build/html/.doctrees/api.doctree +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/.doctrees/environment.pickle +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/.doctrees/generated/mkv_episode_matcher.doctree +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/.doctrees/index.doctree +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/.doctrees/mkv_episode_matcher.doctree +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/.doctrees/readme.doctree +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_sources/api.rst.txt +0 -55
- mkv_episode_matcher-0.1.12/docs/_build/html/_sources/generated/mkv_episode_matcher.rst.txt +0 -23
- mkv_episode_matcher-0.1.12/docs/_build/html/_sources/index.rst.txt +0 -19
- mkv_episode_matcher-0.1.12/docs/_build/html/_sources/mkv_episode_matcher.rst.txt +0 -23
- mkv_episode_matcher-0.1.12/docs/_build/html/_sources/readme.rst.txt +0 -7
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -123
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/alabaster.css +0 -708
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/basic.css +0 -925
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/badge_only.css +0 -1
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -2671
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/css/theme.css +0 -4
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/custom.css +0 -1
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/debug.css +0 -69
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/doctools.js +0 -156
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/documentation_options.js +0 -13
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/file.png +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/jquery.js +0 -2
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/js/badge_only.js +0 -1
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/js/html5shiv-printshiv.min.js +0 -4
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/js/html5shiv.min.js +0 -4
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/js/theme.js +0 -1
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/language_data.js +0 -199
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/minus.png +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/plus.png +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/pygments.css +0 -75
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/scripts/furo.js +0 -3
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +0 -7
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/scripts/furo.js.map +0 -1
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/searchtools.js +0 -619
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/skeleton.css +0 -296
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/sphinx_highlight.js +0 -154
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/styles/furo-extensions.css +0 -2
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/styles/furo-extensions.css.map +0 -1
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/styles/furo.css +0 -2
- mkv_episode_matcher-0.1.12/docs/_build/html/_static/styles/furo.css.map +0 -1
- mkv_episode_matcher-0.1.12/docs/_build/html/api.html +0 -633
- mkv_episode_matcher-0.1.12/docs/_build/html/generated/mkv_episode_matcher.html +0 -113
- mkv_episode_matcher-0.1.12/docs/_build/html/genindex.html +0 -301
- mkv_episode_matcher-0.1.12/docs/_build/html/index.html +0 -138
- mkv_episode_matcher-0.1.12/docs/_build/html/mkv_episode_matcher.html +0 -106
- mkv_episode_matcher-0.1.12/docs/_build/html/objects.inv +0 -0
- mkv_episode_matcher-0.1.12/docs/_build/html/py-modindex.html +0 -152
- mkv_episode_matcher-0.1.12/docs/_build/html/readme.html +0 -197
- mkv_episode_matcher-0.1.12/docs/_build/html/search.html +0 -122
- mkv_episode_matcher-0.1.12/docs/_build/html/searchindex.js +0 -1
- mkv_episode_matcher-0.1.12/docs/api.rst +0 -55
- mkv_episode_matcher-0.1.12/docs/conf.py +0 -35
- mkv_episode_matcher-0.1.12/docs/generated/mkv_episode_matcher.rst +0 -23
- mkv_episode_matcher-0.1.12/docs/index.rst +0 -19
- mkv_episode_matcher-0.1.12/docs/make.bat +0 -35
- mkv_episode_matcher-0.1.12/docs/mkv_episode_matcher.rst +0 -23
- mkv_episode_matcher-0.1.12/docs/readme.rst +0 -7
- mkv_episode_matcher-0.1.12/docs/requirements.txt +0 -10
- mkv_episode_matcher-0.1.12/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/dictionaries/data.py +0 -249
- mkv_episode_matcher-0.1.12/mkv_episode_matcher/notebooks/get_subtitles_test.ipynb +0 -252
- mkv_episode_matcher-0.1.12/mkv_episode_matcher/notebooks/whisper.ipynb +0 -122
- mkv_episode_matcher-0.1.12/mkv_episode_matcher/old_requirements.txt +0 -7
- mkv_episode_matcher-0.1.12/mkv_episode_matcher.egg-info/PKG-INFO +0 -113
- mkv_episode_matcher-0.1.12/mkv_episode_matcher.egg-info/SOURCES.txt +0 -133
- mkv_episode_matcher-0.1.12/old_pyproject.toml +0 -68
- mkv_episode_matcher-0.1.12/uv.lock +0 -395
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/.gitattributes +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/.github/funding.yml +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/.github/workflows/python-publish.yml +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/.gitignore +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/.gitmodules +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/.python-version +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.1-py3-none-any.whl +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.1.tar.gz +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.2-py3-none-any.whl +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.2.tar.gz +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.3-py3-none-any.whl +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.3.tar.gz +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.4-py3-none-any.whl +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.4.tar.gz +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.5-py3-none-any.whl +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/dist/mkv_episode_matcher-0.1.5.tar.gz +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/.gitattributes +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/__init__.py +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/config.py +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/.gitignore +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/README.md +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/__init__.py +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/libraries/pgs2srt/requirements.txt +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher/tmdb_client.py +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher.egg-info/dependency_links.txt +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher.egg-info/entry_points.txt +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher.egg-info/requires.txt +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/mkv_episode_matcher.egg-info/top_level.txt +0 -0
- {mkv_episode_matcher-0.1.12 → mkv_episode_matcher-0.2.0}/tests/__init__.py +0 -0
|
Binary file
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
deploy:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
with:
|
|
17
|
+
fetch-depth: 0
|
|
18
|
+
|
|
19
|
+
- name: Configure Git
|
|
20
|
+
run: |
|
|
21
|
+
git config --global user.name "github-actions[bot]"
|
|
22
|
+
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
23
|
+
|
|
24
|
+
- name: Set up Python
|
|
25
|
+
uses: actions/setup-python@v4
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.12"
|
|
28
|
+
|
|
29
|
+
- name: Install dependencies
|
|
30
|
+
run: |
|
|
31
|
+
pip install mkdocs-material
|
|
32
|
+
pip install mkdocstrings[python]
|
|
33
|
+
pip install .
|
|
34
|
+
|
|
35
|
+
- name: Setup docs directory
|
|
36
|
+
run: |
|
|
37
|
+
cd docs
|
|
38
|
+
ln -sf ../README.md .
|
|
39
|
+
|
|
40
|
+
- name: Deploy documentation
|
|
41
|
+
run: mkdocs gh-deploy --force
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"python.testing.pytestArgs": [
|
|
3
|
+
"python.testing.pytestArgs": [
|
|
4
|
+
".",
|
|
5
|
+
"--rootdir=.",
|
|
6
|
+
"-v",
|
|
7
|
+
"--tb=short"
|
|
8
|
+
],
|
|
9
|
+
"python.testing.autoTestDiscoverOnSaveEnabled": true,
|
|
10
|
+
"python.testing.pytestEnabled": true,
|
|
11
|
+
"python.testing.unittestEnabled": false,
|
|
12
|
+
"python.testing.pytestArgs": [
|
|
13
|
+
"tests"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: mkv-episode-matcher
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: The MKV Episode Matcher is a tool for identifying TV series episodes from MKV files and renaming the files accordingly.
|
|
5
|
+
Home-page: https://github.com/Jsakkos/mkv-episode-matcher
|
|
6
|
+
Author: Jonathan Sakkos
|
|
7
|
+
Author-email: Jsakkos <jonathansakkos@gmail.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Documentation, https://github.com/Jsakkos/mkv-episode-matcher#readme
|
|
10
|
+
Project-URL: Issues, https://github.com/Jsakkos/mkv-episode-matcher/issues
|
|
11
|
+
Project-URL: Source, https://github.com/Jsakkos/mkv-episode-matcher
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Programming Language :: Python
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
16
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
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
|
|
27
|
+
|
|
28
|
+
# MKV Episode Matcher
|
|
29
|
+
|
|
30
|
+
[](https://jsakkos.github.io/mkv-episode-matcher/)
|
|
31
|
+
[](https://badge.fury.io/py/mkv-episode-matcher)
|
|
32
|
+
[](https://opensource.org/licenses/MIT)
|
|
33
|
+
|
|
34
|
+
Automatically match and rename your MKV TV episodes using The Movie Database (TMDb).
|
|
35
|
+
|
|
36
|
+
## Features
|
|
37
|
+
|
|
38
|
+
- 🎯 **Automatic Episode Matching**: Uses TMDb to accurately identify episodes
|
|
39
|
+
- 📝 **Subtitle Extraction**: Extracts subtitles from MKV files
|
|
40
|
+
- 🔍 **OCR Support**: Handles image-based subtitles
|
|
41
|
+
- 🚀 **Multi-threaded**: Fast processing of multiple files
|
|
42
|
+
- ⬇️ **Subtitle Downloads**: Integration with OpenSubtitles
|
|
43
|
+
- ✨ **Bulk Processing**: Handle entire seasons at once
|
|
44
|
+
- 🧪 **Dry Run Mode**: Test changes before applying
|
|
45
|
+
|
|
46
|
+
## Quick Start
|
|
47
|
+
|
|
48
|
+
1. Install the package:
|
|
49
|
+
```bash
|
|
50
|
+
pip install mkv-episode-matcher
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
2. Run on your show directory:
|
|
54
|
+
```bash
|
|
55
|
+
mkv-match --show-dir "path/to/your/show" --season 1
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Requirements
|
|
59
|
+
|
|
60
|
+
- Python 3.8 or higher
|
|
61
|
+
- TMDb API key
|
|
62
|
+
- OpenSubtitles account (optional, for subtitle downloads)
|
|
63
|
+
|
|
64
|
+
## Documentation
|
|
65
|
+
|
|
66
|
+
Full documentation is available at [https://jsakkos.github.io/mkv-episode-matcher/](https://jsakkos.github.io/mkv-episode-matcher/)
|
|
67
|
+
|
|
68
|
+
## Basic Usage
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
from mkv_episode_matcher import process_show
|
|
72
|
+
|
|
73
|
+
# Process all seasons
|
|
74
|
+
process_show()
|
|
75
|
+
|
|
76
|
+
# Process specific season
|
|
77
|
+
process_show(season=1)
|
|
78
|
+
|
|
79
|
+
# Test run without making changes
|
|
80
|
+
process_show(season=1, dry_run=True)
|
|
81
|
+
|
|
82
|
+
# Process and download subtitles
|
|
83
|
+
process_show(get_subs=True)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Directory Structure
|
|
87
|
+
|
|
88
|
+
MKV Episode Matcher expects your TV shows to be organized as follows:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Show Name/
|
|
92
|
+
├── Season 1/
|
|
93
|
+
│ ├── episode1.mkv
|
|
94
|
+
│ ├── episode2.mkv
|
|
95
|
+
├── Season 2/
|
|
96
|
+
│ ├── episode1.mkv
|
|
97
|
+
│ └── episode2.mkv
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Contributing
|
|
101
|
+
|
|
102
|
+
1. Fork the repository
|
|
103
|
+
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
104
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
105
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
106
|
+
5. Open a Pull Request
|
|
107
|
+
|
|
108
|
+
## License
|
|
109
|
+
|
|
110
|
+
Distributed under the MIT License. See `LICENSE` for more information.
|
|
111
|
+
|
|
112
|
+
## Acknowledgments
|
|
113
|
+
|
|
114
|
+
- [TMDb](https://www.themoviedb.org/) for their excellent API
|
|
115
|
+
- [OpenSubtitles](https://www.opensubtitles.com/) for subtitle integration
|
|
116
|
+
- All contributors who have helped improve this project
|
|
117
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# MKV Episode Matcher
|
|
2
|
+
|
|
3
|
+
[](https://jsakkos.github.io/mkv-episode-matcher/)
|
|
4
|
+
[](https://badge.fury.io/py/mkv-episode-matcher)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
Automatically match and rename your MKV TV episodes using The Movie Database (TMDb).
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- 🎯 **Automatic Episode Matching**: Uses TMDb to accurately identify episodes
|
|
12
|
+
- 📝 **Subtitle Extraction**: Extracts subtitles from MKV files
|
|
13
|
+
- 🔍 **OCR Support**: Handles image-based subtitles
|
|
14
|
+
- 🚀 **Multi-threaded**: Fast processing of multiple files
|
|
15
|
+
- ⬇️ **Subtitle Downloads**: Integration with OpenSubtitles
|
|
16
|
+
- ✨ **Bulk Processing**: Handle entire seasons at once
|
|
17
|
+
- 🧪 **Dry Run Mode**: Test changes before applying
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
1. Install the package:
|
|
22
|
+
```bash
|
|
23
|
+
pip install mkv-episode-matcher
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. Run on your show directory:
|
|
27
|
+
```bash
|
|
28
|
+
mkv-match --show-dir "path/to/your/show" --season 1
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Requirements
|
|
32
|
+
|
|
33
|
+
- Python 3.8 or higher
|
|
34
|
+
- TMDb API key
|
|
35
|
+
- OpenSubtitles account (optional, for subtitle downloads)
|
|
36
|
+
|
|
37
|
+
## Documentation
|
|
38
|
+
|
|
39
|
+
Full documentation is available at [https://jsakkos.github.io/mkv-episode-matcher/](https://jsakkos.github.io/mkv-episode-matcher/)
|
|
40
|
+
|
|
41
|
+
## Basic Usage
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
from mkv_episode_matcher import process_show
|
|
45
|
+
|
|
46
|
+
# Process all seasons
|
|
47
|
+
process_show()
|
|
48
|
+
|
|
49
|
+
# Process specific season
|
|
50
|
+
process_show(season=1)
|
|
51
|
+
|
|
52
|
+
# Test run without making changes
|
|
53
|
+
process_show(season=1, dry_run=True)
|
|
54
|
+
|
|
55
|
+
# Process and download subtitles
|
|
56
|
+
process_show(get_subs=True)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Directory Structure
|
|
60
|
+
|
|
61
|
+
MKV Episode Matcher expects your TV shows to be organized as follows:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
Show Name/
|
|
65
|
+
├── Season 1/
|
|
66
|
+
│ ├── episode1.mkv
|
|
67
|
+
│ ├── episode2.mkv
|
|
68
|
+
├── Season 2/
|
|
69
|
+
│ ├── episode1.mkv
|
|
70
|
+
│ └── episode2.mkv
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Contributing
|
|
74
|
+
|
|
75
|
+
1. Fork the repository
|
|
76
|
+
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
77
|
+
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
78
|
+
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
79
|
+
5. Open a Pull Request
|
|
80
|
+
|
|
81
|
+
## License
|
|
82
|
+
|
|
83
|
+
Distributed under the MIT License. See `LICENSE` for more information.
|
|
84
|
+
|
|
85
|
+
## Acknowledgments
|
|
86
|
+
|
|
87
|
+
- [TMDb](https://www.themoviedb.org/) for their excellent API
|
|
88
|
+
- [OpenSubtitles](https://www.opensubtitles.com/) for subtitle integration
|
|
89
|
+
- All contributors who have helped improve this project
|
|
90
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
This section contains the automatically generated API documentation for MKV Episode Matcher.
|
|
4
|
+
|
|
5
|
+
## Core Modules
|
|
6
|
+
|
|
7
|
+
::: mkv_episode_matcher.episode_matcher
|
|
8
|
+
options:
|
|
9
|
+
show_root_heading: true
|
|
10
|
+
heading_level: 2
|
|
11
|
+
|
|
12
|
+
## TMDB Client
|
|
13
|
+
|
|
14
|
+
::: mkv_episode_matcher.tmdb_client
|
|
15
|
+
options:
|
|
16
|
+
show_root_heading: true
|
|
17
|
+
heading_level: 2
|
|
18
|
+
|
|
19
|
+
## MKV Converter
|
|
20
|
+
|
|
21
|
+
::: mkv_episode_matcher.mkv_to_srt
|
|
22
|
+
options:
|
|
23
|
+
show_root_heading: true
|
|
24
|
+
heading_level: 2
|
|
25
|
+
|
|
26
|
+
## Utilities
|
|
27
|
+
|
|
28
|
+
::: mkv_episode_matcher.utils
|
|
29
|
+
options:
|
|
30
|
+
show_root_heading: true
|
|
31
|
+
heading_level: 2
|
|
32
|
+
|
|
33
|
+
## Configuration
|
|
34
|
+
|
|
35
|
+
::: mkv_episode_matcher.config
|
|
36
|
+
options:
|
|
37
|
+
show_root_heading: true
|
|
38
|
+
heading_level: 2
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Command Line Interface
|
|
2
|
+
|
|
3
|
+
## Basic Commands
|
|
4
|
+
|
|
5
|
+
### Process Show
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
mkv-match --show-dir "/path/to/show"
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Process Specific Season
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
mkv-match --show-dir "/path/to/show" --season 1
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Command Options
|
|
18
|
+
|
|
19
|
+
| Option | Description | Default |
|
|
20
|
+
|--------|-------------|---------|
|
|
21
|
+
| `--show-dir` | Show directory path | None |
|
|
22
|
+
| `--season` | Season number to process | None (all) |
|
|
23
|
+
| `--dry-run` | Test without making changes | False |
|
|
24
|
+
| `--get-subs` | Download subtitles | False |
|
|
25
|
+
| `--tmdb-api-key` | TMDb API key | None |
|
|
26
|
+
| `--tesseract-path` | Path to Tesseract | None |
|
|
27
|
+
|
|
28
|
+
## Examples
|
|
29
|
+
|
|
30
|
+
### Dry Run Mode
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
mkv-match --show-dir "/path/to/show" --dry-run true
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Download Subtitles
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
mkv-match --show-dir "/path/to/show" --get-subs true
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Set API Key
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
mkv-match --show-dir "/path/to/show" --tmdb-api-key "your_key"
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Multiple Options
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
mkv-match \
|
|
52
|
+
--show-dir "/path/to/show" \
|
|
53
|
+
--season 1 \
|
|
54
|
+
--get-subs true \
|
|
55
|
+
--dry-run true
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Environment Variables
|
|
59
|
+
|
|
60
|
+
Alternative to command line options:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
export TMDB_API_KEY="your_key"
|
|
64
|
+
export SHOW_DIR="/path/to/shows"
|
|
65
|
+
mkv-match
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Exit Codes
|
|
69
|
+
|
|
70
|
+
| Code | Meaning |
|
|
71
|
+
|------|---------|
|
|
72
|
+
| 0 | Success |
|
|
73
|
+
| 1 | General error |
|
|
74
|
+
| 2 | Configuration error |
|
|
75
|
+
| 3 | API error |
|
|
76
|
+
|
|
77
|
+
## Logging
|
|
78
|
+
|
|
79
|
+
Logs are stored in:
|
|
80
|
+
```
|
|
81
|
+
~/.mkv-episode-matcher/logs/
|
|
82
|
+
├── stdout.log
|
|
83
|
+
└── stderr.log
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Tips
|
|
87
|
+
|
|
88
|
+
1. Always use quotes around paths
|
|
89
|
+
2. Use dry-run first to test
|
|
90
|
+
3. Check logs for details
|
|
91
|
+
4. Use full paths for reliability
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Configuration Guide
|
|
2
|
+
|
|
3
|
+
## Configuration File
|
|
4
|
+
|
|
5
|
+
MKV Episode Matcher uses a configuration file located at:
|
|
6
|
+
|
|
7
|
+
- Windows: `%USERPROFILE%\.mkv-episode-matcher\config.ini`
|
|
8
|
+
- Linux/Mac: `~/.mkv-episode-matcher/config.ini`
|
|
9
|
+
|
|
10
|
+
## Configuration Options
|
|
11
|
+
|
|
12
|
+
```ini
|
|
13
|
+
[Config]
|
|
14
|
+
# Required Settings
|
|
15
|
+
tmdb_api_key = your_tmdb_api_key
|
|
16
|
+
show_dir = /path/to/shows
|
|
17
|
+
|
|
18
|
+
# Optional Settings
|
|
19
|
+
max_threads = 4
|
|
20
|
+
open_subtitles_api_key = your_opensubs_key
|
|
21
|
+
open_subtitles_user_agent = your_user_agent
|
|
22
|
+
open_subtitles_username = your_username
|
|
23
|
+
open_subtitles_password = your_password
|
|
24
|
+
tesseract_path = /path/to/tesseract
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Command Line Configuration
|
|
28
|
+
|
|
29
|
+
All configuration options can be set via command line:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
mkv-match \
|
|
33
|
+
--tmdb-api-key "your_key" \
|
|
34
|
+
--show-dir "/path/to/shows" \
|
|
35
|
+
--season 1 \
|
|
36
|
+
--dry-run true \
|
|
37
|
+
--get-subs true \
|
|
38
|
+
--tesseract-path "/path/to/tesseract"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Environment Variables
|
|
42
|
+
|
|
43
|
+
You can also use environment variables:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
export TMDB_API_KEY="your_key"
|
|
47
|
+
export SHOW_DIR="/path/to/shows"
|
|
48
|
+
export OPEN_SUBTITLES_API_KEY="your_key"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Configuration Priority
|
|
52
|
+
|
|
53
|
+
Settings are loaded in the following order (later overrides earlier):
|
|
54
|
+
|
|
55
|
+
1. Default values
|
|
56
|
+
2. Configuration file
|
|
57
|
+
3. Environment variables
|
|
58
|
+
4. Command line arguments
|
|
59
|
+
|
|
60
|
+
## Detailed Options
|
|
61
|
+
|
|
62
|
+
### TMDb Configuration
|
|
63
|
+
|
|
64
|
+
```ini
|
|
65
|
+
[Config]
|
|
66
|
+
tmdb_api_key = your_api_key
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The TMDb API key is required for:
|
|
70
|
+
- Show identification
|
|
71
|
+
- Episode information
|
|
72
|
+
- Season details
|
|
73
|
+
|
|
74
|
+
### OpenSubtitles Configuration
|
|
75
|
+
|
|
76
|
+
```ini
|
|
77
|
+
[Config]
|
|
78
|
+
open_subtitles_api_key = your_key
|
|
79
|
+
open_subtitles_user_agent = your_agent
|
|
80
|
+
open_subtitles_username = username
|
|
81
|
+
open_subtitles_password = password
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Required only if using subtitle download functionality.
|
|
85
|
+
|
|
86
|
+
### Performance Settings
|
|
87
|
+
|
|
88
|
+
```ini
|
|
89
|
+
[Config]
|
|
90
|
+
max_threads = 4
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Adjust based on your system's capabilities:
|
|
94
|
+
- Default: 4 threads
|
|
95
|
+
- Minimum: 1 thread
|
|
96
|
+
- Maximum: Number of CPU cores
|
|
97
|
+
|
|
98
|
+
### OCR Configuration
|
|
99
|
+
|
|
100
|
+
```ini
|
|
101
|
+
[Config]
|
|
102
|
+
tesseract_path = /path/to/tesseract
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Required only if processing image-based subtitles.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Installation Guide
|
|
2
|
+
|
|
3
|
+
## Basic Installation
|
|
4
|
+
|
|
5
|
+
Install MKV Episode Matcher using pip:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install mkv-episode-matcher
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## API Keys Setup
|
|
12
|
+
|
|
13
|
+
1. **TMDb API Key**
|
|
14
|
+
- Create an account at [TMDb](https://www.themoviedb.org/)
|
|
15
|
+
- Go to your account settings
|
|
16
|
+
- Request an API key
|
|
17
|
+
|
|
18
|
+
2. **OpenSubtitles (Optional)**
|
|
19
|
+
- Register at [OpenSubtitles](https://www.opensubtitles.com/)
|
|
20
|
+
- Get your API key from the dashboard
|
|
21
|
+
|
|
22
|
+
## Development Installation
|
|
23
|
+
|
|
24
|
+
For contributing or development:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Clone the repository
|
|
28
|
+
git clone https://github.com/Jsakkos/mkv-episode-matcher.git
|
|
29
|
+
cd mkv-episode-matcher
|
|
30
|
+
|
|
31
|
+
# Install UV
|
|
32
|
+
pip install uv
|
|
33
|
+
|
|
34
|
+
# Load the virtual environment
|
|
35
|
+
uv sync
|
|
36
|
+
|
|
37
|
+
# Install in development mode
|
|
38
|
+
pip install -e .
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Verification
|
|
42
|
+
|
|
43
|
+
Verify your installation:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
mkv-match --version
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Troubleshooting
|
|
50
|
+
|
|
51
|
+
If you encounter any issues, please [open an issue](https://github.com/Jsakkos/mkv-episode-matcher/issues) on GitHub.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Quick Start Guide
|
|
2
|
+
|
|
3
|
+
Get started with MKV Episode Matcher in minutes.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
### 1. Process a Single Season
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
mkv-match --show-dir "/path/to/show" --season 1
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### 2. Process All Seasons
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
mkv-match --show-dir "/path/to/show"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 3. Test Run (No Changes)
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
mkv-match --show-dir "/path/to/show" --dry-run true
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 4. Download Subtitles
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
mkv-match --show-dir "/path/to/show" --get-subs true
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Directory Structure
|
|
32
|
+
|
|
33
|
+
MKV Episode Matcher expects your TV shows to be organized as follows:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Show Name/
|
|
37
|
+
├── Season 1/
|
|
38
|
+
│ ├── episode1.mkv
|
|
39
|
+
│ ├── episode2.mkv
|
|
40
|
+
├── Season 2/
|
|
41
|
+
│ ├── episode1.mkv
|
|
42
|
+
│ └── episode2.mkv
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Python API Usage
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
from mkv_episode_matcher import process_show
|
|
49
|
+
|
|
50
|
+
# Process all seasons
|
|
51
|
+
process_show()
|
|
52
|
+
|
|
53
|
+
# Process specific season
|
|
54
|
+
process_show(season=1)
|
|
55
|
+
|
|
56
|
+
# Test run
|
|
57
|
+
process_show(season=1, dry_run=True)
|
|
58
|
+
|
|
59
|
+
# With subtitles
|
|
60
|
+
process_show(season=1, get_subs=True)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Configuration
|
|
64
|
+
|
|
65
|
+
Create a configuration file at `~/.mkv-episode-matcher/config.ini`:
|
|
66
|
+
|
|
67
|
+
```ini
|
|
68
|
+
[Config]
|
|
69
|
+
tmdb_api_key = your_api_key
|
|
70
|
+
open_subtitles_api_key = your_opensubs_key
|
|
71
|
+
show_dir = /path/to/shows
|
|
72
|
+
max_threads = 4
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Next Steps
|
|
76
|
+
|
|
77
|
+
- Check the [Configuration Guide](configuration.md) for detailed setup
|
|
78
|
+
- See [Tips and Tricks](tips.md) for advanced usage
|
|
79
|
+
- Browse the [API Reference](api/episode_matcher.md) for detailed documentation
|