You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+66-45Lines changed: 66 additions & 45 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,21 +14,36 @@
14
14
</pre>
15
15
</p>
16
16
17
-
> **Work in progress.** Frostscribe is under active development and may be unstable until v1.0.0 is released. Expect rough edges.
18
-
19
17
# Frostscribe
20
18
21
19
A native macOS tool for ripping and preserving physical disc media to a local [Jellyfin](https://jellyfin.org), [Plex](https://plex.tv), or [Kodi](https://kodi.tv) library.
22
20
23
-
Frostscribe wraps `makemkvcon` and `HandBrakeCLI` into a polished interactive CLI. Insert a disc, run `frostscribe rip`, confirm the title, and walk away. The encode worker handles the rest in the background.
21
+
Frostscribe wraps `makemkvcon` and `HandBrakeCLI` into a polished interactive CLI and menu bar app. Insert a disc, confirm the title, and walk away. The background worker handles encoding while you use your Mac normally.
22
+
23
+
---
24
+
25
+
## Stability
26
+
27
+
| Feature | Status |
28
+
|---|---|
29
+
| Movie ripping — Vigil Mode | ✅ Stable |
30
+
| Movie encoding (H.265, hardware) | ✅ Stable |
31
+
| Background worker (rip + encode) | ✅ Stable |
32
+
| Menu bar app + GUI rip flow | ✅ Stable |
33
+
| CLI rip flow | ✅ Stable |
34
+
| Event hooks (Home Assistant, etc.) | ✅ Stable |
35
+
| TV show ripping | ⚠️ Functional, not thoroughly tested |
36
+
| AutoScribe (auto-rip without prompting) | ⚠️ Experimental |
37
+
38
+
> TV show ripping works end-to-end but has not been tested across a wide variety of discs and edge cases. Episode numbering and season path formatting should be verified for your media server.
24
39
25
40
---
26
41
27
42
## Requirements
28
43
29
44
- macOS 14 or later
30
45
-[MakeMKV](https://makemkv.com) — download and install from makemkv.com
31
-
-[HandBrake](https://handbrake.fr)— `HandBrakeCLI` must be in your `$PATH` or configured via `frostscribe init`
46
+
-[HandBrake](https://handbrake.fr)CLI:
32
47
33
48
```bash
34
49
brew install handbrake
@@ -45,14 +60,20 @@ brew tap trevholliday/frostscribe
45
60
brew install frostscribe
46
61
```
47
62
63
+
This installs the `frostscribe` CLI, `frostscribe-worker` background daemon, and registers the LaunchAgent so the worker starts automatically on login.
64
+
65
+
**Menu bar app:**
66
+
67
+
Download `FrostscribeUI.app` from the [latest release](https://github.com/trevholliday/frostscribe/releases/latest) and move it to `/Applications`.
Encoding is slow — a Blu-ray can take 30–90 minutes. The worker runs as a persistent background service managed by launchd so it survives terminal sessions, restarts after crashes, and starts automatically on login. It polls the encode queue every 10 seconds and processes jobs one at a time using VideoToolbox hardware encoding.
80
-
81
-
The worker plist lives at `~/Library/LaunchAgents/com.frostscribe.worker.plist` and logs to `~/Library/Logs/Frostscribe/worker.log`.
Encoding is slow — a Blu-ray can take 30–90 minutes. The worker runs as a persistent background service managed by launchd so it survives terminal sessions, restarts after crashes, and starts automatically on login. It polls the rip and encode queues and processes jobs one at a time using VideoToolbox hardware encoding.
Open **FrostscribeUI** from `/Applications`. The snowflake icon lives in your menu bar and shows rip/encode status at a glance.
106
111
107
-
Frostscribe will:
108
-
1. Scan the disc and display all titles with duration, chapters, size, and audio tracks
109
-
2. Look up the title on TMDB (if a key is configured)
110
-
3. Prompt you to confirm the output path
111
-
4. Rip the selected title to your temp directory
112
-
5. Add an encode job to the queue
113
-
6. Eject the disc
112
+
Click **Rip Disc** to open the guided rip flow:
114
113
115
-
The background worker picks up the job and encodes it to your media library using VideoToolbox hardware encoding (H.265).
114
+
1. Disc scans automatically
115
+
2. Search TMDB to identify the title (or enter manually)
116
+
3. Select the disc title and audio tracks
117
+
4. Confirm output path
118
+
5. The rip runs in the background worker — closing the app will not interrupt it
119
+
6. Encoding begins automatically when the rip finishes
120
+
7. Push notification fires on completion (configure via `event_hook`)
116
121
117
-
### Menu bar app
122
+
**Vigil Mode** (default) means ripping is guided and interactive. Disable it in Settings to enable **AutoScribe**, which rips any inserted disc automatically without prompting.
118
123
119
-
The **FrostscribeUI** menu bar app lives in your menu bar permanently. It shows rip and encode status at a glance, lets you open a full GUI rip flow window ("Rip Disc"), and manage settings.
120
-
121
-
**Vigil Mode** (default: on) means you are present — ripping is guided and interactive. Disabling Vigil Mode activates **AutoScribe**, which automatically rips any inserted disc without prompting. AutoScribe requires confirmation to enable in Settings.
122
-
123
-
### Check status
124
+
### CLI
124
125
125
126
```bash
127
+
frostscribe rip # Guided interactive rip session
126
128
frostscribe status # Current rip and encode status
127
129
frostscribe queue # Encode queue with per-job progress
128
130
```
@@ -176,9 +178,28 @@ TV Shows/Breaking Bad/Season01/Breaking Bad S01E01.mkv
176
178
|`makemkv_key`| No | MakeMKV registration key (trial mode without it) |
177
179
|`makemkv_bin`| No | Full path to `makemkvcon` (searched in `$PATH` if empty) |
178
180
|`handbrake_bin`| No | Full path to `HandBrakeCLI` (searched in `$PATH` if empty) |
179
-
|`event_hook`| No | Shell command executed on lifecycle events. Receives `FROSTSCRIBE_EVENT` (`rip_complete`, `encode_complete`, `encode_failed`), `FROSTSCRIBE_TITLE`, and `FROSTSCRIBE_BODY` as environment variables. Use this to send notifications via Home Assistant, Slack, Pushover, etc. |
180
-
|`vigil_mode`| No |`true` = Vigil Mode (interactive, user-guided — default). `false` = AutoScribe (auto-rips inserted discs without prompting) |
181
-
|`select_audio_tracks`| No | Prompt to choose which audio tracks to include before ripping (default: `false`) |
181
+
|`event_hook`| No | Shell command executed on lifecycle events. Receives `FROSTSCRIBE_EVENT` (`rip_complete`, `encode_complete`, `encode_failed`), `FROSTSCRIBE_TITLE`, and `FROSTSCRIBE_BODY` as environment variables. |
182
+
|`vigil_mode`| No |`true` = Vigil Mode (interactive, default). `false` = AutoScribe (auto-rips without prompting) |
183
+
|`select_audio_tracks`| No | Prompt to choose audio tracks before ripping (default: `false`) |
184
+
|`quality_dvd`| No | HandBrake RF quality for DVD (default: `80`) |
185
+
|`quality_bluray`| No | HandBrake RF quality for Blu-ray (default: `70`) |
186
+
|`quality_uhd`| No | HandBrake RF quality for UHD Blu-ray (default: `70`) |
187
+
188
+
### Event hook example (Home Assistant push notification)
0 commit comments