Skip to content

Commit 8bae306

Browse files
committed
Update README: stability table, HA hook example, v0.1.0 release notes
1 parent 638ab96 commit 8bae306

File tree

1 file changed

+66
-45
lines changed

1 file changed

+66
-45
lines changed

README.md

Lines changed: 66 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,36 @@
1414
</pre>
1515
</p>
1616

17-
> **Work in progress.** Frostscribe is under active development and may be unstable until v1.0.0 is released. Expect rough edges.
18-
1917
# Frostscribe
2018

2119
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.
2220

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.
2439
2540
---
2641

2742
## Requirements
2843

2944
- macOS 14 or later
3045
- [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:
3247

3348
```bash
3449
brew install handbrake
@@ -45,14 +60,20 @@ brew tap trevholliday/frostscribe
4560
brew install frostscribe
4661
```
4762

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`.
68+
4869
**Build from source:**
4970

5071
```bash
5172
git clone https://github.com/trevholliday/frostscribe
5273
cd frostscribe
5374
swift build -c release
54-
cp .build/release/frostscribe /usr/local/bin/
55-
cp .build/release/frostscribe-worker /usr/local/bin/
75+
sudo cp .build/release/frostscribe /usr/local/bin/
76+
sudo cp .build/release/frostscribe-worker /usr/local/bin/
5677
```
5778

5879
---
@@ -67,62 +88,43 @@ frostscribe init
6788

6889
This creates `~/Library/Application Support/Frostscribe/config.json` with your output directories, media server selection, and optional API keys.
6990

70-
Install and start the background encode worker:
91+
Then install and start the background worker:
7192

7293
```bash
73-
cp /usr/local/bin/frostscribe-worker /usr/local/bin/frostscribe-worker
94+
cp com.frostscribe.worker.plist ~/Library/LaunchAgents/
7495
launchctl load ~/Library/LaunchAgents/com.frostscribe.worker.plist
7596
```
7697

7798
**Why the worker runs as a launchd agent**
7899

79-
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`.
82-
83-
To stop the worker:
84-
85-
```bash
86-
launchctl unload ~/Library/LaunchAgents/com.frostscribe.worker.plist
87-
```
88-
89-
To restart it (e.g. after updating the binary):
100+
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.
90101

91-
```bash
92-
launchctl kickstart -k gui/$(id -u)/com.frostscribe.worker
93-
```
102+
Logs: `~/Library/Logs/Frostscribe/worker.log`
94103

95104
---
96105

97106
## Usage
98107

99-
### Rip a disc
108+
### Menu bar app (Vigil Mode)
100109

101-
Insert a disc, then:
102-
103-
```bash
104-
frostscribe rip
105-
```
110+
Open **FrostscribeUI** from `/Applications`. The snowflake icon lives in your menu bar and shows rip/encode status at a glance.
106111

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:
114113

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`)
116121

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.
118123

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
124125

125126
```bash
127+
frostscribe rip # Guided interactive rip session
126128
frostscribe status # Current rip and encode status
127129
frostscribe queue # Encode queue with per-job progress
128130
```
@@ -176,9 +178,28 @@ TV Shows/Breaking Bad/Season01/Breaking Bad S01E01.mkv
176178
| `makemkv_key` | No | MakeMKV registration key (trial mode without it) |
177179
| `makemkv_bin` | No | Full path to `makemkvcon` (searched in `$PATH` if empty) |
178180
| `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)
189+
190+
```bash
191+
python3 -c "
192+
import urllib.request, json, os
193+
urllib.request.urlopen(
194+
urllib.request.Request(
195+
'http://localhost:8123/api/services/notify/mobile_app_YOUR_DEVICE',
196+
json.dumps({'title': os.environ.get('FROSTSCRIBE_TITLE',''),
197+
'message': os.environ.get('FROSTSCRIBE_BODY','')}).encode(),
198+
{'Authorization': 'Bearer YOUR_HA_TOKEN', 'Content-Type': 'application/json'}
199+
), timeout=5
200+
)
201+
"
202+
```
182203

183204
---
184205

0 commit comments

Comments
 (0)