6.0 KiB
Executable File
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— сверка копий Кра́кен ↔ TrueNASpersonal/tech/lampac-deployment.md— стек Кра́кена, порты, питфоллы