riplex 0.7.3__tar.gz → 0.7.4__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.7.3/src/riplex.egg-info → riplex-0.7.4}/PKG-INFO +1 -1
- {riplex-0.7.3 → riplex-0.7.4}/docs/changelog.md +6 -0
- riplex-0.7.4/issues/manual-rip-and-organize-escape-hatch.md +106 -0
- {riplex-0.7.3 → riplex-0.7.4/src/riplex.egg-info}/PKG-INFO +1 -1
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/SOURCES.txt +2 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/release.py +12 -1
- riplex-0.7.4/tests/test_release_screen.py +40 -0
- {riplex-0.7.3 → riplex-0.7.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/.github/ISSUE_TEMPLATE/crash_report.yml +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/.github/agents/riplex.agent.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/.github/copilot-instructions.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/.github/workflows/publish.yml +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/.github/workflows/release.yml +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/.gitignore +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/.vscode/settings.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/CONTRIBUTORS.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/LICENSE +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/README.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/architecture.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/cli-guide/lookup.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/cli-guide/orchestrate.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/cli-guide/organize.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/cli-guide/workflow.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/getting-started/configuration.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/getting-started/installation.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/gui-guide/gui-walkthrough.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/index.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/naming-rules.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/reference/cli.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/docs/troubleshooting.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/issues/debug-artifacts-consolidation.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/issues/orchestrate-dvdcompare-fallback.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/issues/planned-features.md +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/mkdocs.yml +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/pyproject.toml +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/screenshots/0_Rip_Flow_BTTF.gif +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/screenshots/1_Welcome_Screen.png +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/screenshots/2_Disc_Detection_BTTF.png +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/screenshots/3_Metadata_Lookup_BTTF.png +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/screenshots/4_Disc_Release_BTTF.png +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/screenshots/5_Multi_Disc_Overview_BTTF.png +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/screenshots/5_Select_Title_to_RIP_BTTF.png +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/setup.cfg +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/cache.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/config.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/dedup.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/detect.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/disc/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/disc/analysis.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/disc/makemkv.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/disc/provider.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/formatter.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/lookup.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/manifest.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/matcher.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/planner.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/provider.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/sources/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/sources/tmdb.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/models.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/normalize.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/organizer.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/scanner.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/snapshot.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/splitter.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/tagger.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/title.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/ui.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex/updater.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/dependency_links.txt +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/entry_points.txt +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/requires.txt +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/top_level.txt +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/bug_report.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/crash_dump.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/keep_awake.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/main.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/disc_detection.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/disc_overview.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/disc_swap.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/done.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/folder_picker.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/metadata.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/orchestrate_done.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/organize_done.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/organize_preview.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/progress.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/selection.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/update.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/welcome.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/lookup.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/orchestrate.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/organize.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/rip.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/setup.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/formatting.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/main.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/__init__.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/fixtures/chernobyl_disc1.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/fixtures/makemkvcon_frozen_planet_ii_d2.txt +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/fixtures/makemkvcon_list.txt +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Batman Begins.snapshot.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Blade Runner (Blu-ray 4k).snapshot.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Blade Runner The Final Cut.snapshot.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Seven Worlds One Planet.snapshot.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/The Dark Knight Rises.snapshot.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/The Dark Knight.snapshot.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Waterworld.snapshot.json +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_cache.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_cli_utils.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_config.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_dedup.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_detect.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_disc_analysis.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_disc_detection_screen.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_disc_fixtures.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_disc_provider.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_formatter.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_lookup.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_makemkv.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_matcher.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_normalize.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_organizer.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_planner.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_rip_guide.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_scanner.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_snapshot.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_splitter.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_tagger.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_ui.py +0 -0
- {riplex-0.7.3 → riplex-0.7.4}/tests/test_updater.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: riplex
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.4
|
|
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
|
|
@@ -4,6 +4,12 @@ All notable changes to the riplex documentation are recorded here.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/).
|
|
6
6
|
|
|
7
|
+
## v0.7.4 — 2026-06-10
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **GUI: empty Disc Overview after continuing without dvdcompare data.** When dvdcompare had no matching release, the orchestrate flow still navigated to the multi-disc overview, which only renders dvdcompare-provided disc rows. The no-dvdcompare fallback now treats the inserted disc as a single-disc rip and jumps directly to title selection, where TMDb runtime heuristics can pick the main feature.
|
|
12
|
+
|
|
7
13
|
## v0.7.3 — 2026-06-10
|
|
8
14
|
|
|
9
15
|
### Fixed
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# GUI: manual rip and manual organize escape hatches
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
When riplex can't classify a disc — no dvdcompare match, ambiguous TMDb
|
|
6
|
+
result, multi-feature compilation, region-coded oddity, etc. — the GUI flow
|
|
7
|
+
dead-ends at the title-selection screen. The user has to leave riplex-ui,
|
|
8
|
+
launch the MakeMKV GUI to rip the disc directly, and then either keep those
|
|
9
|
+
files unorganized or manually rename and move them into Plex layout.
|
|
10
|
+
|
|
11
|
+
We hit this in practice with a BBC Earth Blu-ray containing two unrelated
|
|
12
|
+
features (*Wild Africa* + *Tiny Giants*). The disc isn't on dvdcompare, TMDb
|
|
13
|
+
has only a combined "double feature" entry, and riplex's planner assumes one
|
|
14
|
+
disc → one TMDb item, so the rip flow couldn't proceed at all.
|
|
15
|
+
|
|
16
|
+
## Why we don't want to model compilations directly
|
|
17
|
+
|
|
18
|
+
Compilation discs that contain multiple unrelated films are rare enough that
|
|
19
|
+
building first-class support (per-title TMDb matching, per-title disc
|
|
20
|
+
metadata, multi-target organize) isn't justified. A generic escape hatch is
|
|
21
|
+
cheaper and covers other niche scenarios as a side benefit (foreign releases
|
|
22
|
+
without metadata, damaged-disc recovery, special workshop discs, etc.).
|
|
23
|
+
|
|
24
|
+
## Proposed UX
|
|
25
|
+
|
|
26
|
+
Two new entry points in the GUI, both intentionally generic:
|
|
27
|
+
|
|
28
|
+
### 1. "Manual rip" button on the title-selection screen
|
|
29
|
+
|
|
30
|
+
When riplex can't classify titles confidently (no dvdcompare match **and**
|
|
31
|
+
TMDb selection is ambiguous, or user just wants raw control), surface a
|
|
32
|
+
"Manual rip" button alongside the existing "Rip selected" button.
|
|
33
|
+
|
|
34
|
+
Clicking it drops the user into a flat MakeMKV-style title list:
|
|
35
|
+
|
|
36
|
+
- All titles, sorted by index, with duration / size / chapter count
|
|
37
|
+
- Checkbox per title (default: all titles longer than 2 minutes)
|
|
38
|
+
- Output folder picker (defaults to `<output_root>/_MakeMKV/<disc_label>/`)
|
|
39
|
+
- "Rip" button → calls `makemkvcon mkv all` (or per-title) and shows the
|
|
40
|
+
existing progress UI
|
|
41
|
+
|
|
42
|
+
No metadata lookup, no organize, no Plex naming. The user lands in the "Done"
|
|
43
|
+
screen with a folder of raw MKVs, with a follow-up button: "Organize this
|
|
44
|
+
folder now → opens the manual organize screen pre-pointed at that path."
|
|
45
|
+
|
|
46
|
+
### 2. "Organize existing folder" entry on the welcome screen
|
|
47
|
+
|
|
48
|
+
A second card on welcome (next to "Rip a disc") titled "Organize existing
|
|
49
|
+
files." Picks up an arbitrary folder of MKVs and walks the user through:
|
|
50
|
+
|
|
51
|
+
1. **Folder picker** → list MKVs with sizes and ffprobe runtimes.
|
|
52
|
+
2. **TMDb search** (reuses existing `metadata` screen) → select the canonical
|
|
53
|
+
entry.
|
|
54
|
+
3. **File assignment** → for each MKV, drop-down: `Main feature`, `Part 1
|
|
55
|
+
(-pt1)`, `Part 2 (-pt2)`, `Extra → behindthescenes`, `Extra → featurette`,
|
|
56
|
+
`Extra → trailer`, `Skip`. Auto-suggest based on duration.
|
|
57
|
+
4. **Plan preview** → show source → destination paths.
|
|
58
|
+
5. **Apply** → move + rename into Plex layout, with the existing dry-run
|
|
59
|
+
default and `Execute` toggle.
|
|
60
|
+
|
|
61
|
+
This is essentially the existing `riplex organize` CLI behavior with a GUI in
|
|
62
|
+
front of it. No new business logic — just a thin wrapper that also handles
|
|
63
|
+
the "two parts of one TMDb movie" case via the assignment step.
|
|
64
|
+
|
|
65
|
+
## Why this works for the BBC Earth case
|
|
66
|
+
|
|
67
|
+
End-to-end flow stays inside riplex-ui:
|
|
68
|
+
|
|
69
|
+
1. Insert disc → riplex tries to classify, fails to find dvdcompare match.
|
|
70
|
+
2. User clicks **Manual rip**, picks the two main titles, hits Rip.
|
|
71
|
+
3. Done screen → click **Organize this folder**.
|
|
72
|
+
4. TMDb search → "Wild Africa Tiny Giants" → pick `tmdb-1657586`.
|
|
73
|
+
5. Assign t00 → pt1, t01 → pt2.
|
|
74
|
+
6. Apply → files land in `Movies\Wild Africa - Tiny Giants (2016)\`.
|
|
75
|
+
|
|
76
|
+
No external tool, no manual `Move-Item`.
|
|
77
|
+
|
|
78
|
+
## Tradeoffs
|
|
79
|
+
|
|
80
|
+
- **Pro**: covers any disc riplex can't classify, not just compilations.
|
|
81
|
+
- **Pro**: reuses existing rip + organize plumbing; mostly UI work.
|
|
82
|
+
- **Con**: more GUI surface (two screens, file-assignment widget).
|
|
83
|
+
- **Con**: risk of users defaulting to manual mode and bypassing the smart
|
|
84
|
+
classification we built. Mitigation: gate the manual-rip button behind a
|
|
85
|
+
"we couldn't classify this disc" trigger or an "Advanced" reveal, so it's
|
|
86
|
+
not a peer to the normal "Rip selected" button on every disc.
|
|
87
|
+
|
|
88
|
+
## Out of scope
|
|
89
|
+
|
|
90
|
+
- Per-title TMDb matching (full compilation support).
|
|
91
|
+
- Multi-target organize where one folder of MKVs maps to N different TMDb
|
|
92
|
+
entries. Manual mode handles this by running the organize wizard once per
|
|
93
|
+
target with file selection.
|
|
94
|
+
- Saving manual-mode decisions for repeat use (cache).
|
|
95
|
+
|
|
96
|
+
## Files likely involved
|
|
97
|
+
|
|
98
|
+
- `src/riplex_app/screens/selection.py` — add "Manual rip" button + branch.
|
|
99
|
+
- `src/riplex_app/screens/manual_rip.py` (new) — flat title list + ripper.
|
|
100
|
+
- `src/riplex_app/screens/welcome.py` — add "Organize existing files" card.
|
|
101
|
+
- `src/riplex_app/screens/manual_organize.py` (new) — folder picker → TMDb →
|
|
102
|
+
assignment → plan preview → apply.
|
|
103
|
+
- `src/riplex/organizer.py` — already has the path-building logic; may need
|
|
104
|
+
a small helper for the assignment data structure.
|
|
105
|
+
- `src/riplex_cli/commands/organize.py` — sanity-check the CLI still works
|
|
106
|
+
after any planner refactor.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: riplex
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.4
|
|
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
|
|
@@ -25,6 +25,7 @@ docs/getting-started/installation.md
|
|
|
25
25
|
docs/gui-guide/gui-walkthrough.md
|
|
26
26
|
docs/reference/cli.md
|
|
27
27
|
issues/debug-artifacts-consolidation.md
|
|
28
|
+
issues/manual-rip-and-organize-escape-hatch.md
|
|
28
29
|
issues/orchestrate-dvdcompare-fallback.md
|
|
29
30
|
issues/planned-features.md
|
|
30
31
|
screenshots/0_Rip_Flow_BTTF.gif
|
|
@@ -114,6 +115,7 @@ tests/test_matcher.py
|
|
|
114
115
|
tests/test_normalize.py
|
|
115
116
|
tests/test_organizer.py
|
|
116
117
|
tests/test_planner.py
|
|
118
|
+
tests/test_release_screen.py
|
|
117
119
|
tests/test_rip_guide.py
|
|
118
120
|
tests/test_scanner.py
|
|
119
121
|
tests/test_snapshot.py
|
|
@@ -31,6 +31,17 @@ class ReleaseScreen:
|
|
|
31
31
|
return "disc_overview"
|
|
32
32
|
return "selection"
|
|
33
33
|
|
|
34
|
+
def _skip_next_screen(self) -> str:
|
|
35
|
+
"""Screen to use when continuing without dvdcompare data."""
|
|
36
|
+
workflow = self.app.state.get("workflow")
|
|
37
|
+
if workflow == "orchestrate":
|
|
38
|
+
self.app.state["_orchestrate_disc_number"] = 1
|
|
39
|
+
self.app.state["disc_queue"] = [1]
|
|
40
|
+
self.app.state["current_disc_idx"] = 0
|
|
41
|
+
self.app.state["all_rip_results"] = {}
|
|
42
|
+
return "selection"
|
|
43
|
+
return self._next_screen
|
|
44
|
+
|
|
34
45
|
def _current_search_title(self) -> str:
|
|
35
46
|
"""Title to use for dvdcompare lookup (user override > TMDb > raw title)."""
|
|
36
47
|
override = self.app.state.get("dvdcompare_title_override")
|
|
@@ -499,7 +510,7 @@ class ReleaseScreen:
|
|
|
499
510
|
def _skip(self, e):
|
|
500
511
|
"""Proceed without dvdcompare data."""
|
|
501
512
|
self.app.state["dvdcompare_discs"] = []
|
|
502
|
-
self.app.navigate(self.
|
|
513
|
+
self.app.navigate(self._skip_next_screen())
|
|
503
514
|
|
|
504
515
|
def _use_release(self, release):
|
|
505
516
|
"""Convert a dvdcompare release to PlannedDiscs and navigate."""
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from riplex_app.screens.release import ReleaseScreen
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class _App:
|
|
5
|
+
def __init__(self, state):
|
|
6
|
+
self.state = state
|
|
7
|
+
self.navigated_to = None
|
|
8
|
+
|
|
9
|
+
def navigate(self, screen):
|
|
10
|
+
self.navigated_to = screen
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TestReleaseSkipRouting:
|
|
14
|
+
def test_rip_workflow_continues_to_selection(self):
|
|
15
|
+
app = _App({"workflow": "rip"})
|
|
16
|
+
screen = ReleaseScreen(app)
|
|
17
|
+
|
|
18
|
+
screen._skip(None)
|
|
19
|
+
|
|
20
|
+
assert app.state["dvdcompare_discs"] == []
|
|
21
|
+
assert app.navigated_to == "selection"
|
|
22
|
+
|
|
23
|
+
def test_orchestrate_with_release_uses_disc_overview(self):
|
|
24
|
+
app = _App({"workflow": "orchestrate"})
|
|
25
|
+
screen = ReleaseScreen(app)
|
|
26
|
+
|
|
27
|
+
assert screen._next_screen == "disc_overview"
|
|
28
|
+
|
|
29
|
+
def test_orchestrate_without_dvdcompare_starts_single_disc_selection(self):
|
|
30
|
+
app = _App({"workflow": "orchestrate"})
|
|
31
|
+
screen = ReleaseScreen(app)
|
|
32
|
+
|
|
33
|
+
screen._skip(None)
|
|
34
|
+
|
|
35
|
+
assert app.state["dvdcompare_discs"] == []
|
|
36
|
+
assert app.state["_orchestrate_disc_number"] == 1
|
|
37
|
+
assert app.state["disc_queue"] == [1]
|
|
38
|
+
assert app.state["current_disc_idx"] == 0
|
|
39
|
+
assert app.state["all_rip_results"] == {}
|
|
40
|
+
assert app.navigated_to == "selection"
|
|
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
|
|
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
|