Files
obsidian-vault/personal/tech/radarr-sonarr-phantom-records.md
T

6.0 KiB
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 — стек Кра́кена, порты, питфоллы