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.
Files changed (137) hide show
  1. {riplex-0.7.3/src/riplex.egg-info → riplex-0.7.4}/PKG-INFO +1 -1
  2. {riplex-0.7.3 → riplex-0.7.4}/docs/changelog.md +6 -0
  3. riplex-0.7.4/issues/manual-rip-and-organize-escape-hatch.md +106 -0
  4. {riplex-0.7.3 → riplex-0.7.4/src/riplex.egg-info}/PKG-INFO +1 -1
  5. {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/SOURCES.txt +2 -0
  6. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/release.py +12 -1
  7. riplex-0.7.4/tests/test_release_screen.py +40 -0
  8. {riplex-0.7.3 → riplex-0.7.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  9. {riplex-0.7.3 → riplex-0.7.4}/.github/ISSUE_TEMPLATE/crash_report.yml +0 -0
  10. {riplex-0.7.3 → riplex-0.7.4}/.github/agents/riplex.agent.md +0 -0
  11. {riplex-0.7.3 → riplex-0.7.4}/.github/copilot-instructions.md +0 -0
  12. {riplex-0.7.3 → riplex-0.7.4}/.github/workflows/publish.yml +0 -0
  13. {riplex-0.7.3 → riplex-0.7.4}/.github/workflows/release.yml +0 -0
  14. {riplex-0.7.3 → riplex-0.7.4}/.gitignore +0 -0
  15. {riplex-0.7.3 → riplex-0.7.4}/.vscode/settings.json +0 -0
  16. {riplex-0.7.3 → riplex-0.7.4}/CONTRIBUTORS.md +0 -0
  17. {riplex-0.7.3 → riplex-0.7.4}/LICENSE +0 -0
  18. {riplex-0.7.3 → riplex-0.7.4}/README.md +0 -0
  19. {riplex-0.7.3 → riplex-0.7.4}/docs/architecture.md +0 -0
  20. {riplex-0.7.3 → riplex-0.7.4}/docs/cli-guide/lookup.md +0 -0
  21. {riplex-0.7.3 → riplex-0.7.4}/docs/cli-guide/orchestrate.md +0 -0
  22. {riplex-0.7.3 → riplex-0.7.4}/docs/cli-guide/organize.md +0 -0
  23. {riplex-0.7.3 → riplex-0.7.4}/docs/cli-guide/workflow.md +0 -0
  24. {riplex-0.7.3 → riplex-0.7.4}/docs/getting-started/configuration.md +0 -0
  25. {riplex-0.7.3 → riplex-0.7.4}/docs/getting-started/installation.md +0 -0
  26. {riplex-0.7.3 → riplex-0.7.4}/docs/gui-guide/gui-walkthrough.md +0 -0
  27. {riplex-0.7.3 → riplex-0.7.4}/docs/index.md +0 -0
  28. {riplex-0.7.3 → riplex-0.7.4}/docs/naming-rules.md +0 -0
  29. {riplex-0.7.3 → riplex-0.7.4}/docs/reference/cli.md +0 -0
  30. {riplex-0.7.3 → riplex-0.7.4}/docs/troubleshooting.md +0 -0
  31. {riplex-0.7.3 → riplex-0.7.4}/issues/debug-artifacts-consolidation.md +0 -0
  32. {riplex-0.7.3 → riplex-0.7.4}/issues/orchestrate-dvdcompare-fallback.md +0 -0
  33. {riplex-0.7.3 → riplex-0.7.4}/issues/planned-features.md +0 -0
  34. {riplex-0.7.3 → riplex-0.7.4}/mkdocs.yml +0 -0
  35. {riplex-0.7.3 → riplex-0.7.4}/pyproject.toml +0 -0
  36. {riplex-0.7.3 → riplex-0.7.4}/screenshots/0_Rip_Flow_BTTF.gif +0 -0
  37. {riplex-0.7.3 → riplex-0.7.4}/screenshots/1_Welcome_Screen.png +0 -0
  38. {riplex-0.7.3 → riplex-0.7.4}/screenshots/2_Disc_Detection_BTTF.png +0 -0
  39. {riplex-0.7.3 → riplex-0.7.4}/screenshots/3_Metadata_Lookup_BTTF.png +0 -0
  40. {riplex-0.7.3 → riplex-0.7.4}/screenshots/4_Disc_Release_BTTF.png +0 -0
  41. {riplex-0.7.3 → riplex-0.7.4}/screenshots/5_Multi_Disc_Overview_BTTF.png +0 -0
  42. {riplex-0.7.3 → riplex-0.7.4}/screenshots/5_Select_Title_to_RIP_BTTF.png +0 -0
  43. {riplex-0.7.3 → riplex-0.7.4}/setup.cfg +0 -0
  44. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/__init__.py +0 -0
  45. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/cache.py +0 -0
  46. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/config.py +0 -0
  47. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/dedup.py +0 -0
  48. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/detect.py +0 -0
  49. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/disc/__init__.py +0 -0
  50. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/disc/analysis.py +0 -0
  51. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/disc/makemkv.py +0 -0
  52. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/disc/provider.py +0 -0
  53. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/formatter.py +0 -0
  54. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/lookup.py +0 -0
  55. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/manifest.py +0 -0
  56. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/matcher.py +0 -0
  57. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/__init__.py +0 -0
  58. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/planner.py +0 -0
  59. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/provider.py +0 -0
  60. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/sources/__init__.py +0 -0
  61. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/metadata/sources/tmdb.py +0 -0
  62. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/models.py +0 -0
  63. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/normalize.py +0 -0
  64. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/organizer.py +0 -0
  65. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/scanner.py +0 -0
  66. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/snapshot.py +0 -0
  67. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/splitter.py +0 -0
  68. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/tagger.py +0 -0
  69. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/title.py +0 -0
  70. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/ui.py +0 -0
  71. {riplex-0.7.3 → riplex-0.7.4}/src/riplex/updater.py +0 -0
  72. {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/dependency_links.txt +0 -0
  73. {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/entry_points.txt +0 -0
  74. {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/requires.txt +0 -0
  75. {riplex-0.7.3 → riplex-0.7.4}/src/riplex.egg-info/top_level.txt +0 -0
  76. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/__init__.py +0 -0
  77. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/bug_report.py +0 -0
  78. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/crash_dump.py +0 -0
  79. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/keep_awake.py +0 -0
  80. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/main.py +0 -0
  81. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/__init__.py +0 -0
  82. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/disc_detection.py +0 -0
  83. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/disc_overview.py +0 -0
  84. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/disc_swap.py +0 -0
  85. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/done.py +0 -0
  86. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/folder_picker.py +0 -0
  87. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/metadata.py +0 -0
  88. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/orchestrate_done.py +0 -0
  89. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/organize_done.py +0 -0
  90. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/organize_preview.py +0 -0
  91. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/progress.py +0 -0
  92. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/selection.py +0 -0
  93. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/update.py +0 -0
  94. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_app/screens/welcome.py +0 -0
  95. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/__init__.py +0 -0
  96. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/__init__.py +0 -0
  97. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/lookup.py +0 -0
  98. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/orchestrate.py +0 -0
  99. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/organize.py +0 -0
  100. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/rip.py +0 -0
  101. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/commands/setup.py +0 -0
  102. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/formatting.py +0 -0
  103. {riplex-0.7.3 → riplex-0.7.4}/src/riplex_cli/main.py +0 -0
  104. {riplex-0.7.3 → riplex-0.7.4}/tests/__init__.py +0 -0
  105. {riplex-0.7.3 → riplex-0.7.4}/tests/fixtures/chernobyl_disc1.json +0 -0
  106. {riplex-0.7.3 → riplex-0.7.4}/tests/fixtures/makemkvcon_frozen_planet_ii_d2.txt +0 -0
  107. {riplex-0.7.3 → riplex-0.7.4}/tests/fixtures/makemkvcon_list.txt +0 -0
  108. {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Batman Begins.snapshot.json +0 -0
  109. {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Blade Runner (Blu-ray 4k).snapshot.json +0 -0
  110. {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Blade Runner The Final Cut.snapshot.json +0 -0
  111. {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Seven Worlds One Planet.snapshot.json +0 -0
  112. {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/The Dark Knight Rises.snapshot.json +0 -0
  113. {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/The Dark Knight.snapshot.json +0 -0
  114. {riplex-0.7.3 → riplex-0.7.4}/tests/snapshots/Waterworld.snapshot.json +0 -0
  115. {riplex-0.7.3 → riplex-0.7.4}/tests/test_cache.py +0 -0
  116. {riplex-0.7.3 → riplex-0.7.4}/tests/test_cli_utils.py +0 -0
  117. {riplex-0.7.3 → riplex-0.7.4}/tests/test_config.py +0 -0
  118. {riplex-0.7.3 → riplex-0.7.4}/tests/test_dedup.py +0 -0
  119. {riplex-0.7.3 → riplex-0.7.4}/tests/test_detect.py +0 -0
  120. {riplex-0.7.3 → riplex-0.7.4}/tests/test_disc_analysis.py +0 -0
  121. {riplex-0.7.3 → riplex-0.7.4}/tests/test_disc_detection_screen.py +0 -0
  122. {riplex-0.7.3 → riplex-0.7.4}/tests/test_disc_fixtures.py +0 -0
  123. {riplex-0.7.3 → riplex-0.7.4}/tests/test_disc_provider.py +0 -0
  124. {riplex-0.7.3 → riplex-0.7.4}/tests/test_formatter.py +0 -0
  125. {riplex-0.7.3 → riplex-0.7.4}/tests/test_lookup.py +0 -0
  126. {riplex-0.7.3 → riplex-0.7.4}/tests/test_makemkv.py +0 -0
  127. {riplex-0.7.3 → riplex-0.7.4}/tests/test_matcher.py +0 -0
  128. {riplex-0.7.3 → riplex-0.7.4}/tests/test_normalize.py +0 -0
  129. {riplex-0.7.3 → riplex-0.7.4}/tests/test_organizer.py +0 -0
  130. {riplex-0.7.3 → riplex-0.7.4}/tests/test_planner.py +0 -0
  131. {riplex-0.7.3 → riplex-0.7.4}/tests/test_rip_guide.py +0 -0
  132. {riplex-0.7.3 → riplex-0.7.4}/tests/test_scanner.py +0 -0
  133. {riplex-0.7.3 → riplex-0.7.4}/tests/test_snapshot.py +0 -0
  134. {riplex-0.7.3 → riplex-0.7.4}/tests/test_splitter.py +0 -0
  135. {riplex-0.7.3 → riplex-0.7.4}/tests/test_tagger.py +0 -0
  136. {riplex-0.7.3 → riplex-0.7.4}/tests/test_ui.py +0 -0
  137. {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
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
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._next_screen)
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