Triggers and monitors Jellyfin library scans, shows scan progress, displays newly added content, and verifies library statistics. Use this after adding new media, when content doesn't appear in Jellyfin, or when investigating indexing issues.
Triggers and monitors Jellyfin library scans, displays new content and verifies statistics.
/plugin marketplace add theflysurfer/claude-skills-marketplace/plugin install theflysurfer-claude-skills-marketplace@theflysurfer/claude-skills-marketplaceThis skill is limited to using the following tools:
reference.mdscripts/monitor_scan.pyForce library scan and monitor indexing progress.
ssh automation@srv759970.hstgr.cloud
# Install monitor script
cd /home/automation/scripts
wget https://raw.githubusercontent.com/YOUR_REPO/main/.claude/skills/jellyfin-scan/scripts/monitor_scan.py
chmod +x monitor_scan.py
# Trigger scan and monitor progress
python3 monitor_scan.py --trigger
Output:
š Triggering library scan...
ā Library scan triggered
š Monitoring scan progress...
[13:45:23] š Scan running... (0%) - 5s elapsed
[13:46:10] š Scan running... (45%) - 52s elapsed
[13:47:30] ā Scan completed! - Total time: 127s
--- Library Statistics ---
Series: 287
Episodes: 12,456
Movies: 1,234
ssh automation@srv759970.hstgr.cloud
# Trigger full library refresh
curl -X POST 'http://localhost:8096/Library/Refresh' \
-H 'X-Emby-Token: 9af5f56a66e44ee68ddeec7bd07c9db8'
# Monitor logs manually
docker logs jellyfin --follow | grep -i "scan\|library\|validat"
curl -X POST 'http://localhost:8096/Library/Refresh' \
-H 'X-Emby-Token: YOUR_TOKEN'
# Get library IDs first
curl -s 'http://localhost:8096/Library/VirtualFolders' \
-H 'X-Emby-Token: YOUR_TOKEN' | jq '.[] | {Name, ItemId}'
# Scan just TV library
curl -X POST 'http://localhost:8096/Items/{LibraryId}/Refresh?Recursive=true' \
-H 'X-Emby-Token: YOUR_TOKEN'
# Get item ID
curl -s 'http://localhost:8096/Items?SearchTerm=Naruto' \
-H 'X-Emby-Token: YOUR_TOKEN' | jq '.Items[0].Id'
# Refresh single show
curl -X POST 'http://localhost:8096/Items/{ItemId}/Refresh' \
-H 'X-Emby-Token: YOUR_TOKEN'
curl -s 'http://localhost:8096/Items/Counts' \
-H 'X-Emby-Token: 9af5f56a66e44ee68ddeec7bd07c9db8' | jq
Expected output:
{
"MovieCount": 1234,
"SeriesCount": 287,
"EpisodeCount": 12456,
"ArtistCount": 0,
"ProgramCount": 0,
"TrailerCount": 0,
"SongCount": 0,
"AlbumCount": 0,
"MusicVideoCount": 0,
"BoxSetCount": 0,
"BookCount": 0,
"ItemCount": 14977
}
# Check if Naruto was detected
curl -s 'http://localhost:8096/Items?SearchTerm=Naruto&Recursive=true' \
-H 'X-Emby-Token: 9af5f56a66e44ee68ddeec7bd07c9db8' | \
jq '.Items[] | {Name, Type, Id}'
# Last 20 items added
curl -s 'http://localhost:8096/Items?SortBy=DateCreated&SortOrder=Descending&Limit=20' \
-H 'X-Emby-Token: 9af5f56a66e44ee68ddeec7bd07c9db8' | \
jq '.Items[] | {Name, Type, DateCreated}'
| Symptom | Likely Cause | Quick Fix |
|---|---|---|
| Scan doesn't start | Invalid API token | Check token in SECRETS.md |
| Scan takes >30min | Too many files or dead links | Scan specific library only |
| Items = 0 after scan | Mount not accessible | docker exec jellyfin ls /media/shows/ |
| Content not detected | File naming wrong | Check naming conventions (see reference.md) |
| Scan stuck at X% | Network/disk issues | Restart Jellyfin, try again |
Jellyfin requires specific naming patterns:
Good:
/media/shows/Naruto (2002)/Season 01/Naruto S01E01.mkv
/media/shows/Breaking Bad/Season 05/Breaking.Bad.S05E01.mkv
Bad:
/media/shows/Naruto/01.mkv
/media/shows/[Anime] Naruto - Episode 01.mkv
Good:
/media/movies/Avatar (2009)/Avatar (2009).mkv
/media/movies/Inception (2010).mkv
Bad:
/media/movies/movie1.mkv
/media/movies/Avatar.mkv (missing year)
Typical workflow:
media-stack-refresh
āā Restart Zurg/Rclone, trigger scan
jellyfin-scan ā YOU ARE HERE
āā Monitor scan progress
health-check
āā Verify all services healthy
Disable real-time monitoring (reduces I/O):
Scan during off-hours (less resource contention)
Disable thumbnail extraction during scan:
Use specific library scans instead of full refresh
See reference.md for:
See scripts/monitor_scan.py for:
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.