Files
obsidian-vault/personal/tech/radarr-sonarr-phantom-records.md
T
Taiga b53dd70a15 [2026-09-26 09:10:28] syncthing: personal/tech/archive-org-collection-harvest.md personal/tech/balda-go-fx-pitfalls.md personal/tech/bilety-oxota-interaktiv.md personal/tech/cloudflare-tunnel-ssh-published-route.md personal/tech/deepseek-language-drift.md personal/tech/docker-data-root-mount-race.md personal/tech/docker-mac-disk-issues.md personal/tech/docker_colima_setup.md personal/tech/eagle-dashboard-launchd.md personal/tech/hermes-agent-improvements.md personal/tech/hermes-browser-toolsets.md personal/tech/hermes-fork-vs-upstream.md personal/tech/hermes-git-repo.md personal/tech/hermes-memory-architecture.md personal/tech/hermes-secret-redaction-bypass.md personal/tech/hermes-self-improvement-review.md personal/tech/home-network-config.md personal/tech/inter-site-throughput-taiga-to-mac.md personal/tech/inter-site-throughput-taiga-to-mac.md.bak-nedstab2 personal/tech/jellyfin-db-schema-mismatch.md personal/tech/karabiner-keyboard-config.md personal/tech/kraken-media-inventory-facts.md personal/tech/kraken-truenas-media-copies.md personal/tech/lampa-jellyfin-plugin.md personal/tech/lampac-deployment.md personal/tech/lampac-torrserver.md personal/tech/llm-model-selection-2026.md personal/tech/mac-print-shared-services.md personal/tech/modbus-rtu-sniffer-debugging.md personal/tech/multistream-single-flow-limit.md personal/tech/multistream-single-flow-limit.md.bak-nedstab2 personal/tech/music-tags-repair-truenas.md personal/tech/obsidian-mcp-ecosystem.md personal/tech/original-xbox-2025-guide.md personal/tech/prowlarr-flaresolverr-cloudflare.md personal/tech/radarr-sonarr-phantom-records.md personal/tech/roundtrip-key-verification.md personal/tech/ryujinx-mac-setup.md personal/tech/skill-arr-media-stack-setup-additions.md personal/tech/skill-docker-data-root-mount-race.md personal/tech/skill-lampac-kraken-deploy.md personal/tech/tirith-trust.md personal/tech/truenas-local-tree-comparison.md personal/tech/truenas-nfs4-acl-and-arrmultiuser.md personal/tech/truenas-zfs-panic-recovery.md personal/tech/vault-doc-pruning.md personal/tech/vless-space-subscription-egress.md personal/tech/watchlist-sync-feed.md personal/tech/watchtower-docker-updates.md personal/tech/xray-outbound-subscription-3xui.md personal/tech/xray-reverse-limits-private-network.md personal/tech/xray-reverse-tunnel-kraken-truenas.md personal/tech/xray-reverse-tunnel-kraken-truenas.md.bak-nedstab2 personal/tech/yandex-music-api.md
2026-09-26 09:10:28 +00:00

6.0 KiB
Executable File
Raw Blame History

Radarr / Sonarr — снятие фантомных записей после удаления файлов

Составлен 2026-09-22 по итогам чистки медиа на Кра́кене (освобождено 765 ГБ). Проблема: файлы удалены с диска вручную, а Radarr/Sonarr продолжают показывать их как «присутствующие», и любая попытка исправить это через API падает с HTTP 409.

Симптом

После rm -rf библиотечных папок:

curl -X DELETE -H "X-Api-Key: $KEY" "$R/api/v3/moviefile/$FID"
# HTTP 409
{
  "message": "Movie's root folder (/media/movies-radarr) doesn't exist.",
  "description": "NzbDrone.Core.Exceptions.NzbDroneClientException: ... \
     at NzbDrone.Core.MediaFiles.MediaFileDeletionService.DeleteMovieFile(...)"
}

Дальше причина меняется — это ловушка, на которой легко застрять:

Состояние корневой папки Ответ API
Удалена root folder (/media/x) doesn't exist
Создана, но пуста root folder (/media/x) is empty. Rescan
Есть хотя бы один файл ✅ операция проходит

🔴 DELETE /api/v3/moviefile/{id} и /api/v3/episodefile/{id} в принципе бесполезны, пока корень битый. Они проверяют корневую папку до удаления записи и отваливаются. Не подбирать параметры — сразу делать Rescan (см. ниже).

Решение (порядок, который работает)

# Переменные
M=/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/media
B=/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/docker
RKEY=$(sudo grep -oE '<ApiKey>[^<]+' "$B/radarr/config/config.xml" | sed 's/<ApiKey>//')
SKEY=$(sudo grep -oE '<ApiKey>[^<]+' "$B/sonarr/config/config.xml" | sed 's/<ApiKey>//')
R="http://127.0.0.1:7878/radarr"; S="http://127.0.0.1:8989/sonarr"

# 1. Восстановить корневые папки. 🔴 media/ принадлежит root — нужен sudo!
sudo mkdir -p "$M/movies-radarr" "$M/series-sonarr" "$M/movies" "$M/series"
sudo chown kraken:kraken "$M/movies-radarr" "$M/series-sonarr" "$M/movies" "$M/series"

# 2. Положить заглушку В КОРЕНЬ — иначе «root folder is empty»
printf 'decoy' > "$M/movies-radarr/.keep"
printf 'decoy' > "$M/series-sonarr/.keep"

# 3. Rescan через API — фантомы снимаются САМИ
curl -sL -X POST -H "X-Api-Key: $RKEY" -H 'Content-Type: application/json' \
  -d '{"name":"RescanMovie"}'  "$R/api/v3/command"
curl -sL -X POST -H "X-Api-Key: $SKEY" -H 'Content-Type: application/json' \
  -d '{"name":"RescanSeries"}' "$S/api/v3/command"

# 4. Подождать скан (Sonarr идёт ~60 сек, снимает пачками), проверить
curl -sL -H "X-Api-Key: $RKEY" "$R/api/v3/movie"  | jq '[.[]|select(.hasFile==true)]|length'   # → 0
curl -sL -H "X-Api-Key: $SKEY" "$S/api/v3/series" | jq '[.[].statistics.episodeFileCount]|add'  # → 0

# 5. Убрать заглушки и пустые папки
sudo rm -rf "$M/movies-radarr" "$M/series-sonarr" "$M/movies" "$M/series"

Проверено: Radarr hasFile 12 → 0, Sonarr episodeFile 57 → 0.

Питфоллы

🔴 ?apikey= НЕ работает. Нужен заголовок X-Api-Key. С query-параметром приходит пустой ответ или 401, и выглядит как «API мёртв».

🔴 Обязателен curl -sL. У обоих стеков задан UrlBase (/radarr, /sonarr) — без -L вернётся 307 Temporary Redirect с нулевым телом. Проверять: curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:7878/ → 307.

🔴 mkdir без sudo падает (Permission denied) — каталог media/ на диске принадлежит root:root, при том что вложенные папки уже kraken:kraken.

⚠️ Сканы асинхронные. RescanSeries возвращает {"status":"started"} мгновенно, работа идёт десятками секунд и снимает записи пачками (25 → 13 → 0). Не делать вывод «не сработало» по одному замеру — поллить.

⚠️ RescanMovie/RescanSeries без movieIds/seriesIds = вся библиотека. С ids сканируется только указанное. Для снятия фантомов нужен полный вариант.

Родственный факт: Transmission пересоздаёт раздачи

После torrent-remove часть раздач возвращается с новыми ID (у нас 8 из 240). Причина — файлы ещё на диске + активное сидирование. Лечится повторным проходом после удаления файлов, причём фильтровать надо по downloadDir, а не по сохранённому списку ID.

⚠️ В downloadDir бывают пути вне ожидаемых префиксов — у нас /downloads/radarr не попал под фильтр ("/downloads/complete", ...), и раздача пережила первый проход. Проверять итог по фактическому torrent-get, а не по «сколько отправили на удаление».

Связанное

  • personal/plans/kraken-media-inventory-cleanup.md — вся чистка 765 ГБ
  • personal/tech/kraken-truenas-media-copies.md — сверка копий Кра́кен ↔ TrueNAS
  • personal/tech/lampac-deployment.md — стек Кра́кена, порты, питфоллы