Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 9 additions & 48 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,54 +34,14 @@ cp movie.mkv input/

## Configuration

All settings are configurable via environment variables in `docker-compose.yml`:

| Variable | Default | Description |
| --------------------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `PORT` | `3000` | Web dashboard port |
| `PASSWORD` | `rabbitencoder` | Password to access web dashboard |
| `FILE_COOLDOWN` | `30` | Seconds the file size must stay unchanged before encoding starts |
| `ENCODER_QUALITY` | `medium` | Default video quality (`low`, `medium`, `high`) |
| `ENCODER_SPEED` | `slow` | Default encode speed (`slower`, `slow`, `medium`, `fast`, `faster`) |
| `ENCODER_DENOISE` | `off` | Default denoise level (`off`, `auto`, `light`, `medium`, `heavy`) |
| `ENCODER_DENOISE_BACKEND` | `auto` | Denoise backend: `cpu`, `auto`, `vulkan`, `opencl`. `cpu` forces software nlmeans. |
| `ENCODER_DENOISE_GPU_DEVICE` | `0.0` | GPU device id (ignored when backend is `cpu`). `0` for vulkan, `<platform>.<device>` for opencl. |
| `ENCODER_DENOISE_AUTO_THRESHOLD_LIGHT` | `0.5` | Y bitplane-4 threshold above which scenes get `light` denoise (only used when `ENCODER_DENOISE=auto`). |
| `ENCODER_DENOISE_AUTO_THRESHOLD_MEDIUM` | `0.7` | Y bitplane-4 threshold above which scenes get `medium` denoise. |
| `ENCODER_DENOISE_AUTO_THRESHOLD_HEAVY` | `0.9` | Y bitplane-4 threshold above which scenes get `heavy` denoise. |
| `ENCODER_DENOISE_LIGHT_S` | `1.0` | NLMeans strength `s` for `light` level (float [1.0 – 30.0]). |
| `ENCODER_DENOISE_LIGHT_P` | `3` | NLMeans patch size `p` for `light` level (odd int [1 – 99]). |
| `ENCODER_DENOISE_LIGHT_R` | `7` | NLMeans research size `r` for `light` level (odd int [1 – 99]). |
| `ENCODER_DENOISE_MEDIUM_S` | `1.5` | NLMeans `s` for `medium` level. |
| `ENCODER_DENOISE_MEDIUM_P` | `3` | NLMeans `p` for `medium` level. |
| `ENCODER_DENOISE_MEDIUM_R` | `9` | NLMeans `r` for `medium` level. |
| `ENCODER_DENOISE_HEAVY_S` | `2.0` | NLMeans `s` for `heavy` level. |
| `ENCODER_DENOISE_HEAVY_P` | `3` | NLMeans `p` for `heavy` level. |
| `ENCODER_DENOISE_HEAVY_R` | `11` | NLMeans `r` for `heavy` level. |
| `ENCODER_DEBAND` | `off` | Default deband level (`off`, `light`, `medium`, `heavy`). |
| `ENCODER_DEBAND_LIGHT_STRENGTH` | `0.8` | Gradfun strength for `light` level (float [0.51 – 64]). |
| `ENCODER_DEBAND_LIGHT_RADIUS` | `8` | Gradfun radius for `light` level (int [8 – 32]). |
| `ENCODER_DEBAND_MEDIUM_STRENGTH` | `1.4` | Gradfun strength for `medium` level. |
| `ENCODER_DEBAND_MEDIUM_RADIUS` | `16` | Gradfun radius for `medium` level. |
| `ENCODER_DEBAND_HEAVY_STRENGTH` | `2.8` | Gradfun strength for `heavy` level. |
| `ENCODER_DEBAND_HEAVY_RADIUS` | `24` | Gradfun radius for `heavy` level. |
| `ENCODER_DOWNSCALE` | `false` | Downscale 4K sources to 1080p before encoding. |
| `ENCODER_SKIP_BOOSTING` | `false` | Skip boosting — bypass per-scene CRF zone analysis. |
| `ENCODER_DEDUPE_SUBTITLES` | `false` | Keep only one subtitle per language + type. |
| `AUDIO_NO_PHASE_INV` | `false` | Disable phase inversion (`--no-phase-inv`) for AV1 encoding. |
| `AUDIO_LANGUAGES` | _(empty)_ | Comma-separated audio language codes to keep (empty = keep all). |
| `SUBTITLE_LANGUAGES` | _(empty)_ | Comma-separated subtitle language codes to keep (empty = keep all). |
| `ORGANIZATION` | `RabbitCompany` | Tag appended to encoded filenames (e.g. `-RabbitCompany`). |
| `AUDIO_BITRATE_MONO` | `64` | Opus bitrate for mono audio (kbps). |
| `AUDIO_BITRATE_STEREO` | `128` | Opus bitrate for stereo audio. |
| `AUDIO_BITRATE_2_1` | `160` | Opus bitrate for 2.1 audio. |
| `AUDIO_BITRATE_5_1` | `256` | Opus bitrate for 5.1 audio. |
| `AUDIO_BITRATE_6_1` | `320` | Opus bitrate for 6.1 audio. |
| `AUDIO_BITRATE_7_1` | `384` | Opus bitrate for 7.1 audio. |
| `AUDIO_BITRATE_7_1_4` | `448` | Opus bitrate for 7.1.4 Atmos audio. |
| `VS_PRESETS_STOCK_DIR` | `/app/vapoursynth/presets` | Directory the built-in VapourSynth presets are loaded from. Override only if you mount a custom stock set. |
| `VS_PRESETS_USER_DIR` | `/config/vapoursynth/presets` | Directory scanned for user-provided VapourSynth presets. Mounted from the host via `./vapoursynth-user:/config/vapoursynth`. |
| `VS_RABBIT_MODULE_DIR` | `/app/vapoursynth` | Path added to `PYTHONPATH` so preset scripts can `import rabbit_vs`. |
Settings are configurable via environment variables in `docker-compose.yml`:

| Variable | Default | Description |
| --------------- | --------------- | ---------------------------------------------------------------- |
| `PORT` | `3000` | Web dashboard port |
| `PASSWORD` | `rabbitencoder` | Password to access web dashboard |
| `FILE_COOLDOWN` | `30` | Seconds the file size must stay unchanged before encoding starts |
| `ORGANIZATION` | `RabbitCompany` | Tag appended to encoded filenames (e.g. `-RabbitCompany`). |

If `ORGANIZATION` is set to `RabbitCompany` (the default), then any file ending with `-RabbitCompany.mkv` is treated as already encoded and will be:

Expand Down Expand Up @@ -179,6 +139,7 @@ Source tags are detected from the input filename: `Bluray`, `WEBDL`, `WEBRip`, `
| `GET` | `/api/jobs/:id/preview/sample/:index/:kind` | Fetch a preview artifact. `kind`: `source` / `encode` (PNG) or `clip` (MKV) |
| `GET` | `/api/config` | Get default settings |
| `PATCH` | `/api/config` | Update default settings |
| `POST` | `/api/config/reset` | Reset default settings |
| `GET` | `/api/library` | List configured library root directories |
| `GET` | `/api/library/browse` | Browse a library folder (`?path=/data/library/Animes`) |
| `POST` | `/api/library/encode` | Queue all videos in a folder for in-place encoding |
Expand Down
82 changes: 0 additions & 82 deletions docker-compose.override.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,91 +25,9 @@ services:
# Seconds the file size must stay unchanged before encoding starts
- FILE_COOLDOWN=30

# Encoder defaults
# Video quality: low, medium, high
- ENCODER_QUALITY=medium
# Encoder speed: slower, slow, medium, fast, faster
- ENCODER_SPEED=slow
# Denoise level: off, auto, light, medium, heavy
- ENCODER_DENOISE=off
# Auto denoise thresholds (Y bitplane-4 medians from FFmpeg's bitplanenoise filter).
# Only used when ENCODER_DENOISE=auto. Scenes with values >= each threshold get
# the corresponding denoise level. Must satisfy light <= medium <= heavy.
- ENCODER_DENOISE_AUTO_LIGHT=0.5
- ENCODER_DENOISE_AUTO_MEDIUM=0.7
- ENCODER_DENOISE_AUTO_HEAVY=0.9

# Backend used for the nlmeans denoise filter:
# cpu - never use GPU (software nlmeans)
# auto - probe Vulkan, then OpenCL, fall back to CPU
# vulkan - force nlmeans_vulkan (falls back to CPU if probe fails)
# opencl - force nlmeans_opencl (falls back to CPU if probe fails)
- ENCODER_DENOISE_BACKEND=auto
# GPU device id (ignored when ENCODER_DENOISE_BACKEND=cpu).
# Format depends on the backend chosen:
# opencl: <platform>.<device> (e.g. 0.0) - run `clinfo -l` to list
# vulkan: <device> (e.g. 0) - run `vulkaninfo --summary` to list
- ENCODER_DENOISE_GPU_DEVICE=0

# NLMeans filter parameters per intensity level.
# All can be overridden per-job in the dashboard's "Advanced" panel.
# s (strength) : float [1.0 - 30.0]
# p (patch size) : odd int [1 - 99]
# r (research sz) : odd int [1 - 99]
- ENCODER_DENOISE_LIGHT_S=1.0
- ENCODER_DENOISE_LIGHT_P=3
- ENCODER_DENOISE_LIGHT_R=7
- ENCODER_DENOISE_MEDIUM_S=1.5
- ENCODER_DENOISE_MEDIUM_P=3
- ENCODER_DENOISE_MEDIUM_R=9
- ENCODER_DENOISE_HEAVY_S=2.0
- ENCODER_DENOISE_HEAVY_P=3
- ENCODER_DENOISE_HEAVY_R=11

# Deband level: off, light, medium, heavy
- ENCODER_DEBAND=off
# Gradfun (deband) filter parameters per intensity level.
# strength : float [0.51 - 64]
# radius : int [8 - 32]
- ENCODER_DEBAND_LIGHT_STRENGTH=0.8
- ENCODER_DEBAND_LIGHT_RADIUS=8
- ENCODER_DEBAND_MEDIUM_STRENGTH=1.4
- ENCODER_DEBAND_MEDIUM_RADIUS=16
- ENCODER_DEBAND_HEAVY_STRENGTH=2.8
- ENCODER_DEBAND_HEAVY_RADIUS=24

# Downscale 4K sources to 1080p before encoding
- ENCODER_DOWNSCALE=false
# Skip boosting (bypass per-scene CRF zone analysis, encode directly)
- ENCODER_SKIP_BOOSTING=false
# Keep only one subtitle per language + type (drops duplicates, keeps best)
- ENCODER_DEDUPE_SUBTITLES=false
# Comma-separated audio language codes to keep (empty = keep all)
# Accepts ISO 639-1, 639-2, or English names. Example: jpn,eng
- AUDIO_LANGUAGES=
# Comma-separated subtitle language codes to keep (empty = keep all).
# Accepts ISO 639-1, 639-2, or English names. Example: jpn,eng
- SUBTITLE_LANGUAGES=
# Disable phase inversion in Opus encoder (true/false)
- AUDIO_NO_PHASE_INV=false

# Audio bitrates (kbps per channel layout)
- AUDIO_BITRATE_MONO=64
- AUDIO_BITRATE_STEREO=128
- AUDIO_BITRATE_2_1=160
- AUDIO_BITRATE_5_1=256
- AUDIO_BITRATE_6_1=320
- AUDIO_BITRATE_7_1=384
- AUDIO_BITRATE_7_1_4=512

# Metadata
- ORGANIZATION=RabbitCompany

# Paths (usually no need to change)
- INPUT_DIR=/data/input
- OUTPUT_DIR=/data/output
- TEMP_DIR=/data/temp

# Library directories (comma-separated paths inside the container)
# These folders are browsable from the UI for in-place re-encoding.
# The encoded file replaces the source and Jellyfin metadata (.nfo, thumbnails) is cleaned up.
Expand Down
82 changes: 0 additions & 82 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,91 +25,9 @@ services:
# Seconds the file size must stay unchanged before encoding starts
- FILE_COOLDOWN=30

# Encoder defaults
# Video quality: low, medium, high
- ENCODER_QUALITY=medium
# Encoder speed: slower, slow, medium, fast, faster
- ENCODER_SPEED=slow
# Denoise level: off, auto, light, medium, heavy
- ENCODER_DENOISE=off
# Auto denoise thresholds (Y bitplane-4 medians from FFmpeg's bitplanenoise filter).
# Only used when ENCODER_DENOISE=auto. Scenes with values >= each threshold get
# the corresponding denoise level. Must satisfy light <= medium <= heavy.
- ENCODER_DENOISE_AUTO_LIGHT=0.5
- ENCODER_DENOISE_AUTO_MEDIUM=0.7
- ENCODER_DENOISE_AUTO_HEAVY=0.9

# Backend used for the nlmeans denoise filter:
# cpu - never use GPU (software nlmeans)
# auto - probe Vulkan, then OpenCL, fall back to CPU
# vulkan - force nlmeans_vulkan (falls back to CPU if probe fails)
# opencl - force nlmeans_opencl (falls back to CPU if probe fails)
- ENCODER_DENOISE_BACKEND=auto
# GPU device id (ignored when ENCODER_DENOISE_BACKEND=cpu).
# Format depends on the backend chosen:
# opencl: <platform>.<device> (e.g. 0.0) - run `clinfo -l` to list
# vulkan: <device> (e.g. 0) - run `vulkaninfo --summary` to list
- ENCODER_DENOISE_GPU_DEVICE=0

# NLMeans filter parameters per intensity level.
# All can be overridden per-job in the dashboard's "Advanced" panel.
# s (strength) : float [1.0 - 30.0]
# p (patch size) : odd int [1 - 99]
# r (research sz) : odd int [1 - 99]
- ENCODER_DENOISE_LIGHT_S=1.0
- ENCODER_DENOISE_LIGHT_P=3
- ENCODER_DENOISE_LIGHT_R=7
- ENCODER_DENOISE_MEDIUM_S=1.5
- ENCODER_DENOISE_MEDIUM_P=3
- ENCODER_DENOISE_MEDIUM_R=9
- ENCODER_DENOISE_HEAVY_S=2.0
- ENCODER_DENOISE_HEAVY_P=3
- ENCODER_DENOISE_HEAVY_R=11

# Deband level: off, light, medium, heavy
- ENCODER_DEBAND=off
# Gradfun (deband) filter parameters per intensity level.
# strength : float [0.51 - 64]
# radius : int [8 - 32]
- ENCODER_DEBAND_LIGHT_STRENGTH=0.8
- ENCODER_DEBAND_LIGHT_RADIUS=8
- ENCODER_DEBAND_MEDIUM_STRENGTH=1.4
- ENCODER_DEBAND_MEDIUM_RADIUS=16
- ENCODER_DEBAND_HEAVY_STRENGTH=2.8
- ENCODER_DEBAND_HEAVY_RADIUS=24

# Downscale 4K sources to 1080p before encoding
- ENCODER_DOWNSCALE=false
# Skip boosting (bypass per-scene CRF zone analysis, encode directly)
- ENCODER_SKIP_BOOSTING=false
# Keep only one subtitle per language + type (drops duplicates, keeps best)
- ENCODER_DEDUPE_SUBTITLES=false
# Comma-separated audio language codes to keep (empty = keep all)
# Accepts ISO 639-1, 639-2, or English names. Example: jpn,eng
- AUDIO_LANGUAGES=
# Comma-separated subtitle language codes to keep (empty = keep all).
# Accepts ISO 639-1, 639-2, or English names. Example: jpn,eng
- SUBTITLE_LANGUAGES=
# Disable phase inversion in Opus encoder (true/false)
- AUDIO_NO_PHASE_INV=false

# Audio bitrates (kbps per channel layout)
- AUDIO_BITRATE_MONO=64
- AUDIO_BITRATE_STEREO=128
- AUDIO_BITRATE_2_1=160
- AUDIO_BITRATE_5_1=256
- AUDIO_BITRATE_6_1=320
- AUDIO_BITRATE_7_1=384
- AUDIO_BITRATE_7_1_4=512

# Metadata
- ORGANIZATION=RabbitCompany

# Paths (usually no need to change)
- INPUT_DIR=/data/input
- OUTPUT_DIR=/data/output
- TEMP_DIR=/data/temp

# Library directories (comma-separated paths inside the container)
# These folders are browsable from the UI for in-place re-encoding.
# The encoded file replaces the source and Jellyfin metadata (.nfo, thumbnails) is cleaned up.
Expand Down
Loading
Loading