- CLAUDE.md with architecture overview and development guide - .mcp.json with docker, ssh, gitea, csharp-lsp, and nuget MCP servers - Skills for ersatztv and jellyfin - .gitignore: exclude .mcp/ (built MCP tools) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.8 KiB
3.8 KiB
name, description
| name | description |
|---|---|
| jellyfin | Jellyfin media server management — API for libraries, items, streaming, users. Use when managing media library or checking Jellyfin status. |
Jellyfin Management
Container: jellyfin | Port: 8096 | IP: 172.16.238.20 (may change on restart)
API Token: 978033be716d46678a5d3c54ae0e0ff9
Web UI: https://jellyfin.tblindustries.be (NO Authelia — native login, password: coup1802)
Config: /home/timothy/downloadswarm/jellyfin/ on jazz
Access Pattern
docker exec jellyfin curl -s 'http://localhost:8096/ENDPOINT' \
-H 'X-Emby-Token: 978033be716d46678a5d3c54ae0e0ff9'
Volume Mounts
| Host Path | Container Path | Content |
|---|---|---|
/mnt/teramind/episodes |
/data/tvshows |
TV shows |
/mnt/episodes |
/data/episodes |
More episodes |
/mnt/media/movies |
/data/movies |
Movies |
/mnt/media/standup |
/data/standup |
Standup |
/mnt/media/music_videos |
/data/music |
Music videos |
/mnt/media/audio/music |
/data/audio |
Music audio (ro) |
API Endpoints
System
GET /System/Info # Server info, version
GET /System/Info/Public # Public info (no auth needed)
POST /System/Restart # Restart server
Items (Search & Browse)
# Search items
GET /Items?includeItemTypes=Movie,Episode,Series&recursive=true&searchTerm=QUERY&fields=Path&limit=20
# Get item details
GET /Items?ids=ITEM_ID&fields=Path,MediaStreams,Overview
# Get all movies
GET /Items?includeItemTypes=Movie&recursive=true&fields=Path&limit=1000
# Get series
GET /Items?includeItemTypes=Series&recursive=true&fields=Path
# Get episodes for a series
GET /Shows/{seriesId}/Episodes?fields=Path,MediaStreams
# Filter by library (parentId)
GET /Items?parentId=LIBRARY_ID&recursive=true&fields=Path
Libraries
GET /Library/VirtualFolders # List all libraries
POST /Library/Refresh # Trigger full library scan
POST /Items/{id}/Refresh # Refresh single item metadata
Streaming
# Test stream URL
GET /Videos/{itemId}/stream?static=true
# Get playback info
GET /Items/{itemId}/PlaybackInfo
Users
GET /Users # List users
GET /Users/{userId} # User details
Library IDs
Check with: curl -s -H "X-Emby-Token: TOKEN" http://localhost:8096/Library/VirtualFolders
Live TV
- ErsatzTV (channels <1000): M3U
http://ersatztv:8409/iptv/channels.m3u, XMLTVhttp://ersatztv:8409/iptv/xmltv.xml - Dispatcharr (channels 1000+): IPTV stream manager on port 9191, separate tuner
- Configured in Jellyfin Admin > Live TV
- Guide refresh task ID:
bea9b218c97bbf98c5dc1303bdb9a0ca— trigger viaPOST /ScheduledTasks/Running/{id} - Logo fix after guide refresh: ErsatzTV logos break (aspect ratio=0) because M3U uses
localhost:8409. Fix script indocs/Docker/ErsatzTV.mddownloads from ETV and base64-uploads toPOST /Items/{id}/Images/Primary(body = base64, Content-Type = image/png) - Image upload format: Jellyfin expects base64-encoded body (NOT raw binary) for
POST /Items/{id}/Images/Primary
Gotchas
- Passwords:
coup1802(NOTded89Lm4) — Jellyfin has native auth, no Authelia - Auth header is
X-Emby-Token(Jellyfin is an Emby fork) - Music videos are typed as "Movie" in Jellyfin
- Music library at
/data/musicmaps to/mnt/media/music_videoson host (not actual music) - Items return 404 on stream if source volume is unmounted
- Jellyfin preserves item IDs across restarts unless files are renamed
- Full library scan can take a long time — prefer targeted
/Items/{id}/Refresh ffprobeavailable in container for checking media streams:docker exec jellyfin ffprobe -v quiet -print_format json -show_streams FILE