返回 Skill 列表
extension
分类: 内容与媒体无需 API Key

media-stack-full-refresh

完成工作流以在更改后刷新整个媒体堆栈 - 清理Real-Debrid,重启Zurg/Rclone挂载,清除缓存,验证挂载健康状况,并触发Jellyfin库扫描。在删除种子、挂载显示陈旧数据、配置更改后或RD与Jellyfin之间内容不同步时使用此流程。

person作者: jakexiaohubgithub

Media Stack Full Refresh

Complete end-to-end refresh workflow for the entire media infrastructure.

What This Does

Orchestrates the full refresh chain:

  1. Restart Zurg - Rebuild torrent database from Real-Debrid
  2. Restart Rclone - Clear mount cache
  3. Verify mount - Ensure files accessible
  4. (Optional) Restart Jellyfin - Clear metadata cache
  5. Trigger scan - Index new content
  6. Verify results - Confirm content detected

When To Use This

Primary Use Cases

  • After RD cleanup: Deleted torrents still show in mount
  • Content not syncing: Added torrents don't appear in Jellyfin
  • Stale mount data: Files deleted but directories persist
  • Configuration changes: Modified Zurg config.yml
  • Cache corruption: Rclone showing incorrect file sizes

Symptoms That Need This

❌ Deleted 9-1-1 from RD but 42 folders still in /mnt/rd/shows/
❌ Added Naruto to RD but doesn't appear in Jellyfin
❌ Zurg logs show "404" for files that should exist
❌ Rclone mount frozen or stale
❌ Jellyfin shows "0 items" after adding content

Quick Start

Option 1: Automated Script (Recommended)

ssh automation@srv759970.hstgr.cloud

# Download script
cd /home/automation/scripts
wget https://raw.githubusercontent.com/YOUR_REPO/main/.claude/skills/media-stack-refresh/scripts/full_refresh.sh
chmod +x full_refresh.sh

# Run full refresh
./full_refresh.sh

# Or skip Jellyfin restart (faster, doesn't interrupt streams)
./full_refresh.sh --skip-jellyfin

Duration: 3-5 minutes (5-30 minutes with scan)

Option 2: Manual Step-by-Step

ssh automation@srv759970.hstgr.cloud

# 1. Restart Zurg
docker restart zurg && sleep 10

# 2. Restart Rclone
docker restart rclone && sleep 15

# 3. Verify mount
ls /mnt/rd/shows/ | wc -l

# 4. (Optional) Restart Jellyfin
docker restart jellyfin && sleep 30

# 5. Trigger scan
curl -X POST 'http://localhost:8096/Library/Refresh' \
  -H 'X-Emby-Token: 9af5f56a66e44ee68ddeec7bd07c9db8'

# 6. Wait and verify (2-30 min depending on library size)

Expected Output

Automated Script Output

[INFO] Step 1/7: Restarting Zurg...
[INFO] ✓ Zurg is healthy
[INFO]   Compiled 489 torrents

[INFO] Step 2/7: Restarting Rclone...
[INFO] ✓ Rclone is running

[INFO] Step 3/7: Verifying mount health...
[INFO] ✓ Mount accessible (282 shows found)

[INFO] Step 4/7: Restarting Jellyfin...
[WARN]   This will interrupt active streams!
[INFO] ✓ Jellyfin is healthy

[INFO] Step 5/7: Triggering Jellyfin library scan...
[INFO] ✓ Library scan triggered

[INFO] Step 6/7: Waiting for scan to complete...
[WARN]   This may take 2-30 minutes depending on library size

[INFO] Step 7/7: Verifying results...
[INFO] ✓ Library statistics retrieved
[INFO]   Series: 245
[INFO]   Episodes: 8,432
[INFO]   Movies: 1,234

=========================================
  MEDIA STACK REFRESH COMPLETED
=========================================

Verification Steps

1. Verify Zurg Updated

# Check Zurg compiled new torrent count
docker logs zurg 2>&1 | grep "Compiled" | tail -1

Expected: New torrent count matching Real-Debrid

2. Verify Mount Reflects Changes

# If you deleted 9-1-1, this should return 0
ls /mnt/rd/shows/ | grep -i "9-1-1" | wc -l

# If you added Naruto, this should find it
ls /mnt/rd/shows/ | grep -i "naruto"

3. Verify Jellyfin Updated

# Check library stats
curl -s 'http://localhost:8096/Items/Counts' \
  -H 'X-Emby-Token: 9af5f56a66e44ee68ddeec7bd07c9db8' | \
  grep -oP '"SeriesCount":\K\d+'

# Search for specific content
curl -s 'http://localhost:8096/Items?SearchTerm=Naruto&Recursive=true' \
  -H 'X-Emby-Token: 9af5f56a66e44ee68ddeec7bd07c9db8' | \
  grep -oP '"Name":.*?Naruto'

Cache Behavior Explained

Why Deleted Torrents Still Show

The cache chain:

Real-Debrid API
    ↓ (cached 5min)
Zurg Database
    ↓ (cached until restart)
Rclone VFS Cache
    ↓ (cached 1h default)
Filesystem Mount
    ↓ (cached 30s kernel)
Jellyfin Library
    ↓ (cached until scan)

Each layer must be refreshed - that's why simple docker restart often isn't enough!

Integration with Other Skills

Typical Workflow

Step 1: realdebrid-cleanup
  └─ Delete dead torrents from Real-Debrid

Step 2: media-stack-refresh ← YOU ARE HERE
  ├─ Restart Zurg (rebuild database)
  ├─ Restart Rclone (clear cache)
  └─ Trigger Jellyfin scan

Step 3: jellyfin-scan
  └─ Monitor scan progress

Step 4: health-check
  └─ Verify all services healthy

Performance Optimization

For Large Libraries (500+ items)

1. Skip Jellyfin restart (faster, doesn't interrupt streams):

./full_refresh.sh --skip-jellyfin

2. Scan specific library only:

# Get library ID
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'

3. Increase Rclone cache (fewer API calls):

# In docker-compose.yml for rclone
command:
  - --vfs-cache-max-size=20G  # Increase from 10G

Typical Timings

| Step | Duration | Can Skip? | |------|----------|-----------| | Restart Zurg | 10-15s | No | | Restart Rclone | 15-20s | No | | Verify Mount | 5s | No (critical) | | Restart Jellyfin | 30-45s | Yes | | Trigger Scan | 1s | No | | Wait for Scan | 2-30min | No (async) | | Verify Results | 30s | No (critical) |

Total minimum: ~2 minutes (no Jellyfin restart, small library) Total typical: ~10 minutes (with restart, medium library) Total maximum: ~35 minutes (full refresh, large library)

Troubleshooting Quick Reference

| Symptom | Likely Cause | Quick Fix | |---------|--------------|-----------| | Mount not accessible | Rclone crashed | docker restart rclone | | Zurg not healthy | Config error | Check docker logs zurg | | Deleted content still shows | Cache not cleared | Force: docker exec rclone rclone rc vfs/forget | | Jellyfin scan finds nothing | Mount not accessible | docker exec jellyfin ls /media/shows/ | | Scan takes >30min | Too many files | Scan specific library only |

Automation Setup

Scheduled Refresh (Daily at 4am)

# Add to automation crontab
crontab -e

# Daily refresh (skip Jellyfin to avoid interrupting streams)
0 4 * * * /home/automation/scripts/full_refresh.sh --skip-jellyfin >> /home/automation/logs/media-refresh.log 2>&1

Post-Cleanup Hook

Auto-refresh after Real-Debrid cleanup:

#!/bin/bash
# /home/automation/scripts/cleanup_and_refresh.sh

# Run RD cleanup
python3 /home/automation/scripts/cleanup_realdebrid.py "$@"

# If cleanup succeeded, refresh stack
if [ $? -eq 0 ]; then
    echo "Cleanup completed, refreshing media stack..."
    /home/automation/scripts/full_refresh.sh --skip-jellyfin
fi

For More Details

See reference.md for:

  • Detailed troubleshooting guide for each step
  • Advanced configuration options
  • Cache clearing techniques
  • Service recovery procedures

See scripts/full_refresh.sh for:

  • Complete bash source code
  • Customization options
  • Error handling details