Media
Bazarr
Subtitles Provider service that works closely with sonarr and radarr. It
extracts subtitles from downloaded media, making it easier for media players
such as jellyfin or plex to display subtitles in a simple format without
forcing transcoding. There is also a feature to synchronize subtitles with the
audio when the quality is low, which helps ensure they display correctly while
watching media. In addition, Bazarr can use Subgen as a Whisper
provider to autogenerate subtitles from the media file when no other providers
are available.
It took some time to tweak the settings to get it right for my setup. The most
important setting I found was to use the embedded subtitles provider to
automatically extract subtitles from the file. Also, it's a good idea to change
the hearing-impaired extension to sdh, as Jellyfin may parse hi as Hindi.
Cleanuparr
A small project I added to my media services that automatically handled cleaning
up items stuck in sonarr and radarr queues. It also has features to
automatically block certain malicious content from being downloaded, which
helped when my server encountered problematic torrents. I tried using its
blacklisting feature, but found it restrictive for some trackers; fortunately it
allows handling public and private torrents separately.
Dispatcharr
IPTV proxy and management layer for live TV streams. Works alongside
dispatcharr/tvapp2 for app-specific stream handling. Deployed at
compose/dispatcharr/ and exposed at dispatcharr.dripdrop.pro.
ErsatzTV
Deprecated 12/25
ErsatzTV is an IPTV provider service that can create live channels using your
existing media library. It was handy when I wanted continuous background
playback without selecting content manually. Defining a channel is simple and
the service randomly generates a schedule based on the media you select. I
rarely use it now; tuning into a channel in jellyfin sometimes takes several
minutes to display content.
This was a fun service to experiment with, but I rarely used it in production — it mostly filled out my Jellyfin page.
Jellyfin
One of the best services I have configured, Jellyfin streams content from my media library to any device. Configuration is straightforward aside from transcoding. Learning how to enable and tune media transcoding took time: essentially transcoding decodes and re-encodes media/audio/subtitle formats to be compatible with the target device.
Through jellyfin I discovered the hardware needed to provide good transcoding
performance and learned a lot about Intel QSV. This is probably my most used
service. I also recently added SSO for easier browser logins.
GPU Configuration
Using an Intel iGPU or dGPU is a simple passthrough into the container: mount
/dev/dri and enable hardware transcoding. For NVIDIA GPUs you also need the
container toolkit referenced in docker.mdx.
JellyPlex Watched
Deprecated 12/25
When testing plex I found that migrating from jellyfin risks losing watch
history. JellyPlex-Watched synchronized watch history between the two and was
easy to set up.
Jellyseerr
I tried multiple media request services (ombi, requestarr) before finding
jellyseerr. It's a clone of overseerr tailored to Jellyfin and provides a
clean UI for requesting media to be downloaded via sonarr and radarr. I
configured default settings for TV shows and movies to control content quality.
Currently movies can be downloaded up to 4k, while shows are capped at 1080p.
Jellyseerr integrates with jellyfin for authentication, so no separate
accounts are required.
Lidarr
Deprecated 12/31/24
I tested Lidarr as an album organizer, but it did not fit my use case. Many tracks in my collection couldn't be matched, so I eventually stopped using it and managed music metadata manually.
Navidrome
Navidrome is a music streaming service similar in purpose to Jellyfin but
focused on audio. It was simple to configure. Early on I had issues with parsing
m3u playlists due to Windows vs Linux path formatting; I wrote a script to
convert playlist paths to a Unix-compatible format.
Notifiarr
notifiarr is not self-hosted here; I run a client that connects to the
notifiarr server. I keep it because it produces neat Discord messages for media
updates. Some hosted applications in my stack also offer direct support for
Notifiarr.
Plex
I explored the plex ecosystem, including the sonic sage music feature. The
UI is polished and many users prefer it over Jellyfin. However, I dislike the
extra advertising and bundled content. Plex is currently running a full library
scan in my setup; a neat feature is adaptive streaming quality based on
bandwidth.
Profilarr
Deprecated 1/25/26
Profilarr was a configurable UI for managing profiles and was similar to
Recyclarr. It offered opinionated, prebuilt profiles based on Trash Guides which
made syncing to radarr and sonarr straightforward. For some profiles you can
lock scope to a specific service (e.g., Radarr), which caused initial confusion
but worked well once configured.
Over time I became frustrated with Profilarr's sync databases and the lack of some profiles (anime). I eventually switched back to Recyclarr.
Prowlarr
Prowlarr manages a custom list of torrent trackers and queries them to provide
download compatibility for radarr and sonarr. It can synchronize tracker
information into those services and supports prioritization. Early on I relied
on public trackers; over time I moved to private trackers for better quality. I
also use Prowlarr to search for books.
Radarr
Radarr handles movie imports. It synchronizes trackers from Prowlarr and sends
downloads to qbittorrent. Completed torrents are tagged and processed (copied
or hardlinked) so media servers like jellyfin can discover them. I define
quality profiles to rank desired content; these profiles are now managed by
recyclarr.
Recyclarr
When configuring quality profiles for sonarr and radarr I found Trash
Guides. Trash Guides provide regexes that help rank
results during searches. Recyclarr lets you centralize profiles and synchronize
them to Sonarr and Radarr, and it polls Trash Guides to keep profiles up to
date.
I created custom profiles for different content types. Currently Sonarr prefers
1080p (blu-ray not remux) and Radarr prefers 4k (blu-ray not remux). I also
avoided formats like true-hd that can force expensive audio transcoding.
Recyclarr also sets naming schemes that are friendly for jellyfin.
I revisited Recyclarr after earlier issues and improved my configuration and
monitoring (I added apprise to notify on sync changes and failures).
Sonarr
Sonarr handles TV-show imports. It synchronizes trackers from Prowlarr and downloads content with proper categories and hardlinking. Quality profiles for Sonarr are also managed by recyclarr.
Stash
Self-hosted media organizer and player. Deployed at compose/stash/ with a
watcher sidecar for filesystem events. Exposed at stash.dripdrop.pro behind
Authelia.
Watchstate
A lightweight dashboard for tracking watched/played state across media services.
Deployed at watchstate.dripdrop.pro in this repo's compose with the image
ghcr.io/arabcoders/watchstate. It's proxied behind traefik and exposes both
a web UI and an API used by other integrations.
Subgen
Subgen runs as Bazarr's Whisper provider
and uses faster-whisper with CUDA on the NVIDIA 3060 (12 GB). It replaces the
older whisper-asr-webservice stack and does not need media path mapping for
basic Bazarr use — Bazarr sends extracted audio over HTTP.
Subgen runs in its own Komodo stack (compose/subgen, ai tag) on port 9000
and reaches Bazarr over docker-net. Whisper models are stored under
${DOCKER_APPDATA}/subgen/models. With 12 GB VRAM the compose file uses
large-v3-turbo and CONCURRENT_TRANSCRIPTIONS=1; raise concurrency or switch
to large-v3 if you need translation instead of transcription only.
Like other ai stacks, batch deploy skips Subgen while the Windows gaming VM
is running so the 3060 can stay on VFIO.
Bazarr (after deploy):
- Settings → Whisper Provider — provider
Whisper, endpointhttp://subgen:9000(not127.0.0.1when Bazarr runs in Docker). - Settings → Subtitles → Audio Synchronization — under "Do not sync
subtitles downloaded from those providers", add
whisperai(Subgen timing is already accurate). - Optional: enable Pass Video Name so Subgen can fix Amazon WEB-DL-style
audio start offsets; media is mounted at
/shared, matching Bazarr.
Ensure the host has the NVIDIA container toolkit and
that the 3060 is available to Docker (not bound to VFIO for a VM). Subgen shares
the same GPU reservation pattern as ollama and audiomuse-ai.
Whisper
Deprecated 3/26/26 — replaced by Subgen
A handy addition to bazarr, Whisper leveraged a whisper-ai model to parse
audio tracks and auto-generate subtitles. Removed due to little usage from
bazarr; see Subgen for the current GPU-backed setup.