Skip to content

Repository files navigation

AutoRipper Companion Toolkit

Tools that wrap AutoRipper and fill the gaps in its workflow:

  1. 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 with NEW/HAVE/UPGRADE/UNKNOWN. Lets you decide whether to rip before you commit 60+ minutes to the operation.

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

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

Why each one is useful

disc_checker.py — "should I even rip this disc?"

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

autoripper_notifier.py — granular status pings

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.

autoripper_launcher.pyw — no permanent daemon

Replaces the AutoRipper.exe desktop shortcut. When you click it:

  1. Spawns disc_checker.py as a hidden background process
  2. Launches AutoRipper foreground
  3. Kills the disc_checker process when AutoRipper exits

Result: zero pythonw processes hanging around when you're not actually ripping.

Requirements

  • 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_CON env 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_ed25519 by default, override via DISC_CHECKER_SSH_KEY)

Setup

1. Clone

git clone https://github.com/rngauf/autoripper-toolkit
cd autoripper-toolkit

2. Configure paths

Set 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

3. Replace the AutoRipper shortcut

  • Delete or rename your AutoRipper.exe desktop shortcut.
  • Create a new shortcut to autoripper_launcher.pyw instead. 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.

4. (Optional) Autostart the notifier

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 limited

Or just run it directly:

pythonw autoripper_notifier.py

5. (Optional) Disc-inserted listener

disc_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

Files

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

How disc classification works

disc_checker.py now does a two-tier classification:

  1. Primary signal: video width parsed from MakeMKV's SINFO:title,stream,19 output (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
  2. 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.

Disc-label normalization

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.

Caveats

  • 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 = 3 requires 3 consecutive "no disc" reads before flipping the state machine. Tune in disc_checker.py if 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").

License

MIT

About

Companion toolkit for AutoRipper: pre-rip Jellyfin lookup, log-tail Telegram notifier, launcher wrapper

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages