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.
- {riplex-0.5.0 → riplex-0.5.2}/.github/workflows/release.yml +21 -1
- {riplex-0.5.0/src/riplex.egg-info → riplex-0.5.2}/PKG-INFO +2 -2
- {riplex-0.5.0 → riplex-0.5.2}/pyproject.toml +1 -1
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/disc/analysis.py +18 -2
- {riplex-0.5.0 → riplex-0.5.2/src/riplex.egg-info}/PKG-INFO +2 -2
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/requires.txt +1 -1
- {riplex-0.5.0 → riplex-0.5.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/.github/agents/riplex.agent.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/.github/copilot-instructions.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/.github/workflows/publish.yml +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/.gitignore +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/.vscode/settings.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/LICENSE +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/README.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/REFACTOR_PLAN.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/architecture.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/changelog.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/getting-started/configuration.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/getting-started/installation.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/guide/lookup.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/guide/orchestrate.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/guide/organize.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/guide/workflow.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/index.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/naming-rules.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/reference/cli.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/docs/troubleshooting.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/issues/cross-disc-dvdcompare-matching.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/issues/orchestrate-dvdcompare-fallback.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/issues/planned-features.md +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/mkdocs.yml +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/setup.cfg +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/cache.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/config.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/dedup.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/detect.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/disc/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/disc/makemkv.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/disc/provider.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/formatter.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/lookup.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/manifest.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/matcher.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/planner.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/provider.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/sources/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/metadata/sources/tmdb.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/models.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/normalize.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/organizer.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/scanner.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/snapshot.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/splitter.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/tagger.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/title.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex/ui.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/SOURCES.txt +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/dependency_links.txt +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/entry_points.txt +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex.egg-info/top_level.txt +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/main.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/disc_detection.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/disc_overview.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/disc_swap.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/done.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/folder_picker.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/metadata.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/orchestrate_done.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/organize_done.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/organize_preview.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/progress.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/release.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/selection.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/update.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/screens/welcome.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_app/updater.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/lookup.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/orchestrate.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/organize.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/rip.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/commands/setup.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/formatting.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/src/riplex_cli/main.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/__init__.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/fixtures/chernobyl_disc1.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/fixtures/makemkvcon_frozen_planet_ii_d2.txt +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/fixtures/makemkvcon_list.txt +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Batman Begins.snapshot.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Blade Runner (Blu-ray 4k).snapshot.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Blade Runner The Final Cut.snapshot.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Seven Worlds One Planet.snapshot.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/The Dark Knight Rises.snapshot.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/The Dark Knight.snapshot.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/snapshots/Waterworld.snapshot.json +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_cache.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_cli_utils.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_config.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_dedup.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_detect.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_disc_analysis.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_disc_fixtures.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_disc_provider.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_formatter.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_makemkv.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_matcher.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_normalize.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_organizer.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_planner.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_rip_guide.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_scanner.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_snapshot.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_splitter.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_tagger.py +0 -0
- {riplex-0.5.0 → riplex-0.5.2}/tests/test_ui.py +0 -0
- {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
|
-
|
|
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.
|
|
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.
|
|
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"
|
|
@@ -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
|
-
#
|
|
563
|
-
|
|
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.
|
|
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.
|
|
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"
|
|
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
|
|
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
|
|
File without changes
|