Files
smithpc/movie-ripping-workflow.md
2026-06-29 05:04:05 -05:00

4.9 KiB
Raw Blame History

Movie Ripping Workflow (HandBrakeCLI + MakeMKV → Jellyfin)

Tools

Tool Purpose
HandBrakeCLI Rip + encode DVDs to H.265 MKV directly from disc
libdvd-pkg Builds libdvdcss to decrypt commercial DVDs
makemkv-bin / makemkv-oss Decrypt Blu-rays to lossless MKV (required before HandBrake)
disc-scan.py Helper script to identify the main feature title number

Install (one-time)

DVD support

sudo apt install -y handbrake-cli libdvd-pkg
sudo dpkg-reconfigure libdvd-pkg   # builds libdvdcss from source — follow the prompt

Blu-ray support

sudo add-apt-repository ppa:heyarje/makemkv-beta
sudo apt update
sudo apt install -y makemkv-bin makemkv-oss

Encode Settings (used for both DVD and Blu-ray)

Preset:   H.265 MKV 1080p30
Audio:    German + English, all matching tracks, AC3/DTS passed through unchanged
Subs:     ALL tracks (captures forced/foreign-language subs — see Subtitle Strategy below)

DVD Workflow

One command

python3 ~/smithpc/disc-scan.py

The script handles everything interactively:

  1. Scans the disc (~20-30 s) and prints a title table with duration, video, audio tracks, and subtitle languages
  2. Prompts for title number (default: longest title), movie name (default: from disc label), year (default: from disc filesystem timestamp), audio languages, output directory
  3. Shows a full confirmation including the exact HandBrakeCLI command that will run
  4. Asks "Begin ripping? [Y/n]" before starting

Takes ~30-90 min depending on disc. Output is typically 48 GB.

Manual command (reference / fallback)

HandBrakeCLI \
  -i /dev/sr0 \
  -t TITLE \
  -o "/mnt/media/jellyfin/movies/Movie Name (Year)/Movie Name (Year).mkv" \
  --preset="H.265 MKV 1080p30" \
  --audio-lang-list deu,eng --all-audio --aencoder copy --audio-fallback aac \
  --all-subtitles

Blu-ray Workflow

Blu-rays use AACS encryption that HandBrakeCLI cannot decrypt directly. MakeMKV handles the decryption; HandBrakeCLI handles the encoding.

Step 1 — Create temp dir and scan

mkdir -p ~/makemkv-tmp
makemkvcon info disc:0

Look for the longest title by duration. Note its title number (zero-indexed in MakeMKV).

Step 2 — Decrypt to lossless MKV

Replace TITLE with the title number from Step 1 (MakeMKV uses 0-based indexing):

TITLE=0
makemkvcon mkv disc:0 "$TITLE" ~/makemkv-tmp/

Outputs a file like ~/makemkv-tmp/Title_t00.mkv. No re-encoding, so this is fast (~10-20 min).

Step 3 — Encode with HandBrakeCLI

MOVIE="Movie Name (Year)"
OUTDIR="/mnt/media/jellyfin/movies/$MOVIE"
INPUT=$(ls ~/makemkv-tmp/*.mkv | head -1)

mkdir -p "$OUTDIR"

HandBrakeCLI \
  -i "$INPUT" \
  -o "$OUTDIR/$MOVIE.mkv" \
  --preset="H.265 MKV 1080p30" \
  --audio-lang-list deu,eng --all-audio --aencoder copy \
  --all-subtitles

Step 4 — Clean up temp files

rm -rf ~/makemkv-tmp/

Jellyfin Naming Convention

Jellyfin expects:

/mnt/media/jellyfin/movies/
  Movie Name (Year)/
    Movie Name (Year).mkv

The mkdir -p "$OUTDIR" and output path in the commands above follow this convention automatically.


Subtitle Strategy

--all-subtitles copies every subtitle track from the disc as soft subs (not burned in).

This is critical for films with characters speaking constructed or foreign languages (e.g., Dothraki in Game of Thrones, Elvish in LotR, alien dialogue). Those subtitles often live on a separate "forced" track that --subtitle-lang-list would miss unless explicitly included. --all-subtitles captures them all; Jellyfin lets you toggle which track to display at playback time.


Trigger Jellyfin Rescan

Jellyfin dashboard → Libraries → Movies → "Scan Library Files"


Troubleshooting

  • [warning] decavsub: track 0, invalid PTS during encode: Normal and harmless. VOBSUB subtitle packets on DVDs frequently have malformed presentation timestamps. HandBrake logs them but still copies the subtitle tracks correctly.
  • HandBrakeCLI: "CSS error" or no video: libdvdcss isn't built yet — run sudo dpkg-reconfigure libdvd-pkg again and confirm at the prompt.
  • disc-scan.py shows no titles: Check disc is inserted and spun up (lsblk). Try lsdvd /dev/sr0 to confirm the drive sees it.
  • MakeMKV expired trial: MakeMKV shows a nag but still works during the trial. For long-term use, purchase a license or build from source.
  • HandBrakeCLI audio: "copy not supported": The preset or container rejected a codec. Add --audio-fallback aac to fall back to AAC instead of failing silently.
  • Wrong title ripped (bonus feature, trailer): Re-run disc-scan.py and compare durations. Main feature is almost always the longest.
  • Blu-ray: MakeMKV "AACS error": The disc uses a newer AACS version not yet in MakeMKV's key database — update MakeMKV to the latest beta via the PPA.