102 lines
6.0 KiB
Markdown
Executable File
102 lines
6.0 KiB
Markdown
Executable File
# 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 '<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` — стек Кра́кена, порты, питфоллы
|