riplex 0.6.0__tar.gz → 0.6.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 (125) hide show
  1. riplex-0.6.2/.gitignore +12 -0
  2. {riplex-0.6.0/src/riplex.egg-info → riplex-0.6.2}/PKG-INFO +20 -18
  3. {riplex-0.6.0 → riplex-0.6.2}/README.md +18 -16
  4. {riplex-0.6.0 → riplex-0.6.2}/docs/changelog.md +15 -0
  5. riplex-0.6.2/docs/getting-started/installation.md +330 -0
  6. {riplex-0.6.0 → riplex-0.6.2}/issues/planned-features.md +0 -45
  7. {riplex-0.6.0 → riplex-0.6.2}/pyproject.toml +1 -1
  8. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/disc/provider.py +62 -5
  9. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/matcher.py +110 -11
  10. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/organizer.py +9 -1
  11. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/scanner.py +7 -0
  12. {riplex-0.6.0 → riplex-0.6.2/src/riplex.egg-info}/PKG-INFO +20 -18
  13. {riplex-0.6.0 → riplex-0.6.2}/src/riplex.egg-info/SOURCES.txt +0 -2
  14. {riplex-0.6.0 → riplex-0.6.2}/src/riplex.egg-info/requires.txt +1 -1
  15. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/disc_detection.py +3 -3
  16. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/folder_picker.py +13 -2
  17. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/release.py +3 -3
  18. {riplex-0.6.0 → riplex-0.6.2}/tests/test_matcher.py +227 -0
  19. {riplex-0.6.0 → riplex-0.6.2}/tests/test_organizer.py +36 -0
  20. riplex-0.6.0/.gitignore +0 -0
  21. riplex-0.6.0/REFACTOR_PLAN.md +0 -65
  22. riplex-0.6.0/docs/getting-started/installation.md +0 -217
  23. riplex-0.6.0/issues/cross-disc-dvdcompare-matching.md +0 -35
  24. {riplex-0.6.0 → riplex-0.6.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  25. {riplex-0.6.0 → riplex-0.6.2}/.github/agents/riplex.agent.md +0 -0
  26. {riplex-0.6.0 → riplex-0.6.2}/.github/copilot-instructions.md +0 -0
  27. {riplex-0.6.0 → riplex-0.6.2}/.github/workflows/publish.yml +0 -0
  28. {riplex-0.6.0 → riplex-0.6.2}/.github/workflows/release.yml +0 -0
  29. {riplex-0.6.0 → riplex-0.6.2}/.vscode/settings.json +0 -0
  30. {riplex-0.6.0 → riplex-0.6.2}/CONTRIBUTORS.md +0 -0
  31. {riplex-0.6.0 → riplex-0.6.2}/LICENSE +0 -0
  32. {riplex-0.6.0 → riplex-0.6.2}/docs/architecture.md +0 -0
  33. {riplex-0.6.0 → riplex-0.6.2}/docs/getting-started/configuration.md +0 -0
  34. {riplex-0.6.0 → riplex-0.6.2}/docs/guide/lookup.md +0 -0
  35. {riplex-0.6.0 → riplex-0.6.2}/docs/guide/orchestrate.md +0 -0
  36. {riplex-0.6.0 → riplex-0.6.2}/docs/guide/organize.md +0 -0
  37. {riplex-0.6.0 → riplex-0.6.2}/docs/guide/workflow.md +0 -0
  38. {riplex-0.6.0 → riplex-0.6.2}/docs/index.md +0 -0
  39. {riplex-0.6.0 → riplex-0.6.2}/docs/naming-rules.md +0 -0
  40. {riplex-0.6.0 → riplex-0.6.2}/docs/reference/cli.md +0 -0
  41. {riplex-0.6.0 → riplex-0.6.2}/docs/troubleshooting.md +0 -0
  42. {riplex-0.6.0 → riplex-0.6.2}/issues/orchestrate-dvdcompare-fallback.md +0 -0
  43. {riplex-0.6.0 → riplex-0.6.2}/mkdocs.yml +0 -0
  44. {riplex-0.6.0 → riplex-0.6.2}/setup.cfg +0 -0
  45. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/__init__.py +0 -0
  46. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/cache.py +0 -0
  47. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/config.py +0 -0
  48. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/dedup.py +0 -0
  49. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/detect.py +0 -0
  50. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/disc/__init__.py +0 -0
  51. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/disc/analysis.py +0 -0
  52. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/disc/makemkv.py +0 -0
  53. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/formatter.py +0 -0
  54. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/lookup.py +0 -0
  55. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/manifest.py +0 -0
  56. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/metadata/__init__.py +0 -0
  57. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/metadata/planner.py +0 -0
  58. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/metadata/provider.py +0 -0
  59. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/metadata/sources/__init__.py +0 -0
  60. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/metadata/sources/tmdb.py +0 -0
  61. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/models.py +0 -0
  62. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/normalize.py +0 -0
  63. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/snapshot.py +0 -0
  64. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/splitter.py +0 -0
  65. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/tagger.py +0 -0
  66. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/title.py +0 -0
  67. {riplex-0.6.0 → riplex-0.6.2}/src/riplex/ui.py +0 -0
  68. {riplex-0.6.0 → riplex-0.6.2}/src/riplex.egg-info/dependency_links.txt +0 -0
  69. {riplex-0.6.0 → riplex-0.6.2}/src/riplex.egg-info/entry_points.txt +0 -0
  70. {riplex-0.6.0 → riplex-0.6.2}/src/riplex.egg-info/top_level.txt +0 -0
  71. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/__init__.py +0 -0
  72. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/bug_report.py +0 -0
  73. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/main.py +0 -0
  74. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/__init__.py +0 -0
  75. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/disc_overview.py +0 -0
  76. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/disc_swap.py +0 -0
  77. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/done.py +0 -0
  78. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/metadata.py +0 -0
  79. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/orchestrate_done.py +0 -0
  80. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/organize_done.py +0 -0
  81. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/organize_preview.py +0 -0
  82. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/progress.py +0 -0
  83. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/selection.py +0 -0
  84. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/update.py +0 -0
  85. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/screens/welcome.py +0 -0
  86. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_app/updater.py +0 -0
  87. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/__init__.py +0 -0
  88. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/commands/__init__.py +0 -0
  89. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/commands/lookup.py +0 -0
  90. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/commands/orchestrate.py +0 -0
  91. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/commands/organize.py +0 -0
  92. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/commands/rip.py +0 -0
  93. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/commands/setup.py +0 -0
  94. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/formatting.py +0 -0
  95. {riplex-0.6.0 → riplex-0.6.2}/src/riplex_cli/main.py +0 -0
  96. {riplex-0.6.0 → riplex-0.6.2}/tests/__init__.py +0 -0
  97. {riplex-0.6.0 → riplex-0.6.2}/tests/fixtures/chernobyl_disc1.json +0 -0
  98. {riplex-0.6.0 → riplex-0.6.2}/tests/fixtures/makemkvcon_frozen_planet_ii_d2.txt +0 -0
  99. {riplex-0.6.0 → riplex-0.6.2}/tests/fixtures/makemkvcon_list.txt +0 -0
  100. {riplex-0.6.0 → riplex-0.6.2}/tests/snapshots/Batman Begins.snapshot.json +0 -0
  101. {riplex-0.6.0 → riplex-0.6.2}/tests/snapshots/Blade Runner (Blu-ray 4k).snapshot.json +0 -0
  102. {riplex-0.6.0 → riplex-0.6.2}/tests/snapshots/Blade Runner The Final Cut.snapshot.json +0 -0
  103. {riplex-0.6.0 → riplex-0.6.2}/tests/snapshots/Seven Worlds One Planet.snapshot.json +0 -0
  104. {riplex-0.6.0 → riplex-0.6.2}/tests/snapshots/The Dark Knight Rises.snapshot.json +0 -0
  105. {riplex-0.6.0 → riplex-0.6.2}/tests/snapshots/The Dark Knight.snapshot.json +0 -0
  106. {riplex-0.6.0 → riplex-0.6.2}/tests/snapshots/Waterworld.snapshot.json +0 -0
  107. {riplex-0.6.0 → riplex-0.6.2}/tests/test_cache.py +0 -0
  108. {riplex-0.6.0 → riplex-0.6.2}/tests/test_cli_utils.py +0 -0
  109. {riplex-0.6.0 → riplex-0.6.2}/tests/test_config.py +0 -0
  110. {riplex-0.6.0 → riplex-0.6.2}/tests/test_dedup.py +0 -0
  111. {riplex-0.6.0 → riplex-0.6.2}/tests/test_detect.py +0 -0
  112. {riplex-0.6.0 → riplex-0.6.2}/tests/test_disc_analysis.py +0 -0
  113. {riplex-0.6.0 → riplex-0.6.2}/tests/test_disc_fixtures.py +0 -0
  114. {riplex-0.6.0 → riplex-0.6.2}/tests/test_disc_provider.py +0 -0
  115. {riplex-0.6.0 → riplex-0.6.2}/tests/test_formatter.py +0 -0
  116. {riplex-0.6.0 → riplex-0.6.2}/tests/test_makemkv.py +0 -0
  117. {riplex-0.6.0 → riplex-0.6.2}/tests/test_normalize.py +0 -0
  118. {riplex-0.6.0 → riplex-0.6.2}/tests/test_planner.py +0 -0
  119. {riplex-0.6.0 → riplex-0.6.2}/tests/test_rip_guide.py +0 -0
  120. {riplex-0.6.0 → riplex-0.6.2}/tests/test_scanner.py +0 -0
  121. {riplex-0.6.0 → riplex-0.6.2}/tests/test_snapshot.py +0 -0
  122. {riplex-0.6.0 → riplex-0.6.2}/tests/test_splitter.py +0 -0
  123. {riplex-0.6.0 → riplex-0.6.2}/tests/test_tagger.py +0 -0
  124. {riplex-0.6.0 → riplex-0.6.2}/tests/test_ui.py +0 -0
  125. {riplex-0.6.0 → riplex-0.6.2}/tests/test_updater.py +0 -0
@@ -0,0 +1,12 @@
1
+ __pycache__/
2
+ *.pyc
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .venv/
7
+ .pytest_cache/
8
+
9
+ # Config file with API keys
10
+ riplex.toml
11
+ plex-planner.toml
12
+ riplex_app.log
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: riplex
3
- Version: 0.6.0
3
+ Version: 0.6.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.7
10
+ Requires-Dist: dvdcompare-scraper>=0.1.12
11
11
  Requires-Dist: platformdirs>=4.0
12
12
  Provides-Extra: dev
13
13
  Requires-Dist: pytest>=8.0; extra == "dev"
@@ -19,7 +19,7 @@ Dynamic: license-file
19
19
 
20
20
  # riplex
21
21
 
22
- 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.
22
+ Automatically organizes MKV files from physical disc collections into Plex-compatible folder structures with the right names, the right folders, and no manual work.
23
23
 
24
24
  ## Desktop App
25
25
 
@@ -35,20 +35,17 @@ No Python install required. The app walks you through setup and provides buttons
35
35
 
36
36
  ## Why?
37
37
 
38
- MakeMKV is great at one thing: reading a disc and dumping raw MKV files. But that's where its job ends and yours begins.
38
+ After using MakeMKV to back up a disc, you're left with a pile of generically-named files (`title_t00.mkv`, `title_t01.mkv`, ...) and no idea which is the main film, which are featurettes, which are duplicates, and which is the play-all compilation you didn't need. For a multi-disc TV series, you're looking at hours of manual effort: reading disc cases, Googling runtimes, renaming files one by one, and building the exact folder hierarchy Plex demands.
39
39
 
40
- You're left with a pile of generically-named files (`title_t00.mkv`, `title_t01.mkv`, ...) and no idea which is the main film, which are featurettes, which are duplicates, and which is the play-all compilation you didn't need. For a multi-disc TV series, you're looking at hours of manual effort: reading disc cases, Googling runtimes, renaming files one by one, and building the exact folder hierarchy Plex demands.
41
-
42
- We identified the best sources of disc metadata (TMDb for canonical titles and episode info, dvdcompare.net for per-disc content breakdowns) and automated the entire pipeline. riplex pulls that data, figures out what's on every disc in a release, tells you exactly which MakeMKV titles to rip (and which to skip), then matches, renames, deduplicates, splits, and organizes everything into the correct Plex structure automatically.
40
+ riplex solves this by pulling metadata from TMDb (canonical titles, years, episode info) and [dvdcompare.net](https://www.dvdcompare.net) (per-disc content breakdowns featurettes, deleted scenes, runtimes), then automatically classifying, deduplicating, matching, renaming, and organizing everything into the correct Plex structure.
43
41
 
44
42
  ## What it does
45
43
 
46
44
  | Command | What it does |
47
45
  |---|---|
48
- | `orchestrate` | Full pipeline: insert a disc, riplex handles detection, metadata lookup, ripping, and organizing. Multi-disc with swap prompts. |
49
- | `rip` | Single-disc rip with smart title selection (skips play-alls, duplicates, junk). |
50
- | `organize` | Scan existing MKV rips, deduplicate, match to metadata by runtime, move into Plex layout. |
51
- | `lookup` | Preview disc contents and recommended rip strategy before touching MakeMKV. |
46
+ | `orchestrate` | Full pipeline: detect a disc, look up metadata, select titles, hand off to MakeMKV for disc backup, and organize into Plex folders. Multi-disc with swap prompts. |
47
+ | `organize` | Scan existing MKV files, deduplicate, match to metadata by runtime, move into Plex layout. |
48
+ | `lookup` | Preview disc contents and see what's on each disc before doing anything. |
52
49
 
53
50
  ## Quick Start
54
51
 
@@ -68,7 +65,7 @@ This walks you through creating your config file (TMDb API key, output paths) an
68
65
 
69
66
  For detailed installation instructions (including how to install Python if you don't have it), see the [Getting Started guide](docs/getting-started/installation.md).
70
67
 
71
- ### Rip a disc (interactive)
68
+ ### Orchestrate (full pipeline)
72
69
 
73
70
  Insert a disc and run:
74
71
 
@@ -76,9 +73,9 @@ Insert a disc and run:
76
73
  riplex orchestrate --execute
77
74
  ```
78
75
 
79
- riplex auto-detects the title from the volume label, looks up disc metadata, shows you what's on each disc, lets you choose which to rip, and organizes everything into Plex folders when done.
76
+ riplex auto-detects the title from the volume label, looks up metadata, shows you what's on each disc, hands off to MakeMKV for disc backup, and organizes everything into Plex folders.
80
77
 
81
- ### Rip a disc (unattended)
78
+ ### Unattended mode
82
79
 
83
80
  ```bash
84
81
  riplex orchestrate --execute --auto
@@ -86,12 +83,12 @@ riplex orchestrate --execute --auto
86
83
 
87
84
  Skips all prompts, uses best-guess defaults. Good for scripted or scheduled runs.
88
85
 
89
- ### Organize existing rips
86
+ ### Organize existing files
90
87
 
91
- Already ripped with MakeMKV manually? Point `organize` at the folder:
88
+ Already have MKV files from MakeMKV? Point `organize` at the folder:
92
89
 
93
90
  ```bash
94
- riplex organize path/to/rips/Oppenheimer --execute
91
+ riplex organize path/to/MyMovie --execute
95
92
  ```
96
93
 
97
94
  ## Requirements
@@ -108,9 +105,14 @@ riplex organize path/to/rips/Oppenheimer --execute
108
105
 
109
106
  riplex works on Windows, macOS, and Linux. All path handling, caching, and config locations follow OS conventions automatically.
110
107
 
108
+ ## Data Sources
109
+
110
+ - **[TMDb](https://www.themoviedb.org/)**: Canonical movie and TV show metadata (titles, years, episodes, runtimes). Requires a free API key.
111
+ - **[dvdcompare.net](https://www.dvdcompare.net)**: Per-disc content breakdowns for physical media releases (featurettes, deleted scenes, interviews, runtimes, play-all groupings). An invaluable resource for the disc collecting community.
112
+
111
113
  ## Related Projects
112
114
 
113
- - **[dvdcompare-scraper](https://github.com/AnyCredit5518/dvdcompare-scraper)**: Scrapes per-disc content metadata from dvdcompare.net (featurettes, interviews, deleted scenes, runtimes). Required dependency that powers riplex's disc content lookup. Contributions welcome.
115
+ - **[dvdcompare-scraper](https://github.com/AnyCredit5518/dvdcompare-scraper)**: Python client for looking up disc content metadata from [dvdcompare.net](https://www.dvdcompare.net). Powers riplex's disc content lookup. Contributions welcome.
114
116
 
115
117
  ## Documentation
116
118
 
@@ -1,6 +1,6 @@
1
1
  # riplex
2
2
 
3
- 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.
3
+ Automatically organizes MKV files from physical disc collections into Plex-compatible folder structures with the right names, the right folders, and no manual work.
4
4
 
5
5
  ## Desktop App
6
6
 
@@ -16,20 +16,17 @@ No Python install required. The app walks you through setup and provides buttons
16
16
 
17
17
  ## Why?
18
18
 
19
- MakeMKV is great at one thing: reading a disc and dumping raw MKV files. But that's where its job ends and yours begins.
19
+ After using MakeMKV to back up a disc, you're left with a pile of generically-named files (`title_t00.mkv`, `title_t01.mkv`, ...) and no idea which is the main film, which are featurettes, which are duplicates, and which is the play-all compilation you didn't need. For a multi-disc TV series, you're looking at hours of manual effort: reading disc cases, Googling runtimes, renaming files one by one, and building the exact folder hierarchy Plex demands.
20
20
 
21
- You're left with a pile of generically-named files (`title_t00.mkv`, `title_t01.mkv`, ...) and no idea which is the main film, which are featurettes, which are duplicates, and which is the play-all compilation you didn't need. For a multi-disc TV series, you're looking at hours of manual effort: reading disc cases, Googling runtimes, renaming files one by one, and building the exact folder hierarchy Plex demands.
22
-
23
- We identified the best sources of disc metadata (TMDb for canonical titles and episode info, dvdcompare.net for per-disc content breakdowns) and automated the entire pipeline. riplex pulls that data, figures out what's on every disc in a release, tells you exactly which MakeMKV titles to rip (and which to skip), then matches, renames, deduplicates, splits, and organizes everything into the correct Plex structure automatically.
21
+ riplex solves this by pulling metadata from TMDb (canonical titles, years, episode info) and [dvdcompare.net](https://www.dvdcompare.net) (per-disc content breakdowns featurettes, deleted scenes, runtimes), then automatically classifying, deduplicating, matching, renaming, and organizing everything into the correct Plex structure.
24
22
 
25
23
  ## What it does
26
24
 
27
25
  | Command | What it does |
28
26
  |---|---|
29
- | `orchestrate` | Full pipeline: insert a disc, riplex handles detection, metadata lookup, ripping, and organizing. Multi-disc with swap prompts. |
30
- | `rip` | Single-disc rip with smart title selection (skips play-alls, duplicates, junk). |
31
- | `organize` | Scan existing MKV rips, deduplicate, match to metadata by runtime, move into Plex layout. |
32
- | `lookup` | Preview disc contents and recommended rip strategy before touching MakeMKV. |
27
+ | `orchestrate` | Full pipeline: detect a disc, look up metadata, select titles, hand off to MakeMKV for disc backup, and organize into Plex folders. Multi-disc with swap prompts. |
28
+ | `organize` | Scan existing MKV files, deduplicate, match to metadata by runtime, move into Plex layout. |
29
+ | `lookup` | Preview disc contents and see what's on each disc before doing anything. |
33
30
 
34
31
  ## Quick Start
35
32
 
@@ -49,7 +46,7 @@ This walks you through creating your config file (TMDb API key, output paths) an
49
46
 
50
47
  For detailed installation instructions (including how to install Python if you don't have it), see the [Getting Started guide](docs/getting-started/installation.md).
51
48
 
52
- ### Rip a disc (interactive)
49
+ ### Orchestrate (full pipeline)
53
50
 
54
51
  Insert a disc and run:
55
52
 
@@ -57,9 +54,9 @@ Insert a disc and run:
57
54
  riplex orchestrate --execute
58
55
  ```
59
56
 
60
- riplex auto-detects the title from the volume label, looks up disc metadata, shows you what's on each disc, lets you choose which to rip, and organizes everything into Plex folders when done.
57
+ riplex auto-detects the title from the volume label, looks up metadata, shows you what's on each disc, hands off to MakeMKV for disc backup, and organizes everything into Plex folders.
61
58
 
62
- ### Rip a disc (unattended)
59
+ ### Unattended mode
63
60
 
64
61
  ```bash
65
62
  riplex orchestrate --execute --auto
@@ -67,12 +64,12 @@ riplex orchestrate --execute --auto
67
64
 
68
65
  Skips all prompts, uses best-guess defaults. Good for scripted or scheduled runs.
69
66
 
70
- ### Organize existing rips
67
+ ### Organize existing files
71
68
 
72
- Already ripped with MakeMKV manually? Point `organize` at the folder:
69
+ Already have MKV files from MakeMKV? Point `organize` at the folder:
73
70
 
74
71
  ```bash
75
- riplex organize path/to/rips/Oppenheimer --execute
72
+ riplex organize path/to/MyMovie --execute
76
73
  ```
77
74
 
78
75
  ## Requirements
@@ -89,9 +86,14 @@ riplex organize path/to/rips/Oppenheimer --execute
89
86
 
90
87
  riplex works on Windows, macOS, and Linux. All path handling, caching, and config locations follow OS conventions automatically.
91
88
 
89
+ ## Data Sources
90
+
91
+ - **[TMDb](https://www.themoviedb.org/)**: Canonical movie and TV show metadata (titles, years, episodes, runtimes). Requires a free API key.
92
+ - **[dvdcompare.net](https://www.dvdcompare.net)**: Per-disc content breakdowns for physical media releases (featurettes, deleted scenes, interviews, runtimes, play-all groupings). An invaluable resource for the disc collecting community.
93
+
92
94
  ## Related Projects
93
95
 
94
- - **[dvdcompare-scraper](https://github.com/AnyCredit5518/dvdcompare-scraper)**: Scrapes per-disc content metadata from dvdcompare.net (featurettes, interviews, deleted scenes, runtimes). Required dependency that powers riplex's disc content lookup. Contributions welcome.
96
+ - **[dvdcompare-scraper](https://github.com/AnyCredit5518/dvdcompare-scraper)**: Python client for looking up disc content metadata from [dvdcompare.net](https://www.dvdcompare.net). Powers riplex's disc content lookup. Contributions welcome.
95
97
 
96
98
  ## Documentation
97
99
 
@@ -4,6 +4,21 @@ 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
+ ## 2026-05-09
8
+
9
+ ### Changed
10
+
11
+ - Installation guide: complete restructure for clarity. Install riplex first, then setup, then manual tool installation as a fallback. Each install option now covers all platforms (Windows, macOS, Linux, immutable Linux distros).
12
+ - Installation guide: Windows executable instructions rewritten with step-by-step PATH setup, SmartScreen guidance, and separate GUI vs CLI paths.
13
+ - Installation guide: macOS CLI now installs to `/usr/local/bin/riplex` with proper rename.
14
+ - Installation guide: Option C (from source) split into numbered steps with separate Windows and macOS/Linux commands.
15
+ - Installation guide: tkinter/folder picker note now covers both macOS and Linux.
16
+
17
+ ### Added
18
+
19
+ - Installation guide: Linux (Bazzite, Fedora Silverblue, immutable distros) sections for pipx install and manual tool installation, including Flatpak wrapper script for MKVToolNix.
20
+ - Installation guide: MakeMKV registration pulled into its own subsection.
21
+
7
22
  ## 2026-05-08
8
23
 
9
24
  ### Added
@@ -0,0 +1,330 @@
1
+ # Installation
2
+
3
+ ## Installing riplex
4
+
5
+ There are three ways to install riplex:
6
+
7
+ - **[Pre-built executables](#option-a-pre-built-executables)** - easiest, no Python needed
8
+ - **[pipx](#option-b-install-with-pipx-recommended)** - recommended for Python users
9
+ - **[From source](#option-c-install-from-source)** - for developers
10
+
11
+ ### Option A: Pre-built executables
12
+
13
+ Download the latest release for your platform from the
14
+ [GitHub Releases page](https://github.com/AnyCredit5518/riplex/releases).
15
+
16
+ #### Windows
17
+
18
+ **GUI only (easiest):**
19
+
20
+ 1. Download `riplex-ui-windows.exe`
21
+ 2. Move it wherever you keep apps (e.g. `C:\Program Files\riplex\`)
22
+ 3. Double-click to run. Windows SmartScreen may warn you because the app
23
+ isn't code-signed -- click **More info** then **Run anyway**.
24
+ 4. Optionally, right-click the `.exe` and select **Create shortcut** to add
25
+ it to your desktop or Start menu.
26
+
27
+ **CLI (for terminal users):**
28
+
29
+ 1. Download `riplex-windows.exe`
30
+ 2. Rename it to `riplex.exe`
31
+ 3. Move it to a folder of your choice (e.g. `C:\Program Files\riplex\`)
32
+ 4. Add that folder to your system PATH:
33
+ - Open **Settings** > **System** > **About** > **Advanced system settings**
34
+ - Click **Environment Variables**
35
+ - Under **User variables**, select **Path** and click **Edit**
36
+ - Click **New** and paste the folder path (e.g. `C:\Program Files\riplex\`)
37
+ - Click **OK** on all dialogs
38
+ 5. Open a **new** terminal and run `riplex setup`
39
+
40
+ > [!TIP]
41
+ > You can install both. The GUI includes built-in setup, so you don't need
42
+ > the CLI unless you prefer working in a terminal.
43
+
44
+ #### macOS (Apple Silicon only)
45
+
46
+ > **Intel Mac?** Pre-built binaries aren't available for Intel Macs. GitHub
47
+ > [deprecated their Intel macOS build runners](https://github.blog/changelog/2024-09-16-github-actions-macos-13-larger-runner-image-brownout-dates/).
48
+ > Use [Option B: Install with pipx](#option-b-install-with-pipx-recommended)
49
+ > instead, which works on any Mac.
50
+
51
+ **GUI:**
52
+
53
+ 1. Download `riplex-ui-macos.zip`
54
+ 2. Unzip it and move `riplex-ui.app` to `/Applications/`
55
+ 3. **Allow the app to open.** macOS blocks apps from unidentified developers.
56
+ The first time you open it, you'll see a warning -- do **not** click
57
+ "Move to Trash." Instead:
58
+
59
+ - **Right-click** (or Control-click) `riplex-ui.app`, choose **Open**,
60
+ then click **Open** in the dialog. macOS remembers this and won't ask
61
+ again.
62
+
63
+ - If that doesn't work, open Terminal and run:
64
+ ```
65
+ xattr -dr com.apple.quarantine /Applications/riplex-ui.app
66
+ ```
67
+
68
+ **CLI:**
69
+
70
+ 1. Download `riplex-macos`
71
+ 2. Open Terminal and run:
72
+ ```
73
+ mv ~/Downloads/riplex-macos /usr/local/bin/riplex
74
+ chmod +x /usr/local/bin/riplex
75
+ xattr -dr com.apple.quarantine /usr/local/bin/riplex
76
+ ```
77
+ 3. Run `riplex setup`
78
+
79
+ #### Linux
80
+
81
+ Pre-built executables are not currently available for Linux. Use
82
+ [Option B: Install with pipx](#option-b-install-with-pipx-recommended)
83
+ instead.
84
+
85
+ ### Option B: Install with pipx (recommended)
86
+
87
+ [pipx](https://pipx.pypa.io/) installs Python apps in isolated environments
88
+ but makes their commands available globally. No venv activation needed --
89
+ `riplex` and `riplex-ui` just work from any terminal.
90
+
91
+ #### 1. Install Python and pipx
92
+
93
+ **Windows:**
94
+
95
+ Download Python from https://www.python.org/downloads/ and run the installer.
96
+ **Check "Add Python to PATH"** at the bottom of the first screen. Then open
97
+ a terminal and run:
98
+
99
+ ```
100
+ pip install pipx
101
+ pipx ensurepath
102
+ ```
103
+
104
+ **macOS:**
105
+
106
+ ```
107
+ brew install python pipx
108
+ pipx ensurepath
109
+ ```
110
+
111
+ **Linux (Debian, Ubuntu, Mint, Pop!_OS, etc.):**
112
+
113
+ ```
114
+ sudo apt install python3 pipx
115
+ pipx ensurepath
116
+ ```
117
+
118
+ **Linux (Bazzite, Fedora Silverblue, and other immutable distros):**
119
+
120
+ Python and pipx aren't available via `apt` on immutable distros. Layer them
121
+ with `rpm-ostree`:
122
+
123
+ ```
124
+ rpm-ostree install python3 python3-pip
125
+ ```
126
+
127
+ Then reboot and run:
128
+
129
+ ```
130
+ pip install --user pipx
131
+ pipx ensurepath
132
+ ```
133
+
134
+ Restart your terminal after `ensurepath` so the new PATH takes effect.
135
+
136
+ #### 2. Install riplex
137
+
138
+ ```bash
139
+ pipx install "riplex[gui]"
140
+ ```
141
+
142
+ This installs both `riplex` (CLI) and `riplex-ui` (GUI) as globally available
143
+ commands.
144
+
145
+ > [!TIP]
146
+ > To install the CLI only (no GUI), run `pipx install riplex` instead.
147
+
148
+ #### Updating
149
+
150
+ ```bash
151
+ pipx upgrade riplex
152
+ ```
153
+
154
+ ### Option C: Install from source
155
+
156
+ For developers who want to contribute or run the latest unreleased code.
157
+
158
+ #### 1. Clone the repository
159
+
160
+ ```bash
161
+ git clone https://github.com/AnyCredit5518/riplex.git
162
+ cd riplex
163
+ ```
164
+
165
+ #### 2. Create and activate a virtual environment
166
+
167
+ **Windows:**
168
+
169
+ ```
170
+ py -m venv .venv
171
+ .venv\Scripts\activate
172
+ ```
173
+
174
+ **macOS / Linux:**
175
+
176
+ ```bash
177
+ python3.12 -m venv .venv
178
+ source .venv/bin/activate
179
+ ```
180
+
181
+ #### 3. Install in development mode
182
+
183
+ ```bash
184
+ pip install -e ".[dev,gui]"
185
+ ```
186
+
187
+ > [!NOTE]
188
+ > With a venv, `riplex` and `riplex-ui` only work while the venv is
189
+ > activated. For a global install that works from any terminal, use
190
+ > [pipx](#option-b-install-with-pipx-recommended) instead.
191
+
192
+ > [!TIP]
193
+ > The repo's `.vscode/settings.json` points VS Code at `.venv`
194
+ > automatically, so the integrated terminal activates it on open.
195
+
196
+ #### macOS SSL fix (Homebrew Python only)
197
+
198
+ If you installed Python via Homebrew and `riplex-ui` crashes on first launch
199
+ with an SSL certificate error, run this one-time fix:
200
+
201
+ ```bash
202
+ CERT=$(python3.12 -c "import certifi; print(certifi.where())")
203
+ echo "export SSL_CERT_FILE=\"$CERT\"" >> .venv/bin/activate
204
+ echo "export REQUESTS_CA_BUNDLE=\"$CERT\"" >> .venv/bin/activate
205
+ source .venv/bin/activate
206
+ ```
207
+
208
+ #### GUI folder picker (tkinter)
209
+
210
+ The browse buttons in the GUI use tkinter, which some platforms don't include
211
+ by default. Without it, the browse buttons show a hint to type the path
212
+ manually instead.
213
+
214
+ - **macOS (Homebrew):** `brew install python-tk@3.12`
215
+ - **Linux (Debian/Ubuntu):** `sudo apt install python3-tk`
216
+
217
+ ## Setup
218
+
219
+ After installing, run the setup wizard. You can do this from the CLI:
220
+
221
+ ```bash
222
+ riplex setup
223
+ ```
224
+
225
+ Or just launch the GUI -- it checks for missing tools on startup and walks you
226
+ through setup automatically.
227
+
228
+ The setup wizard will:
229
+
230
+ 1. Ask for your TMDb API key (free at https://www.themoviedb.org/settings/api)
231
+
232
+ > [!TIP]
233
+ > TMDb asks for an app name and URL when you request a key. You can just
234
+ > enter "riplex" as the app name and `https://github.com/AnyCredit5518/riplex`
235
+ > as the URL. The rest of the form can be filled with basic info -- it
236
+ > doesn't need to be a real business. The key is approved instantly.
237
+
238
+ 2. Ask where your Plex library and MakeMKV rip folders are
239
+ 3. Check for required tools (MakeMKV, ffprobe, mkvmerge, mkvpropedit)
240
+ 4. Offer to install any missing tools automatically (via winget on Windows,
241
+ Homebrew on macOS, or apt on Debian/Ubuntu-based Linux)
242
+
243
+ If you skip setup, it runs automatically the first time you use any command.
244
+
245
+ ### Verify
246
+
247
+ ```bash
248
+ riplex --help
249
+ riplex-ui
250
+ ```
251
+
252
+ Both commands should work from any terminal.
253
+
254
+ ## Manual tool installation
255
+
256
+ Most users don't need this section -- the setup wizard installs tools
257
+ automatically on Windows, macOS (with Homebrew), and Debian/Ubuntu-based
258
+ Linux. If the wizard couldn't install a tool for your platform, or you prefer
259
+ to install manually, follow the instructions below.
260
+
261
+ riplex requires these three tools:
262
+
263
+ | Tool | Purpose |
264
+ |---|---|
265
+ | [MakeMKV](https://www.makemkv.com/) | Disc reading and ripping (`makemkvcon`) |
266
+ | [FFmpeg](https://ffmpeg.org/) | MKV metadata probing (`ffprobe`) |
267
+ | [MKVToolNix](https://mkvtoolnix.download/) | MKV splitting and tagging (`mkvmerge`, `mkvpropedit`) |
268
+
269
+ ### Windows
270
+
271
+ ```
272
+ winget install GuinpinSoft.MakeMKV
273
+ winget install Gyan.FFmpeg
274
+ winget install MoritzBunkus.MKVToolNix
275
+ ```
276
+
277
+ Or download installers from the links above. These installers add the tools to
278
+ your PATH automatically.
279
+
280
+ ### macOS
281
+
282
+ ```
283
+ brew install ffmpeg mkvtoolnix
284
+ ```
285
+
286
+ MakeMKV must be downloaded from https://www.makemkv.com/ since it isn't in
287
+ Homebrew. The app bundle includes `makemkvcon` automatically.
288
+
289
+ ### Linux (Debian, Ubuntu, Pop!_OS, Mint, etc.)
290
+
291
+ ```
292
+ sudo apt install ffmpeg mkvtoolnix
293
+ ```
294
+
295
+ MakeMKV must be downloaded from https://www.makemkv.com/ or built from
296
+ source. See the [MakeMKV forum](https://forum.makemkv.com/forum/viewtopic.php?t=224)
297
+ for instructions.
298
+
299
+ ### Linux (Bazzite, Fedora Silverblue, and other immutable distros)
300
+
301
+ On immutable distros, `apt` isn't available. Use `rpm-ostree` to install
302
+ packages:
303
+
304
+ ```
305
+ rpm-ostree install ffmpeg mkvtoolnix
306
+ ```
307
+
308
+ Then reboot for the changes to take effect.
309
+
310
+ MakeMKV must be downloaded from https://www.makemkv.com/.
311
+
312
+ > [!WARNING]
313
+ > If you installed MKVToolNix as a Flatpak, `mkvmerge` won't be on your
314
+ > system PATH even though the GUI works fine. Either layer it with
315
+ > `rpm-ostree install mkvtoolnix` (recommended) or create a wrapper script:
316
+ >
317
+ > ```
318
+ > sudo tee /usr/local/bin/mkvmerge << 'EOF'
319
+ > #!/bin/sh
320
+ > exec flatpak run --command=mkvmerge org.bunkus.mkvtoolnix-gui "$@"
321
+ > EOF
322
+ > sudo chmod +x /usr/local/bin/mkvmerge
323
+ > ```
324
+
325
+ ### MakeMKV registration
326
+
327
+ MakeMKV requires a registration key. A free beta key is available at
328
+ https://forum.makemkv.com/forum/viewtopic.php?f=5&t=1053 and must be entered
329
+ in MakeMKV (Help > Register) before `makemkvcon` will work. The beta key is
330
+ updated periodically.
@@ -21,38 +21,6 @@ episode collapsing.
21
21
  override for users with separate libraries.
22
22
 
23
23
 
24
- ## Orchestrate Flow (GUI)
25
-
26
- The GUI has rip and organize flows. The orchestrate flow (multi-disc pipeline
27
- with disc-swap prompts) is not yet implemented.
28
-
29
- ### Key pieces needed
30
-
31
- - Disc swap prompt screen
32
- - Session state tracking across disc swaps (accumulated rip results, metadata)
33
- - Disc number auto-detection after each swap
34
- - Error recovery (retry/skip failed disc)
35
- - Cancel mid-flow and organize what's been ripped so far
36
-
37
-
38
- ## Bug Report Submission
39
-
40
- ### Problem
41
-
42
- Snapshot files for debugging are mixed in with media files and have
43
- inconsistent formats. Users must hunt for debug artifacts across multiple
44
- locations when filing bug reports.
45
-
46
- ### Plan
47
-
48
- 1. Move all debug artifacts into a `_riplex/` subfolder (Plex-ignored).
49
- 2. Consistent v2 snapshot envelope format with type discriminator.
50
- 3. GUI writes same snapshots as CLI.
51
- 4. "Report a Bug" button in GUI: opens pre-filled GitHub issue, copies
52
- debug folder path to clipboard.
53
- 5. `.github/ISSUE_TEMPLATE/bug_report.yml` for structured reports.
54
-
55
-
56
24
  ## Interactive Lookup Command
57
25
 
58
26
  `riplex lookup` currently auto-picks the first TMDb match and default
@@ -77,17 +45,4 @@ tracks when ripping, not just the default/English track.
77
45
  if the user explicitly configures preferred languages
78
46
 
79
47
 
80
- ## Drop Pre-built Intel macOS Binary
81
-
82
- The `macos-13` (Intel) CI runner is slow to queue and GitHub is phasing out
83
- Intel Mac hardware. Intel Macs are a shrinking minority of users.
84
-
85
- ### Plan
86
48
 
87
- - Remove the `macos-13` / `x86_64` matrix entry from `release.yml`
88
- - Remove `riplex-macos-x86_64` and `riplex-ui-macos-x86_64.zip` from the
89
- release step
90
- - Update `updater.py` to stop looking for arch-specific assets (only arm64)
91
- - Update installation docs: macOS section offers only the ARM build; Intel
92
- Mac users are directed to install from source (venv + `pip install -e`)
93
- - Update README download table accordingly
@@ -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.7",
14
+ "dvdcompare-scraper>=0.1.12",
15
15
  "platformdirs>=4.0",
16
16
  ]
17
17