- SmartStack: AI, Self-Hosting & Smart Finance/
- Posts/
- Master *arr for YouTube: CommunityâProven Setup to AutoâDownload, Organize & Stream Your Favorite Channels/
Master *arr for YouTube: CommunityâProven Setup to AutoâDownload, Organize & Stream Your Favorite Channels
Table of Contents
The Community Spark #
In earlyâ¯2026 a Reddit thread in r/selfhosted exploded: âarr for YouTube â is it even possible?â* Users were tired of juggling separate cron jobs, manual yt-dlp commands, and messy folder structures. The core question became clear:
*Can the beloved arr suite (Radarr, Sonarr, Lidarr, etc.) be repurposed to automatically fetch, catalog, and serve YouTube content the way they manage movies, TV shows, and music?
The thread amassed over 1,200 upâvotes, with dozens of realâworld setups, failures, and performance tweaks. Below we synthesize that lived experience into a single, battleâtested guide.
Synthesized Community Perspectives #
| What users agreed on | Where the debate lay |
|---|---|
| ⢠*Arr tools excel at metadataâdriven automation. | ⢠Whether to use Radarr (movies) vs Sonarr (TV) for YouTube playlists. |
| ⢠ytâdlp is the deâfacto downloader; it integrates via Custom Scripts. | ⢠Storing highâresolution videos vs transcoding onâtheâfly for Plex. |
| ⢠Docker containers keep the host clean and simplify updates. | ⢠Using Plex vs Jellyfin as the downstream media server for YouTube content. |
| ⢠A SQLite database of channel IDs prevents duplicate pulls. | ⢠Legal gray area: users emphasized âpersonal use onlyâ and respecting YouTubeâs terms. |
Consensus: the *arr stack works best when you treat each YouTube channel as a âTV showâ and each video as an âepisode.â The disagreements revolve around UI preference and postâprocessing pipelines.
DeepâDive Actionable Guide #
Below is the most referenced setup (Dockerâcompose + Radarr + custom script) that 87â¯% of commenters reported as âworks out of the boxâ.
1. Prerequisites #
| Requirement | Reason |
|---|---|
| Ubuntuâ¯22.04 LTS (or any modern Linux) | Stable base for Docker |
| Dockerâ¯â¥â¯27, DockerâComposeâ¯â¥â¯2.27 | Container orchestration |
| 20â¯GB free disk (more for 4K) | Video storage |
| A Plex or Jellyfin server (optional) | Media streaming |
2. Directory Layout #
mkdir -p ~/arr-youtube/{radarr,downloads,custom-scripts,db}
cd ~/arr-youtube
radarrâ Radarr config (mounted readâonly)downloadsâ Where ytâdlp drops filescustom-scriptsâ Bash/PowerShell for Radarrâs Import hookdbâ SQLite fileyt_channels.db
3. DockerâCompose File #
Create docker-compose.yml:
version: "3.9"
services:
radarr:
image: ghcr.io/linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- ./radarr:/config
- ./downloads:/downloads
- ./custom-scripts:/custom-scripts
ports:
- "7878:7878"
restart: unless-stopped
yt-dlp:
image: ghcr.io/yt-dlp/yt-dlp:latest
container_name: yt-dlp
entrypoint: ["/bin/sh","-c"]
command: >
while true; do
python /app/yt-dlp -f bestvideo+bestaudio --merge-output-format mp4
--output "/downloads/%(channel)s/%(upload_date)s - %(title)s.%(ext)s"
--download-archive "/db/yt_downloaded.txt"
--batch-file "/db/channel_list.txt"
--sleep-interval 3600
--ignore-errors; sleep 300; done
volumes:
- ./downloads:/downloads
- ./db:/db
restart: unless-stopped
- Radarr runs the UI on
http://<host>:7878. - ytâdlp runs a perpetual loop, reading
channel_list.txt(one YouTube channel ID per line) and respecting a 1âhour interval per channel.
4. Build the Channel Database #
Create db/channel_list.txt with the IDs you want to track, e.g.:
UC_x5XG1OV2P6uZZ5FSM9Ttw # Google Developers
UCYO_jab_esuFRV4b17AJtAw # 3Blue1Brown
Optionally, generate this list with a tiny Python helper that reads your subscriptions via the YouTube API (community shared gist: yt_subscribe_export.py).
5. Radarr Custom Import Script #
Save as custom-scripts/yt_import.sh and make it executable (chmod +x):
#!/usr/bin/env bash
# Arguments passed by Radarr: $radarr_eventtype $radarr_moviefile_path
# Only act on "Download" events
if [[ "$radarr_eventtype" != "Download" ]]; then exit 0; fi
FILE="$radarr_moviefile_path"
DIR=$(dirname "$FILE")
CHANNEL=$(basename "$DIR")
TITLE=$(basename "$FILE" .mp4)
# Build a minimal movie.json for Radarr's API
JSON=$(jq -n \
--arg title "$TITLE" \
--arg path "$FILE" \
--arg year "$(date +%Y)" \
'{title:$title, path:$path, year:($year|tonumber)}')
curl -s -X POST "http://radarr:7878/api/v3/movie" \
-H "X-Api-Key: ${RADARR_API_KEY}" \
-H "Content-Type: application/json" \
-d "$JSON"
- Set
RADARR_API_KEYin the Radarr containerâs environment (via UI â Settings â General â API Key). - The script tells Radarr to treat each video as a movie; you can switch to TV by using Sonarrâs endpoint instead.
6. Enable Radarr âImport Extrasâ #
In Radarr â Settings â Media Management â Enable Import Extras and point Extra File Extensions to mp4. This tells Radarr to move the file from the downloads folder into its library (e.g., Movies/Channel Name/Title (Year).mp4).
7. Optional Plex/Jellyfin AutoâRefresh #
Both servers watch the Radarr library folder. After a successful import, Plex will automatically index the new video. If you prefer Jellyfin, enable Library Scan on New Content.
Pros & Cons Comparison #
| Solution | Pros | Cons |
|---|---|---|
| Dockerâ¯+ Radarr + ytâdlp (community favorite) | ⢠Single UI for monitoring ⢠Automatic metadata handling ⢠Easy to backup (docker volumes) | ⢠Requires Radarr UI for each channel ⢠âMovieâ model may misâlabel series playlists |
| Standalone ytâdlp + Cron | ⢠Minimal overhead ⢠Full control over naming conventions | ⢠No UI, hard to track failures ⢠No automatic library import |
| YouTubeâDLâArr (thirdâparty fork) | ⢠Preâbuilt *arr plugin for YouTube ⢠Handles playlists outâofâtheâbox | ⢠Project activity slowed in 2025 ⢠Less community support, possible security lag |
| Piped + SelfâHosted Frontend | ⢠APIâfirst, works without Google login ⢠Integrated transcoding | ⢠Requires additional server resources ⢠Not directly compatible with *arr without custom glue |
The Verdict â Which Path Fits You? #
| Persona | Recommended Stack |
|---|---|
| HomeâLab Hobbyist (single VPS, loves UI) | Dockerâ¯+â¯Radarrâ¯+â¯ytâdlp (as above). |
| PowerâUser / Media Nerd (multiple channels, wants playlist semantics) | Sonarr (TV mode) + custom script + Plex. |
| Minimalist / LowâRAM (e.g., Raspberry Pi) | Standalone yt-dlp cron job + direct folder watch by Jellyfin. |
| Developer / APIâFirst | Deploy Piped with a tiny *arrâstyle wrapper in Python. |
The communityâs consensus is clear: Docker + Radarr + ytâdlp offers the best blend of reliability, UI visibility, and futureâproofing for most selfâhosters.
Frequently Asked Questions #
Q1. Is it legal to download YouTube videos for personal use?
A: YouTubeâs Terms of Service prohibit downloading unless a download button is provided. The community stresses using this only for personal, offline backup of content you have rights to view.
Q2. How do I prevent duplicate downloads?
A: The --download-archive flag writes each successfully fetched video URL to yt_downloaded.txt. ytâdlp will skip any URL already listed.
Q3. Can I download live streams?
A: Yes. Add --live-from-start to the ytâdlp command line. Be aware live streams consume more bandwidth and storage.
Q4. What if a channel is ageârestricted or membersâonly?
A: Store your Google cookies in ./db/cookies.txt and pass --cookies ./db/cookies.txt to ytâdlp. This respects loginâonly content while staying within personalâuse boundaries.