Skip to content

Media Stack Usage Guide

Last Updated: 2025-12-28


⚠️ CRITICAL: Docker Commands Require sudo

On Bazzite/Fedora, ALL docker commands require sudo:

bash
# WRONG - will fail with permission denied
docker compose up -d
docker logs tdarr

# CORRECT - always use sudo
sudo docker compose up -d
sudo docker logs tdarr
sudo docker compose restart tdarr

This is a Bazzite/SELinux security requirement, not a misconfiguration.


Stack Hierarchy: What Talks to What

┌─────────────────────────────────────────────────────────────────┐
│                        YOU (Daily Use)                          │
├─────────────────────────────────────────────────────────────────┤
│  Overseerr          Plex              Audiobookshelf            │
│  (Request content)  (Watch content)   (Listen to audiobooks)    │
└────────┬────────────────┬─────────────────┬─────────────────────┘
         │                │                 │
         ▼                ▼                 ▼
┌─────────────────────────────────────────────────────────────────┐
│                    AUTOMATION LAYER                              │
├─────────────────────────────────────────────────────────────────┤
│  Radarr ←→ Sonarr ←→ Prowlarr    Komga ←→ Kavita               │
│  (Movies)  (TV)      (Indexers)   (Comics)  (Books)             │
│                                                                  │
│  Bazarr (Subtitles)   Tdarr (Transcoding)   Komf (Metadata)     │
└────────┬────────────────┬───────────────────────────────────────┘
         │                │
         ▼                ▼
┌─────────────────────────────────────────────────────────────────┐
│                    DOWNLOAD LAYER                                │
├─────────────────────────────────────────────────────────────────┤
│  SABnzbd (Usenet - Primary)     Transmission (Torrents)         │
└─────────────────────────────────────────────────────────────────┘

Current Library Stats

LibrarySizeLocation
Movies16 TB/var/mnt/pool/movies
TV Shows6.1 TB/var/mnt/pool/tv
Anime5.9 TB/var/mnt/pool/anime
Total28 TBMergerFS Pool (41TB total, 12TB free)

Daily Workflow: What You Should Actually Use

For Movies & TV

TaskUse ThisNOT This
Request new contentOverseerrRadarr/Sonarr directly
Watch contentPlex-
Check download statusOverseerr or SABnzbd-
See what's comingOverseerr calendarSonarr calendar

Why Overseerr?

  • Beautiful UI designed for requesting
  • Shows what's already in your library
  • Handles both movies AND TV in one place
  • Can be shared with family (they can request, you approve)

When to use Radarr/Sonarr directly?

  • Troubleshooting failed downloads
  • Adjusting quality profiles
  • Managing exclusions or tags
  • Bulk operations

For Manga/Comics

TaskUse This
Read mangaKomga or Kavita
Fix metadataKomf GUI (localhost:8085)
Add new seriesMylar3 or manual add to folder

For Audiobooks

TaskUse This
Listen on desktopAudiobookshelf web (localhost:13378)
Listen on iPhoneAudiobookshelf app (App Store)
Add booksReadarr or manual add

Audiobookshelf Mobile Setup

  1. Download: Search "Audiobookshelf" on iOS App Store (free, by advplyr)
  2. Server URL: http://192.168.6.167:13378
  3. Login: Use your Audiobookshelf credentials

Features:

  • Background playback
  • Offline downloads for travel
  • Sleep timer & playback speed
  • CarPlay support
  • Sync progress across devices

Overseerr: The Right Way to Use It

Your Current Setup

Overseerr
├── Radarr (movies → /pool/movies)      ← Should be "Default"
├── Radarr_anime (anime movies → /pool/anime)
└── Sonarr (TV → /pool/tv, Anime → /pool/anime)

The "Default" and "4K" Toggles Explained

ToggleWhat It Means
DefaultUsed when user clicks "Request" without specifying
4KUsed when user explicitly requests 4K version

For Radarr servers:

  • Radarr (movies): ✅ Default, ❌ 4K
  • Radarr_anime (anime): ❌ Default, ❌ 4K

Why? Most requests are regular movies. Anime movies are niche - users should explicitly choose "Radarr_anime" from the server dropdown when requesting anime films.

To fix (if not already set):

  1. Go to http://localhost:5055/settings/services
  2. Click on "Radarr" entry
  3. Enable "Default Server" toggle
  4. Save

Tdarr: Storage Optimization

Tdarr transcodes media to HEVC/AV1 to save 30-50% storage. With 28TB of media and only 12TB free, this is critical.

Current Status ✅ OPERATIONAL

ComponentStatusDetails
MainNode✅ ActiveGPU workers: 2, CPU health: 1
SecondaryNode✅ ActiveGPU workers: 2, CPU health: 1
Movies✅ ConfiguredID: qRHd4dcGk, /media/movies
TV✅ ConfiguredID: FKnGmlxBT, /media/tv
Anime✅ ConfiguredID: 08QZ-saXn, /media/anime
Files Queued5,026GPU transcoding with HEVC

Library Configuration

Libraries are configured with the Migz1FFMPEG GPU plugin for hardware-accelerated HEVC encoding:

PluginStatusPurpose
MigzImageRemovalRemove embedded images
Reorder_StreamsOptimize stream order
Migz1FFMPEG_CPU❌ OFFCPU encoding (disabled)
Migz1FFMPEG✅ ONGPU VAAPI encoding
New_file_size_checkVerify compression worked

AMD Radeon 780M VAAPI Configuration

Your GPU uses VCN4 (Video Core Next 4.0) with RDNA3 architecture.

Optimal FFmpeg flags:

bash
# HEVC (recommended for compatibility)
-vaapi_device /dev/dri/renderD128 \
-vf 'format=nv12,hwupload' \
-c:v hevc_vaapi \
-qp 20 \
-profile:v main

# For 10-bit HDR content
-vf 'format=p010,hwupload' \
-profile:v main10

# AV1 (better compression, newer)
-c:v av1_vaapi -qp 24

Quality Settings (QP scale: 0-51, lower = better):

Content TypeHEVC QPAV1 QPNotes
4K HDR1822Preserve quality
4K SDR2024Standard high quality
1080p2226Good compression
720p/480p2428Maximum compression
Anime1822Preserve line art

CRITICAL: VAAPI does NOT support CRF mode. Use -qp or -global_quality only!

Tdarr API Reference

Libraries must be created via UI (API-created libraries cause RangeError: interval NaN), but configuration can be done via API:

bash
# Get all libraries
curl -s -X POST http://localhost:8265/api/v2/cruddb \
  -H "Content-Type: application/json" \
  -d '{"data":{"collection":"LibrarySettingsJSONDB","mode":"getAll"}}'

# Update library settings
curl -s -X POST http://localhost:8265/api/v2/cruddb \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "collection": "LibrarySettingsJSONDB",
      "mode": "update",
      "docID": "LIBRARY_ID",
      "obj": {
        "processLibrary": true,
        "processTranscodes": true,
        "processHealthChecks": true
      }
    }
  }'

# Trigger library scan
curl -s -X POST http://localhost:8265/api/v2/scan-files \
  -H "Content-Type: application/json" \
  -d '{"data":{"scanConfig":{"dbID":"LIBRARY_ID","arrayOrPath":"/media/movies","mode":"scanFindNew"}}}'

# Check file queue status
curl -s -X POST http://localhost:8265/api/v2/cruddb \
  -H "Content-Type: application/json" \
  -d '{"data":{"collection":"FileJSONDB","mode":"getAll"}}' | \
  jq '[.[] | .TranscodeDecisionMaker] | group_by(.) | map({decision: .[0], count: length})'

Initial Setup (UI Only Required)

⚠️ WARNING: Libraries MUST be created via the web UI at http://localhost:8265. API-created libraries lack proper schedule arrays and cause runtime errors.

Step 1: Create Libraries (UI)

  1. Click Libraries+ Library
  2. Create three libraries:
LibrarySource FolderCachePriority
Movies/media/movies/tempNormal
TV/media/tv/tempNormal
Anime/media/anime/tempNormal

Note: Container paths differ from host! Host /var/mnt/pool/movies maps to container /media/movies.

Step 2: Enable Workers (UI or API)

bash
# Via API - update node worker limits
curl -s -X POST http://localhost:8265/api/v2/cruddb \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "collection": "NodeJSONDB",
      "mode": "update",
      "docID": "NODE_ID",
      "obj": {
        "workerLimits": {
          "transcodegpu": 2,
          "healthcheckcpu": 1,
          "transcodecpu": 0
        }
      }
    }
  }'

Step 3: Configure Plugins (API)

bash
# Enable GPU plugin, disable CPU plugin
curl -s -X POST http://localhost:8265/api/v2/cruddb \
  -H "Content-Type: application/json" \
  -d '{
    "data": {
      "collection": "LibrarySettingsJSONDB",
      "mode": "update",
      "docID": "LIBRARY_ID",
      "obj": {
        "pluginIDs": [
          {"_id": "plugin1", "id": "Tdarr_Plugin_MC93_MigzImageRemoval", "checked": true, "source": "Community", "priority": 0, "InputsDB": {}},
          {"_id": "plugin2", "id": "Tdarr_Plugin_lmg1_Reorder_Streams", "checked": true, "source": "Community", "priority": 1, "InputsDB": {}},
          {"_id": "plugin3", "id": "Tdarr_Plugin_MC93_Migz1FFMPEG_CPU", "checked": false, "source": "Community", "priority": 2, "InputsDB": {}},
          {"_id": "plugin4", "id": "Tdarr_Plugin_MC93_Migz1FFMPEG", "checked": true, "source": "Community", "priority": 3, "InputsDB": {}},
          {"_id": "plugin5", "id": "Tdarr_Plugin_a9he_New_file_size_check", "checked": true, "source": "Community", "priority": 4, "InputsDB": {}}
        ]
      }
    }
  }'

What to Bake Into docker-compose vs Manual UI Settings

✅ Put in docker-compose.yml

SettingWhy
Port mappingsInfrastructure, rarely changes
Volume mountsInfrastructure
Environment variables (API keys)Reproducible deploys
Resource limitsInfrastructure
Network configurationInfrastructure
CORS settingsNeeded before first access

❌ Configure in UI (don't try to automate)

SettingWhy
Quality profilesComplex, UI-dependent, rarely changes
Indexer connectionsProwlarr syncs these automatically
Download client settingsOne-time setup, UI validates
Library paths in *arr appsUI validates paths exist
User accounts/permissionsSecurity-sensitive
Notification settingsPersonal preference
Tdarr libraries & workersNo reliable API

🔄 Can Go Either Way

SettingRecommendation
Metadata providersUI easier, but komf uses application.yml
Scan intervalsUI for Tdarr, docker env for others
Theme/appearancePersonal preference

Integration Status

Working Now

ToolPurposeStatus
OverseerrRequest management✅ Connected to Radarr & Sonarr
ProwlarrIndexer management✅ 4 Usenet indexers, syncing to all *arrs
BazarrSubtitles✅ Set and forget
TautulliPlex analytics✅ Running at :8181
KomfManga metadata✅ Connected to Komga & Kavita
AudiobookshelfAudiobooks✅ 1 library
TdarrStorage optimization5,026 files queued, GPU VAAPI active

All Core Services Operational ✅

All essential media stack services are now configured and running.

Worth Adding Later

ToolPurposeEffortValue
RecyclarrTRaSH Guides syncLowBetter quality profiles
NotifiarrRich Discord notificationsMediumKnow when stuff downloads
Kometa (PMM)Plex collections/overlaysMediumPretty poster overlays

Plex Integrations

Already Working

IntegrationStatus
Overseerr ↔ Plex✅ Library sync, user auth
Tautulli ↔ Plex✅ Watch history, stats

Available But Optional

IntegrationWhat It DoesWorth It?
Kometa (PMM)Auto-create collections, overlays✅ If you want pretty posters
PlexTraktSyncSync watch history to Trakt❌ Unless you use Trakt
Plex WebhooksNotify *arrs when playback starts❌ Overkill

Quick Reference: URLs

ServiceURLPurpose
Overseerrhttp://localhost:5055Request movies/TV
Plexhttp://localhost:32400/webWatch content
Radarrhttp://localhost:7878Movie management (backend)
Sonarrhttp://localhost:8989TV management (backend)
Prowlarrhttp://localhost:9696Indexer management
SABnzbdhttp://192.168.6.167:8080Download status
Tdarrhttp://localhost:8265Transcoding status
Bazarrhttp://localhost:6767Subtitle status
Komgahttp://localhost:8081Read comics
Kavitahttp://localhost:5000Read books/manga
Komfhttp://localhost:8085Manga metadata
Audiobookshelfhttp://localhost:13378Audiobooks
Tautullihttp://localhost:8181Plex analytics

TL;DR: Your Daily Tools

  1. Overseerr - Request anything
  2. Plex - Watch anything
  3. Komga/Kavita - Read manga/books
  4. Audiobookshelf - Listen to audiobooks (iOS app available!)

Everything else is automation that runs in the background. You shouldn't need to touch Radarr/Sonarr/Prowlarr/SABnzbd unless troubleshooting.

Tdarr Status: ✅ Active - 5,026 files queued for GPU transcoding. Monitor progress at http://localhost:8265

Built with ❤️ following Bell Labs standards. Dedicated to Stan Eisenstat.