π£ Host VM: Plexy (VMID 112, 192.168.5.144)
π£ Internal URL: http://192.168.5.144:3033
π£ Public URL: https://echomancer.kalymoon.com
π£ Last Updated: April 2026
| π£ Property | π£ Value |
|---|---|
| App | yt-dlp-webui |
| Docker Image | marcobaobao/yt-dlp-webui |
| Container Name | yt-dlp-webui |
| Host Port | 3033 |
| Download Path (container) | /downloads |
| Download Path (host) | /media/plexmedia/music/library |
| Config Volume | Docker-managed volume |
| Compose File | /home/plexy/apps/yt-dlp-webui/docker-compose.yml |
| Restart Policy | unless-stopped |
| π£ Layer | π£ Detail |
|---|---|
| Frontend | yt-dlp-webui (marcobaobao) web UI on port 3033 |
| Downloader | yt-dlp binary inside Docker container |
| Output | Files write to /downloads inside container |
| Host Mapping | /media/plexmedia/music/library (direct Plex library) |
| Plex Section | Music β Section ID 11 |
| Auto-scan | Cron job runs every 5 min as plex user |
Downloads land directly in the Plex music library β no staging, no beets import step.
Echomancer UI (echomancer.kalymoon.com)
β
yt-dlp downloads file
β
/downloads (inside container)
β
/media/plexmedia/music/library (host)
β
Plex auto-scan (cron, every 5 min)
β
Appears in Plex Music library
Compose file location:
/home/plexy/apps/yt-dlp-webui/docker-compose.yml
Key volume mapping:
volumes:
- /media/plexmedia/music/library:/downloads
Start / stop:
cd /home/plexy/apps/yt-dlp-webui/
docker compose up -d
docker compose down
Verify volume mapping:
docker inspect yt-dlp-webui | grep -A 5 Binds
Expected output:
"Binds": [
"/media/plexmedia/music/library:/downloads:rw"
]
Cron runs as the plex user every 5 minutes and hits the Plex API to refresh the Music library section.
Edit cron:
sudo crontab -u plex -e
Cron entry:
*/5 * * * * curl -s "http://localhost:32400/library/sections/11/refresh?X-Plex-Token=YOUR_TOKEN"
π£ Token is stored in Plex Preferences.xml β retrieve with:
sudo cat "/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Preferences.xml" | grep -o 'PlexOnlineToken="[^"]*"'
Verify cron is firing:
sudo grep CRON /var/log/syslog | grep plex | tail -10
Manual Plex scan (if needed):
sudo -u plex /usr/lib/plexmediaserver/Plex\ Media\ Scanner --list
sudo -u plex /usr/lib/plexmediaserver/Plex\ Media\ Scanner --scan --refresh --section 11
π£ Note: --scan and --refresh flags are deprecated in newer Plex versions. Use the API curl method above going forward.
π£ YouTube Mix/Radio URLs (list=RD...)
yt-dlp downloads successfully but the UI shows "Completed" with 0 B, no thumbnail, and a pulsing card. This is a UI rendering quirk β files land correctly in the library. Not a failure.
π£ Default format is .webm
yt-dlp defaults to .webm (video container). For music use direct audio URLs or configure yt-dlp to extract audio (-x flag) if needed. The webui has format selection options in settings.
π£ File naming
Files land with yt-dlp's default naming scheme. Plex matches on filename and embedded tags β if a track doesn't appear in Plex, check that the file actually landed in /media/plexmedia/music/library and wait for the next 5-minute cron cycle.
π£ Beets (legacy)
An earlier version of this pipeline used beets (beet import -A) to tag and organize files from a staging folder. This was replaced with direct library writes in April 2026 due to MusicBrainz matching failures on files with sparse metadata. Beets config is still present at ~/.config/beets/config.yaml but is no longer part of the active pipeline.
Proxied through Nginx Proxy Manager on Kalymoon (192.168.5.140:81).
| π£ Property | π£ Value |
|---|---|
| Subdomain | echomancer.kalymoon.com |
| Upstream | http://192.168.5.144:3033 |
| SSL | Let's Encrypt |
Verify upstream is healthy:
curl -I http://192.168.5.144:3033/
Homelab Infrastructure β Plexy
π£ Tags: echomancer β’ yt-dlp β’ plex β’ media β’ docker β’ music β’ plexy β’ automation