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

102 lines
6.0 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` — стек Кра́кена, порты, питфоллы