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

149 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```bash
sudo apt install -y handbrake-cli libdvd-pkg
sudo dpkg-reconfigure libdvd-pkg # builds libdvdcss from source — follow the prompt
```
### Blu-ray support
```bash
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
```bash
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)
```bash
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
```bash
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):
```bash
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
```bash
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
```bash
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.