# Radarr / Sonarr — снятие фантомных записей после удаления файлов > Составлен 2026-09-22 по итогам чистки медиа на Кра́кене (освобождено 765 ГБ). > Проблема: файлы удалены с диска вручную, а Radarr/Sonarr продолжают показывать > их как «присутствующие», и **любая попытка исправить это через API падает с HTTP 409**. ## Симптом После `rm -rf` библиотечных папок: ```bash 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 (см. ниже). ## Решение (порядок, который работает) ```bash # Переменные 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 '[^<]+' "$B/radarr/config/config.xml" | sed 's///') SKEY=$(sudo grep -oE '[^<]+' "$B/sonarr/config/config.xml" | sed 's///') 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` — стек Кра́кена, порты, питфоллы