mkv-episode-matcher 0.3.5__tar.gz → 0.3.6__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 (52) hide show
  1. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.coverage +0 -0
  2. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/PKG-INFO +4 -3
  3. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/README.md +3 -2
  4. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/docs/cli.md +9 -27
  5. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/docs/quickstart.md +7 -4
  6. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/episode_identification.py +18 -5
  7. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/episode_matcher.py +8 -0
  8. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/utils.py +14 -4
  9. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher.egg-info/PKG-INFO +4 -3
  10. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/setup.cfg +1 -1
  11. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/uv.lock +1 -1
  12. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.gitattributes +0 -0
  13. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.github/funding.yml +0 -0
  14. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.github/workflows/documentation.yml +0 -0
  15. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.github/workflows/python-publish.yml +0 -0
  16. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.github/workflows/tests.yml +0 -0
  17. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.gitignore +0 -0
  18. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.gitmodules +0 -0
  19. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.python-version +0 -0
  20. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/.vscode/settings.json +0 -0
  21. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/docs/api/index.md +0 -0
  22. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/docs/configuration.md +0 -0
  23. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/docs/installation.md +0 -0
  24. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/docs/tips.md +0 -0
  25. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkdocs.yml +0 -0
  26. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/.gitattributes +0 -0
  27. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/__init__.py +0 -0
  28. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/__main__.py +0 -0
  29. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/config.py +0 -0
  30. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/.gitignore +0 -0
  31. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/SubZero.py +0 -0
  32. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/dictionaries/data.py +0 -0
  33. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/Libraries/SubZero/post_processing.py +0 -0
  34. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/README.md +0 -0
  35. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/__init__.py +0 -0
  36. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/imagemaker.py +0 -0
  37. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/pgs2srt.py +0 -0
  38. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/pgsreader.py +0 -0
  39. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/libraries/pgs2srt/requirements.txt +0 -0
  40. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/mkv_to_srt.py +0 -0
  41. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/speech_to_text.py +0 -0
  42. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/subtitle_utils.py +0 -0
  43. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher/tmdb_client.py +0 -0
  44. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher.egg-info/SOURCES.txt +0 -0
  45. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher.egg-info/dependency_links.txt +0 -0
  46. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher.egg-info/entry_points.txt +0 -0
  47. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher.egg-info/requires.txt +0 -0
  48. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/mkv_episode_matcher.egg-info/top_level.txt +0 -0
  49. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/pyproject.toml +0 -0
  50. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/setup.py +0 -0
  51. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/tests/__init__.py +0 -0
  52. {mkv_episode_matcher-0.3.5 → mkv_episode_matcher-0.3.6}/tests/test_main.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mkv-episode-matcher
3
- Version: 0.3.5
3
+ Version: 0.3.6
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
@@ -65,10 +65,11 @@ Automatically match and rename your MKV TV episodes using The Movie Database (TM
65
65
  ```bash
66
66
  pip install mkv-episode-matcher
67
67
  ```
68
+ 2. Download .srt subtitles files to ~/.mkv-episode-matcher/cache/data/Show Name/
68
69
 
69
- 2. Run on your show directory:
70
+ 3. Run on your show directory:
70
71
  ```bash
71
- mkv-match --show-dir "path/to/your/show" --get-subs true
72
+ mkv-match --show-dir "path/to/your/show"
72
73
  ```
73
74
 
74
75
  ## Documentation
@@ -36,10 +36,11 @@ Automatically match and rename your MKV TV episodes using The Movie Database (TM
36
36
  ```bash
37
37
  pip install mkv-episode-matcher
38
38
  ```
39
+ 2. Download .srt subtitles files to ~/.mkv-episode-matcher/cache/data/Show Name/
39
40
 
40
- 2. Run on your show directory:
41
+ 3. Run on your show directory:
41
42
  ```bash
42
- mkv-match --show-dir "path/to/your/show" --get-subs true
43
+ mkv-match --show-dir "path/to/your/show"
43
44
  ```
44
45
 
45
46
  ## Documentation
@@ -16,14 +16,14 @@ mkv-match --show-dir "/path/to/show" --season 1
16
16
 
17
17
  ## Command Options
18
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 |
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
27
 
28
28
  ## Examples
29
29
 
@@ -55,25 +55,6 @@ mkv-match \
55
55
  --dry-run true
56
56
  ```
57
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
58
  ## Logging
78
59
 
79
60
  Logs are stored in:
@@ -89,3 +70,4 @@ Logs are stored in:
89
70
  2. Use dry-run first to test
90
71
  3. Check logs for details
91
72
  4. Use full paths for reliability
73
+ 5. Avoid using a trailing slash in paths
@@ -41,7 +41,6 @@ Show Name/
41
41
  │ ├── episode1.mkv
42
42
  │ └── episode2.mkv
43
43
  ```
44
- <!-- Add a note about the .srt reference files -->
45
44
 
46
45
  ## Reference Subtitle File Structure
47
46
 
@@ -60,10 +59,14 @@ The configuration file is automatically generated at `~/.mkv-episode-matcher/con
60
59
 
61
60
  ```ini
62
61
  [Config]
63
- tmdb_api_key = your_api_key
64
- open_subtitles_api_key = your_opensubs_key
65
- show_dir = /path/to/shows
62
+ tmdb_api_key = your_tmdb_api_key
63
+ show_dir = /path/to/show
66
64
  max_threads = 4
65
+ open_subtitles_api_key = your_opensubs_key
66
+ open_subtitles_user_agent = your_user_agent
67
+ open_subtitles_username = your_username
68
+ open_subtitles_password = your_password
69
+ tesseract_path = C:\Program Files\Tesseract-OCR\tesseract.exe
67
70
  ```
68
71
 
69
72
  ## Next Steps
@@ -96,14 +96,27 @@ class EpisodeMatcher:
96
96
  # Load Whisper model
97
97
  model = whisper.load_model("base", device=self.device)
98
98
 
99
- # Get season-specific reference files
99
+ # Get season-specific reference files using multiple patterns
100
100
  reference_dir = self.cache_dir / "data" / self.show_name
101
- season_pattern = f"S{season_number:02d}E"
102
- reference_files = [
103
- f for f in reference_dir.glob("*.srt")
104
- if season_pattern in f.name
101
+
102
+ # Create season patterns for different formats
103
+ patterns = [
104
+ f"S{season_number:02d}E", # S01E01
105
+ f"S{season_number}E", # S1E01
106
+ f"{season_number:02d}x", # 01x01
107
+ f"{season_number}x", # 1x01
105
108
  ]
106
109
 
110
+ reference_files = []
111
+ for pattern in patterns:
112
+ files = [f for f in reference_dir.glob("*.srt")
113
+ if any(re.search(f"{p}\\d+", f.name, re.IGNORECASE)
114
+ for p in patterns)]
115
+ reference_files.extend(files)
116
+
117
+ # Remove duplicates while preserving order
118
+ reference_files = list(dict.fromkeys(reference_files))
119
+
107
120
  if not reference_files:
108
121
  logger.error(f"No reference files found for season {season_number}")
109
122
  return None
@@ -29,6 +29,14 @@ def process_show(season=None, dry_run=False, get_subs=False):
29
29
  show_name = clean_text(os.path.basename(show_dir))
30
30
  matcher = EpisodeMatcher(CACHE_DIR, show_name)
31
31
 
32
+ # Early check for reference files
33
+ reference_dir = Path(CACHE_DIR) / "data" / show_name
34
+ reference_files = list(reference_dir.glob("*.srt"))
35
+ if not reference_files:
36
+ logger.error(f"No reference subtitle files found in {reference_dir}")
37
+ logger.info("Please download reference subtitles first")
38
+ return
39
+
32
40
  season_paths = get_valid_seasons(show_dir)
33
41
  if not season_paths:
34
42
  logger.warning(f"No seasons with .mkv files found")
@@ -300,7 +300,7 @@ def extract_srt_text(filepath):
300
300
 
301
301
  def extract_season_episode(filename):
302
302
  """
303
- Extract season and episode numbers from filename.
303
+ Extract season and episode numbers from filename with support for multiple formats.
304
304
 
305
305
  Args:
306
306
  filename (str): Filename to parse
@@ -308,10 +308,20 @@ def extract_season_episode(filename):
308
308
  Returns:
309
309
  tuple: (season_number, episode_number)
310
310
  """
311
- match = re.search(r'S(\d+)E(\d+)', filename)
312
- if match:
313
- return int(match.group(1)), int(match.group(2))
311
+ # List of patterns to try
312
+ patterns = [
313
+ r'S(\d+)E(\d+)', # S01E01
314
+ r'(\d+)x(\d+)', # 1x01 or 01x01
315
+ r'Season\s*(\d+).*?(\d+)' # Season 1 - 01
316
+ ]
317
+
318
+ for pattern in patterns:
319
+ match = re.search(pattern, filename, re.IGNORECASE)
320
+ if match:
321
+ return int(match.group(1)), int(match.group(2))
322
+
314
323
  return None, None
324
+
315
325
  def process_srt_files(show_dir):
316
326
  """
317
327
  Process all SRT files in the given directory and its subdirectories.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mkv-episode-matcher
3
- Version: 0.3.5
3
+ Version: 0.3.6
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
@@ -65,10 +65,11 @@ Automatically match and rename your MKV TV episodes using The Movie Database (TM
65
65
  ```bash
66
66
  pip install mkv-episode-matcher
67
67
  ```
68
+ 2. Download .srt subtitles files to ~/.mkv-episode-matcher/cache/data/Show Name/
68
69
 
69
- 2. Run on your show directory:
70
+ 3. Run on your show directory:
70
71
  ```bash
71
- mkv-match --show-dir "path/to/your/show" --get-subs true
72
+ mkv-match --show-dir "path/to/your/show"
72
73
  ```
73
74
 
74
75
  ## Documentation
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = mkv_episode_matcher
3
- version = 0.3.5
3
+ version = 0.3.6
4
4
  author = Jonathan Sakkos
5
5
  author_email = jonathansakkos@gmail.com
6
6
  description = The MKV Episode Matcher is a tool for identifying TV series episodes from MKV files and renaming the files accordingly.
@@ -383,7 +383,7 @@ wheels = [
383
383
 
384
384
  [[package]]
385
385
  name = "mkv-episode-matcher"
386
- version = "0.3.4.post1.dev3+g95f005b.d20250112"
386
+ version = "0.3.5.post1.dev0+g1beb2cf.d20250112"
387
387
  source = { editable = "." }
388
388
  dependencies = [
389
389
  { name = "configparser" },