Tools that wrap AutoRipper and fill the gaps in its workflow:
-
disc_checker.py— when a disc is inserted, identifies it via MakeMKV's CINFO output, checks your Jellyfin library for an existing copy, compares quality, and pings Telegram withNEW/HAVE/UPGRADE/UNKNOWN. Lets you decide whether to rip before you commit 60+ minutes to the operation. -
autoripper_notifier.py— sidecar log-tailer that sends Telegram pings for every state transition AutoRipper goes through (started → rip complete → transcoding → moved → done). AutoRipper itself only notifies on completion; this fills the gap so you know what's happening at a glance. -
autoripper_launcher.pyw— wraps AutoRipper.exe so the disc_checker daemon spawns when you open AutoRipper and dies when you close it. Zero background process when not ripping.
These were built by the author for the AutoRipper community; AutoRipper itself does not ship anything like them.
The status quo: you put a disc in, start AutoRipper, wait 30+ minutes, find out after the rip is done that you already had this movie at the same or better quality. Time wasted.
disc_checker.py fires the moment the drive reports a disc, in parallel with whatever you're doing:
13:42:01 Disc detected
13:42:08 CINFO: "The Matrix (1999)" — UHD, 52.3 GB main title
13:42:09 SSH to NAS, query Jellyfin DB...
13:42:10 HAVE: /movies/The Matrix (1999)/The.Matrix.1999.2160p.mkv (3840x1606)
13:42:10 → Telegram: "HAVE — Matrix (1999) already at UHD. Skip this disc."
Or:
13:51:00 Disc detected
13:51:08 CINFO: "Dune (2021)" — UHD, 67.1 GB main title
13:51:10 UPGRADE: existing is Dune.2021.1080p.mkv (1920x1080)
13:51:10 → Telegram: "UPGRADE — your existing copy is BD, this disc is UHD. Worth ripping."
Per-disc transitions Telegram-pinged in real time:
Starting rip — The Matrix (1999)Rip stage complete. Queuing for transcode...HandBrake transcoding now (CPU x265, ~20–90 min depending on length)Transcode complete. Moving to Jellyfin library now...DONE — file at M:\Movies\The Matrix (1999)\The.Matrix.1999.mkv. Jellyfin scan in 1–5 min.FAILED — <reason>on any error
Tails BOTH AutoRipper main logs and per-title transcoder logs, dedupes state transitions so each state pings exactly once per disc.
Replaces the AutoRipper.exe desktop shortcut. When you click it:
- Spawns
disc_checker.pyas a hidden background process - Launches AutoRipper foreground
- Kills the disc_checker process when AutoRipper exits
Result: zero pythonw processes hanging around when you're not actually ripping.
- Windows (uses PowerShell, Task Scheduler, MakeMKV's Windows binary)
- Python 3.10+ with stdlib only (no pip dependencies for the core tools)
- AutoRipper installed and configured
- MakeMKV at the default path or via
MAKEMKV_CONenv var - Telegram bot configured in AutoRipper's
settings.json(TelegramBotToken,TelegramChatId,TelegramEnabled = true) — the notifier and disc_checker reuse those credentials - SSH access to the NAS hosting your Jellyfin database (key auth — disc_checker uses
~/.ssh/id_ed25519by default, override viaDISC_CHECKER_SSH_KEY)
git clone https://github.com/rngauf/autoripper-toolkit
cd autoripper-toolkitSet environment variables (or edit the defaults at the top of each script):
| Variable | Default | Purpose |
|---|---|---|
AUTORIPPER_EXE |
C:\Program Files\AutoRipper\AutoRipper.exe |
AutoRipper binary |
AUTORIPPER_TEMP_ROOT |
D:\AutoRipper-Temp |
AutoRipper's temp folder (where it writes logs) |
AUTORIPPER_SETTINGS |
%APPDATA%\AutoRipper\settings.json |
Where AutoRipper stores its Telegram creds |
MAKEMKV_CON |
C:\Program Files (x86)\MakeMKV\makemkvcon64.exe |
MakeMKV console binary |
JELLYFIN_HOST |
root@YOUR_NAS_IP |
SSH target hosting jellyfin.db (set this!) |
JELLYFIN_DB_PATH |
/mnt/appdata/Jellyfin/data/jellyfin.db |
Path to jellyfin.db on the NAS |
DISC_CHECKER_SSH_KEY |
~/.ssh/id_ed25519 |
SSH key for the above |
PYTHONW_EXE |
C:\Python314\pythonw.exe |
Python binary for hidden launcher |
- Delete or rename your AutoRipper.exe desktop shortcut.
- Create a new shortcut to
autoripper_launcher.pywinstead. Set its icon to AutoRipper's exe so it still looks like AutoRipper.
That's it for daily use — clicking the new shortcut gets you AutoRipper AND the disc_checker daemon.
The notifier is independent of disc_checker (you might want notifier without disc_checker, or vice versa). To run it persistently:
# Create a Task Scheduler entry to run at user logon
schtasks /create /tn "AutoRipper-Notifier" /tr "%~dp0autoripper_notifier_launch.bat" /sc onlogon /rl limitedOr just run it directly:
pythonw autoripper_notifier.pydisc_checker_listener.ps1 is an alternative entry point that uses WMI events to fire disc_checker.py only when a disc is actually inserted (instead of polling). Use it if you want the lowest possible idle CPU:
# Schedule at logon to start the listener
schtasks /create /tn "Disc-Checker-Listener" /tr "powershell.exe -WindowStyle Hidden -File %~dp0disc_checker_listener.ps1" /sc onlogon /rl limited| File | Purpose |
|---|---|
autoripper_launcher.pyw |
Wraps AutoRipper.exe. Spawns disc_checker, kills it on AutoRipper exit. |
autoripper_notifier.py |
Tails AutoRipper logs, pings Telegram on state transitions. |
autoripper_notifier_launch.bat |
Wrapper to launch notifier hidden via Task Scheduler. |
autoripper_status.bat / .ps1 |
One-shot: prints current state of any active rip. |
disc_checker.py |
The main disc identification + library lookup + Telegram daemon. |
disc_checker_listener.py |
Python implementation of the WMI-event-driven listener. |
disc_checker_listener.ps1 |
PowerShell implementation (preferred — less overhead). |
disc_checker.py now does a two-tier classification:
- Primary signal: video width parsed from MakeMKV's
SINFO:title,stream,19output (the "Video size" line, e.g.1920x1080). Width is the most reliable signal because encoded width is stable per format regardless of letterboxing:≥3000px→ UHD≥1500px→ BD<1500px→ DVD
- Fallback: main-title file size (only used when MakeMKV doesn't return resolution data):
≥30 GB→ UHD≥15 GB→ BD (deliberately conservative — DVD-9 dual-layer can be 8.5 GB)<15 GB→ DVD
Existing-rip quality is also compared by width (3840 / 1920 / 720) — same reasoning.
Many discs return the bare volume label in CINFO:30 (e.g. HOW_TO_TRAIN_YOUR_DRAGON), which won't match Jellyfin's pretty title (How to Train Your Dragon). The checker normalizes:
- Replaces
_with space - Collapses whitespace
- Title-cases all-uppercase or all-lowercase labels
So Jellyfin DB lookups succeed case-insensitively without false negatives.
- Optical drives are quirky. The post-rip "is there a disc?" check can return YES for several seconds after a successful eject.
EMPTY_CONFIRM_POLLS = 3requires 3 consecutive "no disc" reads before flipping the state machine. Tune indisc_checker.pyif needed. - TV box sets and Criterion-style multi-title discs can confuse the "main title = longest title" heuristic. Manual override may be needed for those.
- The Jellyfin lookup uses SSH to a remote DB file — your Jellyfin server needs to be on the same Tailscale/LAN and reachable by SSH key from the box running disc_checker. The query is read-only (
sqlite3 ... ".readonly").
MIT