diff --git a/README.md b/README.md index 742787c..349f720 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,72 @@ -# Discarr +
-> Disc scanning and HEVC encoding queue for Sonarr/Radarr. +# 💿 Discarr -Discarr is a lightweight web UI that scans DVD and Blu-ray directory structures (`VIDEO_TS` / `BDMV`), lets you map raw VOBs to Sonarr episodes or Radarr movies, queues HEVC encodes via ffmpeg (local or SSH to a remote host), and notifies Sonarr/Radarr on completion. +**Scan disc rips. Map titles. Queue HEVC encodes. Notify Sonarr and Radarr when done.** + +[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) +[![Node.js](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](https://nodejs.org/) +[![No npm deps](https://img.shields.io/badge/npm%20deps-none-lightgrey.svg)](#install) + +
--- -## What it does +Discarr is a zero-dependency Node.js web UI that bridges your disc ripping workflow with Sonarr and Radarr. Point it at a `VIDEO_TS` or `BDMV` directory, map the title to the right episode or movie in your library, and let it handle the HEVC encode and import. -| Stage | Details | -|---|---| -| **Scan** | Detect `VIDEO_TS` / `BDMV` structures and parse IFO chapters | -| **Map** | Web UI to match disc titles to Sonarr episodes or Radarr movies | -| **Encode** | Queue HEVC encodes via ffmpeg or HandBrake (local or SSH) | -| **Notify** | Call Sonarr/Radarr import on completion; optionally notify Tdarr | +No npm packages. No Python. No config files to edit by hand — just a browser and a config with your API keys. --- -## Requirements +## Features -- Node.js 18+ -- ffmpeg and ffprobe (for metadata scanning) -- Docker (optional — image included) +- **Disc scanning** — detects `VIDEO_TS`, `BDMV`, multi-disc, and ISO structures automatically +- **Episode/movie mapping** — web UI maps disc titles to Sonarr episodes or Radarr movies +- **HEVC encode queue** — dispatches ffmpeg or HandBrake jobs locally or over SSH to a remote host +- **IFO chapter extraction** — reads DVD structure to split multi-episode discs correctly +- **Sonarr/Radarr notification** — custom script hooks notify on import, file delete, or completion +- **qBittorrent integration** — optional hook triggers a scan automatically on torrent completion +- **Tdarr notification** — optional ping to Tdarr after encode completes +- **Persistent job queue** — survive restarts; jobs resume automatically +- **No npm deps** — pure Node.js built-ins only + +--- + +## Quick start + +```bash +git clone https://git.opensourcesolarpunk.com/Circuit-Forge/discarr +cd discarr + +# Set up your API keys +mkdir -p ~/.config/media-postprocessor +cp api-keys.conf.example ~/.config/media-postprocessor/api-keys.conf +$EDITOR ~/.config/media-postprocessor/api-keys.conf + +# Run +node server.js +``` + +Open `http://localhost:8603` — paste a disc path and click **Scan**. --- ## Install +### From source + ```bash git clone https://git.opensourcesolarpunk.com/Circuit-Forge/discarr cd discarr ``` -No npm dependencies — pure Node.js built-ins only. - -### Config - -```bash -mkdir -p ~/.config/media-postprocessor -cp api-keys.conf.example ~/.config/media-postprocessor/api-keys.conf -# Edit api-keys.conf with your Sonarr/Radarr URLs and API keys -``` - -All config values can be set as environment variables (env vars override the config file). - -### Run - -```bash -node server.js -# or: PORT=8603 node server.js -``` - -Open `http://localhost:8603` in your browser. +Requirements: Node.js 18+, ffmpeg, ffprobe (for metadata scanning). ### Docker ```bash docker build -t discarr . + docker run -d \ -p 8603:8603 \ -v ~/.config/media-postprocessor:/root/.config/media-postprocessor:ro \ @@ -65,23 +75,24 @@ docker run -d \ discarr ``` ---- - -## Notification hooks - -Drop the scripts from `scripts/` as custom script hooks in Sonarr/Radarr/qBittorrent: - -| Script | Trigger | -|---|---| -| `scripts/sonarr-notify.sh` | Sonarr: Settings → Connect → Custom Script (On Import, On Episode File Delete) | -| `scripts/radarr-notify.sh` | Radarr: Settings → Connect → Custom Script (On Import, On Movie File Delete) | -| `scripts/qbittorrent-notify.sh` | qBittorrent: Options → Downloads → "Run external program on torrent completion" | - -All scripts use `DISCARR_URL` env var (default: `http://127.0.0.1:8603`). +The image includes ffmpeg, ffprobe, HandBrake, and openssh-client. --- -## Environment variables +## Config + +All config lives in `~/.config/media-postprocessor/api-keys.conf` (see `api-keys.conf.example`). Every key can also be set as an environment variable — env vars override the config file. + +```bash +# Minimum required config +SONARR_URL=http://your-sonarr-host:8989/sonarr +SONARR_API_KEY=your-sonarr-api-key + +RADARR_URL=http://your-radarr-host:7878/radarr +RADARR_API_KEY=your-radarr-api-key +``` + +### Environment variables | Variable | Default | Description | |---|---|---| @@ -89,10 +100,33 @@ All scripts use `DISCARR_URL` env var (default: `http://127.0.0.1:8603`). | `DISCARR_CONFIG` | `~/.config/media-postprocessor/api-keys.conf` | Config file path | | `DISCARR_LOG` | `~/.local/share/discarr/jobs.log` | Job log path | | `DISCARR_QUEUE` | `~/.local/share/discarr/pending-queue.json` | Pending queue path | -| `DISCARR_SETTINGS` | Same dir as queue | Runtime settings overlay | --- +## Notification hooks + +Drop the scripts from `scripts/` as custom hooks in your arr apps and qBittorrent: + +| Script | Where to set it | +|---|---| +| `scripts/sonarr-notify.sh` | Sonarr: Settings → Connect → Custom Script → On Import, On Episode File Delete | +| `scripts/radarr-notify.sh` | Radarr: Settings → Connect → Custom Script → On Import, On Movie File Delete | +| `scripts/qbittorrent-notify.sh` | qBittorrent: Options → Downloads → Run external program on torrent completion | + +All scripts respect the `DISCARR_URL` environment variable (default: `http://127.0.0.1:8603`). + +--- + +## Related + +- [**Recovarr**](https://git.opensourcesolarpunk.com/Circuit-Forge/recovarr) — re-trigger Sonarr/Radarr imports for corrupted or missing media files + +--- + +## Contributing + +Issues and PRs welcome. Please open an issue before starting a large change. + ## License -MIT +MIT — see [LICENSE](LICENSE).