riplex 0.9.6__tar.gz → 0.9.7__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 (144) hide show
  1. {riplex-0.9.6/src/riplex.egg-info → riplex-0.9.7}/PKG-INFO +1 -1
  2. {riplex-0.9.6 → riplex-0.9.7/src/riplex.egg-info}/PKG-INFO +1 -1
  3. {riplex-0.9.6 → riplex-0.9.7}/src/riplex.egg-info/SOURCES.txt +1 -0
  4. {riplex-0.9.6 → riplex-0.9.7}/src/riplex.egg-info/scm_file_list.json +1 -0
  5. riplex-0.9.7/src/riplex.egg-info/scm_version.json +8 -0
  6. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/metadata.py +11 -1
  7. riplex-0.9.7/tests/test_metadata_screen.py +56 -0
  8. riplex-0.9.6/src/riplex.egg-info/scm_version.json +0 -8
  9. {riplex-0.9.6 → riplex-0.9.7}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  10. {riplex-0.9.6 → riplex-0.9.7}/.github/ISSUE_TEMPLATE/crash_report.yml +0 -0
  11. {riplex-0.9.6 → riplex-0.9.7}/.github/agents/riplex.agent.md +0 -0
  12. {riplex-0.9.6 → riplex-0.9.7}/.github/copilot-instructions.md +0 -0
  13. {riplex-0.9.6 → riplex-0.9.7}/.github/workflows/publish.yml +0 -0
  14. {riplex-0.9.6 → riplex-0.9.7}/.github/workflows/release.yml +0 -0
  15. {riplex-0.9.6 → riplex-0.9.7}/.gitignore +0 -0
  16. {riplex-0.9.6 → riplex-0.9.7}/.vscode/settings.json +0 -0
  17. {riplex-0.9.6 → riplex-0.9.7}/CONTRIBUTORS.md +0 -0
  18. {riplex-0.9.6 → riplex-0.9.7}/LICENSE +0 -0
  19. {riplex-0.9.6 → riplex-0.9.7}/README.md +0 -0
  20. {riplex-0.9.6 → riplex-0.9.7}/docs/architecture.md +0 -0
  21. {riplex-0.9.6 → riplex-0.9.7}/docs/changelog.md +0 -0
  22. {riplex-0.9.6 → riplex-0.9.7}/docs/cli-guide/lookup.md +0 -0
  23. {riplex-0.9.6 → riplex-0.9.7}/docs/cli-guide/orchestrate.md +0 -0
  24. {riplex-0.9.6 → riplex-0.9.7}/docs/cli-guide/organize.md +0 -0
  25. {riplex-0.9.6 → riplex-0.9.7}/docs/cli-guide/workflow.md +0 -0
  26. {riplex-0.9.6 → riplex-0.9.7}/docs/getting-started/configuration.md +0 -0
  27. {riplex-0.9.6 → riplex-0.9.7}/docs/getting-started/installation.md +0 -0
  28. {riplex-0.9.6 → riplex-0.9.7}/docs/gui-guide/gui-walkthrough.md +0 -0
  29. {riplex-0.9.6 → riplex-0.9.7}/docs/index.md +0 -0
  30. {riplex-0.9.6 → riplex-0.9.7}/docs/naming-rules.md +0 -0
  31. {riplex-0.9.6 → riplex-0.9.7}/docs/reference/cli.md +0 -0
  32. {riplex-0.9.6 → riplex-0.9.7}/docs/troubleshooting.md +0 -0
  33. {riplex-0.9.6 → riplex-0.9.7}/issues/debug-artifacts-consolidation.md +0 -0
  34. {riplex-0.9.6 → riplex-0.9.7}/issues/manual-rip-and-organize-escape-hatch.md +0 -0
  35. {riplex-0.9.6 → riplex-0.9.7}/issues/orchestrate-dvdcompare-fallback.md +0 -0
  36. {riplex-0.9.6 → riplex-0.9.7}/issues/planned-features.md +0 -0
  37. {riplex-0.9.6 → riplex-0.9.7}/mkdocs.yml +0 -0
  38. {riplex-0.9.6 → riplex-0.9.7}/pyproject.toml +0 -0
  39. {riplex-0.9.6 → riplex-0.9.7}/screenshots/0_Rip_Flow_BTTF.gif +0 -0
  40. {riplex-0.9.6 → riplex-0.9.7}/screenshots/1_Welcome_Screen.png +0 -0
  41. {riplex-0.9.6 → riplex-0.9.7}/screenshots/2_Disc_Detection_BTTF.png +0 -0
  42. {riplex-0.9.6 → riplex-0.9.7}/screenshots/3_Metadata_Lookup_BTTF.png +0 -0
  43. {riplex-0.9.6 → riplex-0.9.7}/screenshots/4_Disc_Release_BTTF.png +0 -0
  44. {riplex-0.9.6 → riplex-0.9.7}/screenshots/5_Multi_Disc_Overview_BTTF.png +0 -0
  45. {riplex-0.9.6 → riplex-0.9.7}/screenshots/5_Select_Title_to_RIP_BTTF.png +0 -0
  46. {riplex-0.9.6 → riplex-0.9.7}/setup.cfg +0 -0
  47. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/__init__.py +0 -0
  48. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/cache.py +0 -0
  49. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/config.py +0 -0
  50. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/dedup.py +0 -0
  51. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/detect.py +0 -0
  52. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/disc/__init__.py +0 -0
  53. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/disc/analysis.py +0 -0
  54. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/disc/makemkv.py +0 -0
  55. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/disc/provider.py +0 -0
  56. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/formatter.py +0 -0
  57. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/lookup.py +0 -0
  58. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/manifest.py +0 -0
  59. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/matcher.py +0 -0
  60. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/metadata/__init__.py +0 -0
  61. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/metadata/planner.py +0 -0
  62. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/metadata/provider.py +0 -0
  63. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/metadata/sources/__init__.py +0 -0
  64. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/metadata/sources/tmdb.py +0 -0
  65. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/models.py +0 -0
  66. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/normalize.py +0 -0
  67. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/organizer.py +0 -0
  68. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/scanner.py +0 -0
  69. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/snapshot.py +0 -0
  70. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/splitter.py +0 -0
  71. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/tagger.py +0 -0
  72. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/title.py +0 -0
  73. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/ui.py +0 -0
  74. {riplex-0.9.6 → riplex-0.9.7}/src/riplex/updater.py +0 -0
  75. {riplex-0.9.6 → riplex-0.9.7}/src/riplex.egg-info/dependency_links.txt +0 -0
  76. {riplex-0.9.6 → riplex-0.9.7}/src/riplex.egg-info/entry_points.txt +0 -0
  77. {riplex-0.9.6 → riplex-0.9.7}/src/riplex.egg-info/requires.txt +0 -0
  78. {riplex-0.9.6 → riplex-0.9.7}/src/riplex.egg-info/top_level.txt +0 -0
  79. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/__init__.py +0 -0
  80. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/bug_report.py +0 -0
  81. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/crash_dump.py +0 -0
  82. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/keep_awake.py +0 -0
  83. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/main.py +0 -0
  84. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/__init__.py +0 -0
  85. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/disc_detection.py +0 -0
  86. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/disc_overview.py +0 -0
  87. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/disc_swap.py +0 -0
  88. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/done.py +0 -0
  89. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/folder_picker.py +0 -0
  90. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/orchestrate_done.py +0 -0
  91. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/organize_done.py +0 -0
  92. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/organize_preview.py +0 -0
  93. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/progress.py +0 -0
  94. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/release.py +0 -0
  95. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/selection.py +0 -0
  96. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/update.py +0 -0
  97. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_app/screens/welcome.py +0 -0
  98. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/__init__.py +0 -0
  99. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/commands/__init__.py +0 -0
  100. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/commands/lookup.py +0 -0
  101. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/commands/orchestrate.py +0 -0
  102. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/commands/organize.py +0 -0
  103. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/commands/rip.py +0 -0
  104. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/commands/setup.py +0 -0
  105. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/formatting.py +0 -0
  106. {riplex-0.9.6 → riplex-0.9.7}/src/riplex_cli/main.py +0 -0
  107. {riplex-0.9.6 → riplex-0.9.7}/tests/__init__.py +0 -0
  108. {riplex-0.9.6 → riplex-0.9.7}/tests/fixtures/chernobyl_disc1.json +0 -0
  109. {riplex-0.9.6 → riplex-0.9.7}/tests/fixtures/makemkvcon_frozen_planet_ii_d2.txt +0 -0
  110. {riplex-0.9.6 → riplex-0.9.7}/tests/fixtures/makemkvcon_list.txt +0 -0
  111. {riplex-0.9.6 → riplex-0.9.7}/tests/snapshots/Batman Begins.snapshot.json +0 -0
  112. {riplex-0.9.6 → riplex-0.9.7}/tests/snapshots/Blade Runner (Blu-ray 4k).snapshot.json +0 -0
  113. {riplex-0.9.6 → riplex-0.9.7}/tests/snapshots/Blade Runner The Final Cut.snapshot.json +0 -0
  114. {riplex-0.9.6 → riplex-0.9.7}/tests/snapshots/Seven Worlds One Planet.snapshot.json +0 -0
  115. {riplex-0.9.6 → riplex-0.9.7}/tests/snapshots/The Dark Knight Rises.snapshot.json +0 -0
  116. {riplex-0.9.6 → riplex-0.9.7}/tests/snapshots/The Dark Knight.snapshot.json +0 -0
  117. {riplex-0.9.6 → riplex-0.9.7}/tests/snapshots/Waterworld.snapshot.json +0 -0
  118. {riplex-0.9.6 → riplex-0.9.7}/tests/test_app_main.py +0 -0
  119. {riplex-0.9.6 → riplex-0.9.7}/tests/test_cache.py +0 -0
  120. {riplex-0.9.6 → riplex-0.9.7}/tests/test_cli_utils.py +0 -0
  121. {riplex-0.9.6 → riplex-0.9.7}/tests/test_config.py +0 -0
  122. {riplex-0.9.6 → riplex-0.9.7}/tests/test_dedup.py +0 -0
  123. {riplex-0.9.6 → riplex-0.9.7}/tests/test_detect.py +0 -0
  124. {riplex-0.9.6 → riplex-0.9.7}/tests/test_disc_analysis.py +0 -0
  125. {riplex-0.9.6 → riplex-0.9.7}/tests/test_disc_detection_screen.py +0 -0
  126. {riplex-0.9.6 → riplex-0.9.7}/tests/test_disc_fixtures.py +0 -0
  127. {riplex-0.9.6 → riplex-0.9.7}/tests/test_disc_provider.py +0 -0
  128. {riplex-0.9.6 → riplex-0.9.7}/tests/test_formatter.py +0 -0
  129. {riplex-0.9.6 → riplex-0.9.7}/tests/test_lookup.py +0 -0
  130. {riplex-0.9.6 → riplex-0.9.7}/tests/test_makemkv.py +0 -0
  131. {riplex-0.9.6 → riplex-0.9.7}/tests/test_matcher.py +0 -0
  132. {riplex-0.9.6 → riplex-0.9.7}/tests/test_normalize.py +0 -0
  133. {riplex-0.9.6 → riplex-0.9.7}/tests/test_organizer.py +0 -0
  134. {riplex-0.9.6 → riplex-0.9.7}/tests/test_planner.py +0 -0
  135. {riplex-0.9.6 → riplex-0.9.7}/tests/test_release_screen.py +0 -0
  136. {riplex-0.9.6 → riplex-0.9.7}/tests/test_rip_guide.py +0 -0
  137. {riplex-0.9.6 → riplex-0.9.7}/tests/test_scanner.py +0 -0
  138. {riplex-0.9.6 → riplex-0.9.7}/tests/test_snapshot.py +0 -0
  139. {riplex-0.9.6 → riplex-0.9.7}/tests/test_splitter.py +0 -0
  140. {riplex-0.9.6 → riplex-0.9.7}/tests/test_tagger.py +0 -0
  141. {riplex-0.9.6 → riplex-0.9.7}/tests/test_tmdb_provider.py +0 -0
  142. {riplex-0.9.6 → riplex-0.9.7}/tests/test_ui.py +0 -0
  143. {riplex-0.9.6 → riplex-0.9.7}/tests/test_updater.py +0 -0
  144. {riplex-0.9.6 → riplex-0.9.7}/tests/test_welcome_screen.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: riplex
3
- Version: 0.9.6
3
+ Version: 0.9.7
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: riplex
3
- Version: 0.9.6
3
+ Version: 0.9.7
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
@@ -115,6 +115,7 @@ tests/test_formatter.py
115
115
  tests/test_lookup.py
116
116
  tests/test_makemkv.py
117
117
  tests/test_matcher.py
118
+ tests/test_metadata_screen.py
118
119
  tests/test_normalize.py
119
120
  tests/test_organizer.py
120
121
  tests/test_planner.py
@@ -93,6 +93,7 @@
93
93
  "tests/test_dedup.py",
94
94
  "tests/test_app_main.py",
95
95
  "tests/test_scanner.py",
96
+ "tests/test_metadata_screen.py",
96
97
  "tests/test_cli_utils.py",
97
98
  "tests/test_disc_detection_screen.py",
98
99
  "tests/test_lookup.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.9.7",
3
+ "distance": 0,
4
+ "node": "g75025c679a0b9a555d25469a9c105515be2f33e1",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-06-30"
8
+ }
@@ -238,8 +238,18 @@ class MetadataScreen:
238
238
  idx = int(self.radio_group.value)
239
239
  selected = self.tmdb_results[idx]
240
240
  self.app.state["tmdb_match"] = selected
241
- # New TMDb match invalidates any prior dvdcompare title override.
241
+ # A new TMDb match invalidates any prior dvdcompare selection. The
242
+ # release screen reuses state["release"]/state["dvdcompare_discs"] when
243
+ # present (to avoid re-querying on back-navigation), so leaving stale
244
+ # values here would make a freshly chosen film silently reuse the
245
+ # previous film's disc structure — e.g. starting "The Patriot" right
246
+ # after ripping "The Last Reef" in the same app session showed the
247
+ # Last Reef discs. Clear them so the lookup re-runs for this film.
242
248
  self.app.state.pop("dvdcompare_title_override", None)
249
+ self.app.state["release"] = None
250
+ self.app.state["dvdcompare_discs"] = []
251
+ self.app.state.pop("_dvdcompare_film", None)
252
+ self.app.state.pop("_dvdcompare_error", None)
243
253
 
244
254
  # For movies, fetch full detail to get runtime before proceeding
245
255
  if selected.media_type == "movie":
@@ -0,0 +1,56 @@
1
+ from riplex.metadata.provider import MetadataSearchResult
2
+ from riplex_app.screens.metadata import MetadataScreen
3
+
4
+
5
+ class _App:
6
+ def __init__(self, state):
7
+ self.state = state
8
+ self.navigated_to = None
9
+
10
+ def navigate(self, screen):
11
+ self.navigated_to = screen
12
+
13
+
14
+ class _RadioGroup:
15
+ def __init__(self, value):
16
+ self.value = value
17
+
18
+
19
+ def _result(title, media_type="tv", year=2000):
20
+ return MetadataSearchResult(
21
+ source_id=f"{media_type}:1",
22
+ title=title,
23
+ year=year,
24
+ media_type=media_type,
25
+ overview="",
26
+ popularity=1.0,
27
+ )
28
+
29
+
30
+ class TestMetadataNextClearsStaleDvdcompare:
31
+ def test_new_match_clears_previous_release_and_discs(self):
32
+ # Simulate stale dvdcompare selection left over from a prior film in
33
+ # the same app session (e.g. just finished "The Last Reef").
34
+ app = _App({
35
+ "title": "The Patriot",
36
+ "release": object(),
37
+ "dvdcompare_discs": [object(), object()],
38
+ "_dvdcompare_film": object(),
39
+ "_dvdcompare_error": "stale error",
40
+ "dvdcompare_title_override": "The Last Reef",
41
+ })
42
+ screen = MetadataScreen(app)
43
+ screen.tmdb_results = [_result("The Patriot")]
44
+ screen.radio_group = _RadioGroup("0")
45
+
46
+ screen._next(None)
47
+
48
+ # The freshly chosen film must not inherit the previous film's discs.
49
+ assert app.state["release"] is None
50
+ assert app.state["dvdcompare_discs"] == []
51
+ assert "_dvdcompare_film" not in app.state
52
+ assert "_dvdcompare_error" not in app.state
53
+ assert "dvdcompare_title_override" not in app.state
54
+ assert app.state["tmdb_match"].title == "The Patriot"
55
+ # A TV match navigates straight to the release lookup.
56
+ assert app.navigated_to == "release"
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.9.6",
3
- "distance": 0,
4
- "node": "g3311b030adbd0a061c09263e0868772b3915ab45",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-06-28"
8
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes