riplex 0.5.0__tar.gz → 0.5.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. {riplex-0.5.0 → riplex-0.5.2}/.github/workflows/release.yml +21 -1
  2. {riplex-0.5.0/src/riplex.egg-info → riplex-0.5.2}/PKG-INFO +2 -2
  3. {riplex-0.5.0 → riplex-0.5.2}/pyproject.toml +1 -1
  4. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/disc/analysis.py +18 -2
  5. {riplex-0.5.0 → riplex-0.5.2/src/riplex.egg-info}/PKG-INFO +2 -2
  6. {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/requires.txt +1 -1
  7. {riplex-0.5.0 → riplex-0.5.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  8. {riplex-0.5.0 → riplex-0.5.2}/.github/agents/riplex.agent.md +0 -0
  9. {riplex-0.5.0 → riplex-0.5.2}/.github/copilot-instructions.md +0 -0
  10. {riplex-0.5.0 → riplex-0.5.2}/.github/workflows/publish.yml +0 -0
  11. {riplex-0.5.0 → riplex-0.5.2}/.gitignore +0 -0
  12. {riplex-0.5.0 → riplex-0.5.2}/.vscode/settings.json +0 -0
  13. {riplex-0.5.0 → riplex-0.5.2}/LICENSE +0 -0
  14. {riplex-0.5.0 → riplex-0.5.2}/README.md +0 -0
  15. {riplex-0.5.0 → riplex-0.5.2}/REFACTOR_PLAN.md +0 -0
  16. {riplex-0.5.0 → riplex-0.5.2}/docs/architecture.md +0 -0
  17. {riplex-0.5.0 → riplex-0.5.2}/docs/changelog.md +0 -0
  18. {riplex-0.5.0 → riplex-0.5.2}/docs/getting-started/configuration.md +0 -0
  19. {riplex-0.5.0 → riplex-0.5.2}/docs/getting-started/installation.md +0 -0
  20. {riplex-0.5.0 → riplex-0.5.2}/docs/guide/lookup.md +0 -0
  21. {riplex-0.5.0 → riplex-0.5.2}/docs/guide/orchestrate.md +0 -0
  22. {riplex-0.5.0 → riplex-0.5.2}/docs/guide/organize.md +0 -0
  23. {riplex-0.5.0 → riplex-0.5.2}/docs/guide/workflow.md +0 -0
  24. {riplex-0.5.0 → riplex-0.5.2}/docs/index.md +0 -0
  25. {riplex-0.5.0 → riplex-0.5.2}/docs/naming-rules.md +0 -0
  26. {riplex-0.5.0 → riplex-0.5.2}/docs/reference/cli.md +0 -0
  27. {riplex-0.5.0 → riplex-0.5.2}/docs/troubleshooting.md +0 -0
  28. {riplex-0.5.0 → riplex-0.5.2}/issues/cross-disc-dvdcompare-matching.md +0 -0
  29. {riplex-0.5.0 → riplex-0.5.2}/issues/orchestrate-dvdcompare-fallback.md +0 -0
  30. {riplex-0.5.0 → riplex-0.5.2}/issues/planned-features.md +0 -0
  31. {riplex-0.5.0 → riplex-0.5.2}/mkdocs.yml +0 -0
  32. {riplex-0.5.0 → riplex-0.5.2}/setup.cfg +0 -0
  33. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/__init__.py +0 -0
  34. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/cache.py +0 -0
  35. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/config.py +0 -0
  36. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/dedup.py +0 -0
  37. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/detect.py +0 -0
  38. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/disc/__init__.py +0 -0
  39. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/disc/makemkv.py +0 -0
  40. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/disc/provider.py +0 -0
  41. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/formatter.py +0 -0
  42. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/lookup.py +0 -0
  43. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/manifest.py +0 -0
  44. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/matcher.py +0 -0
  45. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/__init__.py +0 -0
  46. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/planner.py +0 -0
  47. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/provider.py +0 -0
  48. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/sources/__init__.py +0 -0
  49. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/sources/tmdb.py +0 -0
  50. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/models.py +0 -0
  51. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/normalize.py +0 -0
  52. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/organizer.py +0 -0
  53. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/scanner.py +0 -0
  54. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/snapshot.py +0 -0
  55. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/splitter.py +0 -0
  56. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/tagger.py +0 -0
  57. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/title.py +0 -0
  58. {riplex-0.5.0 → riplex-0.5.2}/src/riplex/ui.py +0 -0
  59. {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/SOURCES.txt +0 -0
  60. {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/dependency_links.txt +0 -0
  61. {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/entry_points.txt +0 -0
  62. {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/top_level.txt +0 -0
  63. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/__init__.py +0 -0
  64. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/main.py +0 -0
  65. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/__init__.py +0 -0
  66. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/disc_detection.py +0 -0
  67. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/disc_overview.py +0 -0
  68. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/disc_swap.py +0 -0
  69. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/done.py +0 -0
  70. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/folder_picker.py +0 -0
  71. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/metadata.py +0 -0
  72. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/orchestrate_done.py +0 -0
  73. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/organize_done.py +0 -0
  74. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/organize_preview.py +0 -0
  75. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/progress.py +0 -0
  76. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/release.py +0 -0
  77. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/selection.py +0 -0
  78. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/update.py +0 -0
  79. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/welcome.py +0 -0
  80. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/updater.py +0 -0
  81. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/__init__.py +0 -0
  82. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/__init__.py +0 -0
  83. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/lookup.py +0 -0
  84. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/orchestrate.py +0 -0
  85. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/organize.py +0 -0
  86. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/rip.py +0 -0
  87. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/setup.py +0 -0
  88. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/formatting.py +0 -0
  89. {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/main.py +0 -0
  90. {riplex-0.5.0 → riplex-0.5.2}/tests/__init__.py +0 -0
  91. {riplex-0.5.0 → riplex-0.5.2}/tests/fixtures/chernobyl_disc1.json +0 -0
  92. {riplex-0.5.0 → riplex-0.5.2}/tests/fixtures/makemkvcon_frozen_planet_ii_d2.txt +0 -0
  93. {riplex-0.5.0 → riplex-0.5.2}/tests/fixtures/makemkvcon_list.txt +0 -0
  94. {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Batman Begins.snapshot.json +0 -0
  95. {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Blade Runner (Blu-ray 4k).snapshot.json +0 -0
  96. {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Blade Runner The Final Cut.snapshot.json +0 -0
  97. {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Seven Worlds One Planet.snapshot.json +0 -0
  98. {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/The Dark Knight Rises.snapshot.json +0 -0
  99. {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/The Dark Knight.snapshot.json +0 -0
  100. {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Waterworld.snapshot.json +0 -0
  101. {riplex-0.5.0 → riplex-0.5.2}/tests/test_cache.py +0 -0
  102. {riplex-0.5.0 → riplex-0.5.2}/tests/test_cli_utils.py +0 -0
  103. {riplex-0.5.0 → riplex-0.5.2}/tests/test_config.py +0 -0
  104. {riplex-0.5.0 → riplex-0.5.2}/tests/test_dedup.py +0 -0
  105. {riplex-0.5.0 → riplex-0.5.2}/tests/test_detect.py +0 -0
  106. {riplex-0.5.0 → riplex-0.5.2}/tests/test_disc_analysis.py +0 -0
  107. {riplex-0.5.0 → riplex-0.5.2}/tests/test_disc_fixtures.py +0 -0
  108. {riplex-0.5.0 → riplex-0.5.2}/tests/test_disc_provider.py +0 -0
  109. {riplex-0.5.0 → riplex-0.5.2}/tests/test_formatter.py +0 -0
  110. {riplex-0.5.0 → riplex-0.5.2}/tests/test_makemkv.py +0 -0
  111. {riplex-0.5.0 → riplex-0.5.2}/tests/test_matcher.py +0 -0
  112. {riplex-0.5.0 → riplex-0.5.2}/tests/test_normalize.py +0 -0
  113. {riplex-0.5.0 → riplex-0.5.2}/tests/test_organizer.py +0 -0
  114. {riplex-0.5.0 → riplex-0.5.2}/tests/test_planner.py +0 -0
  115. {riplex-0.5.0 → riplex-0.5.2}/tests/test_rip_guide.py +0 -0
  116. {riplex-0.5.0 → riplex-0.5.2}/tests/test_scanner.py +0 -0
  117. {riplex-0.5.0 → riplex-0.5.2}/tests/test_snapshot.py +0 -0
  118. {riplex-0.5.0 → riplex-0.5.2}/tests/test_splitter.py +0 -0
  119. {riplex-0.5.0 → riplex-0.5.2}/tests/test_tagger.py +0 -0
  120. {riplex-0.5.0 → riplex-0.5.2}/tests/test_ui.py +0 -0
  121. {riplex-0.5.0 → riplex-0.5.2}/tests/test_updater.py +0 -0
@@ -50,6 +50,10 @@ jobs:
50
50
  --hidden-import riplex_app.screens.folder_picker ^
51
51
  --hidden-import riplex_app.screens.organize_preview ^
52
52
  --hidden-import riplex_app.screens.organize_done ^
53
+ --hidden-import riplex_app.screens.orchestrate_done ^
54
+ --hidden-import riplex_app.screens.disc_overview ^
55
+ --hidden-import riplex_app.screens.disc_swap ^
56
+ --hidden-import riplex_app.screens.update ^
53
57
  --collect-all flet ^
54
58
  --collect-all flet_desktop ^
55
59
  --collect-data dvdcompare_scraper ^
@@ -108,6 +112,10 @@ jobs:
108
112
  --hidden-import riplex_app.screens.folder_picker \
109
113
  --hidden-import riplex_app.screens.organize_preview \
110
114
  --hidden-import riplex_app.screens.organize_done \
115
+ --hidden-import riplex_app.screens.orchestrate_done \
116
+ --hidden-import riplex_app.screens.disc_overview \
117
+ --hidden-import riplex_app.screens.disc_swap \
118
+ --hidden-import riplex_app.screens.update \
111
119
  --collect-all flet \
112
120
  --collect-all flet_desktop \
113
121
  --collect-data dvdcompare_scraper \
@@ -129,10 +137,22 @@ jobs:
129
137
  if: startsWith(github.ref, 'refs/tags/v')
130
138
  runs-on: ubuntu-latest
131
139
  steps:
140
+ - uses: actions/checkout@v4
141
+ with:
142
+ fetch-depth: 0
143
+
132
144
  - uses: actions/download-artifact@v4
133
145
  with:
134
146
  path: artifacts/
135
147
 
148
+ - name: Extract tag annotation
149
+ id: tag_notes
150
+ run: |
151
+ BODY=$(git tag -l --format='%(contents)' "$GITHUB_REF_NAME")
152
+ echo "body<<ENDOFNOTES" >> "$GITHUB_OUTPUT"
153
+ echo "$BODY" >> "$GITHUB_OUTPUT"
154
+ echo "ENDOFNOTES" >> "$GITHUB_OUTPUT"
155
+
136
156
  - name: Prepare release files
137
157
  run: |
138
158
  mkdir release
@@ -144,7 +164,7 @@ jobs:
144
164
  - name: Create GitHub Release
145
165
  uses: softprops/action-gh-release@v2
146
166
  with:
147
- generate_release_notes: true
167
+ body: ${{ steps.tag_notes.outputs.body }}
148
168
  files: |
149
169
  release/riplex-windows.exe
150
170
  release/riplex-ui-windows.exe
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: riplex
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: Automates the tedious manual work around MakeMKV: figuring out what to rip, which MKV files are actually what, and organizing everything into Plex-compatible folder structures.
5
5
  License: MIT
6
6
  Requires-Python: >=3.11
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
9
  Requires-Dist: httpx>=0.27
10
- Requires-Dist: dvdcompare-scraper>=0.1.6
10
+ Requires-Dist: dvdcompare-scraper>=0.1.7
11
11
  Requires-Dist: platformdirs>=4.0
12
12
  Provides-Extra: dev
13
13
  Requires-Dist: pytest>=8.0; extra == "dev"
@@ -11,7 +11,7 @@ requires-python = ">=3.11"
11
11
  license = {text = "MIT"}
12
12
  dependencies = [
13
13
  "httpx>=0.27",
14
- "dvdcompare-scraper>=0.1.6",
14
+ "dvdcompare-scraper>=0.1.7",
15
15
  "platformdirs>=4.0",
16
16
  ]
17
17
 
@@ -229,6 +229,11 @@ def classify_title(
229
229
  if dur < avg_episode * 0.3:
230
230
  return f"Unmatched content ({res_label}, {format_seconds(dur)})"
231
231
 
232
+ # Movie disc: any title that isn't the main film or extended cut
233
+ # and doesn't match a dvdcompare entry is unmatched content
234
+ if is_movie and movie_runtime and dur < movie_runtime * 0.5:
235
+ return f"Unmatched content ({res_label}, {format_seconds(dur)})"
236
+
232
237
  # Fall back: individual episode on a multi-title disc
233
238
  other_substantial = [
234
239
  t for t in all_titles
@@ -331,6 +336,13 @@ def is_skip_title(
331
336
  if dur < avg_episode * 0.3:
332
337
  return True
333
338
 
339
+ # Movie disc: skip titles that aren't the main film or extended cut
340
+ # and don't match any dvdcompare entry
341
+ if is_movie and movie_runtime and dur < movie_runtime * 0.5:
342
+ match = find_duration_match(dur, dvd_entries) if dvd_entries else None
343
+ if not match:
344
+ return True
345
+
334
346
  return False
335
347
 
336
348
 
@@ -559,8 +571,12 @@ def analyze_disc(
559
571
  # disable movie_runtime heuristics (main film / extended cut detection)
560
572
  effective_movie_runtime = movie_runtime
561
573
  if is_movie and episode_count == 0 and dvd_entries:
562
- # Disc has dvdcompare data but no main film it's extras-only
563
- effective_movie_runtime = None
574
+ # Only disable movie_runtime if no disc in the set is a film disc.
575
+ # Film discs always have episode_count==0 because their features
576
+ # go into extras, but they still need main-film detection.
577
+ has_film_disc = any(d.is_film for d in current_disc_entries)
578
+ if not has_film_disc:
579
+ effective_movie_runtime = None
564
580
 
565
581
  # Select rippable titles
566
582
  titles = disc_info.titles if disc_info else []
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: riplex
3
- Version: 0.5.0
3
+ Version: 0.5.2
4
4
  Summary: Automates the tedious manual work around MakeMKV: figuring out what to rip, which MKV files are actually what, and organizing everything into Plex-compatible folder structures.
5
5
  License: MIT
6
6
  Requires-Python: >=3.11
7
7
  Description-Content-Type: text/markdown
8
8
  License-File: LICENSE
9
9
  Requires-Dist: httpx>=0.27
10
- Requires-Dist: dvdcompare-scraper>=0.1.6
10
+ Requires-Dist: dvdcompare-scraper>=0.1.7
11
11
  Requires-Dist: platformdirs>=4.0
12
12
  Provides-Extra: dev
13
13
  Requires-Dist: pytest>=8.0; extra == "dev"
@@ -1,5 +1,5 @@
1
1
  httpx>=0.27
2
- dvdcompare-scraper>=0.1.6
2
+ dvdcompare-scraper>=0.1.7
3
3
  platformdirs>=4.0
4
4
 
5
5
  [dev]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes