[2026-09-27] eagle: family/how-to/navidrome-truenas-android.md personal/plans/tagwriter-container.md
This commit is contained in:
1 parent
96123c9825
commit
54adfa9a5a
2 files changed
+61
-26
No files matched your search
@@ -1,8 +1,9 @@
|
|||||||
# Музыкальный плеер с TrueNAS на Android
|
# Музыкальный плеер с TrueNAS на Android
|
||||||
|
|
||||||
**Статус:** ✅ **РАЗВЁРНУТ 2026-09-27** — Navidrome на TrueNAS, работает, скан завершён (8043 трека)
|
**Статус:** ✅ **РАЗВЁРНУТ 2026-09-27** — Navidrome на TrueNAS, работает, скан завершён (8043 трека).
|
||||||
|
🔴 **2026-09-27 (сессия 22):** теги 306 исправлены ✅, но **rescan НЕ помог** — в БД остались **14 сирот** `album` в скобках. `restart` и **пересоздание контейнера** дают `fullScan=false`, теги не перечитываются. Следующий шаг: **`touch` 306 файлов** (mtime) → полный скан.
|
||||||
**Дата:** 2026-05-10
|
**Дата:** 2026-05-10
|
||||||
**Обновлено:** 2026-09-27 (v4 — фактический деплой)
|
**Обновлено:** 2026-09-27 (v6 — rescan не помог, 14 сирот, путь через mtime)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -320,36 +321,54 @@ folder="!Pop, Club, Любэ/Дискотека Авария/Москва пьё
|
|||||||
**Артефакт для просмотра (запрошен у Alex, ещё не выгружен):** CSV `путь + текущий album + title`
|
**Артефакт для просмотра (запрошен у Alex, ещё не выгружен):** CSV `путь + текущий album + title`
|
||||||
по **306** файлам со «скобочным» album, топ-20 для глазной вычитки.
|
по **306** файлам со «скобочным» album, топ-20 для глазной вычитки.
|
||||||
|
|
||||||
## ⏳ АКТИВНО (2026-09-27): БОЕВОЙ ПРОГОН 306 ВЫПОЛНЕН — НУЖЕН ПОЛНЫЙ RESCAN
|
## 🔴 АКТИВНО (2026-09-27, сессия 22): RESCAN НЕ ПОМОГ — 14 СИРОТ ОСТАЛИСЬ
|
||||||
|
|
||||||
> **Alex: «Navidrome rescan теперь надо»**
|
> **Alex: «Navidrome rescan теперь надо»** → затем **«Просто контейнер пересоздай»**
|
||||||
|
|
||||||
**Факт: теги на диске исправлены, но БД Navidrome содержит И СТАРЫЕ, И НОВЫЕ альбомы.**
|
**Факт: теги на диске исправлены, но БД Navidrome содержит И СТАРЫЕ, И НОВЫЕ альбомы.**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
DB=/mnt/RED_2TB/docker/navidrome/data/navidrome.db
|
DB=/mnt/RED_2TB/docker/navidrome/data/navidrome.db
|
||||||
sqlite3 "file:$DB?mode=ro" "SELECT COUNT(*) FROM album WHERE name LIKE '(%';" # → 14
|
sqlite3 "file:$DB?mode=ro" "SELECT COUNT(*) FROM album WHERE name LIKE '(%';" # → 14 (до и после)
|
||||||
```
|
```
|
||||||
|
|
||||||
| Что | Значение |
|
| Что | Значение |
|
||||||
|---|---|
|
|---|---|
|
||||||
| альбомов в БД | 967 |
|
| альбомов в БД | 967 |
|
||||||
| `album` целиком в скобках | **14** ← не вычищены |
|
| `album` целиком в скобках | **14** ← не вычищены (число НЕ изменилось от rescan) |
|
||||||
| новые значения (`Философские`, `Морские`, `Москва пьёт пиво`, `Старые хиты`, `Дискотека Авария`, `Retro`, `Владимир Высоцкий`, `Несчастный Случай`, `zvezda`) | ✅ присутствуют |
|
| новые значения (`Философские`, `Морские`, `Москва пьёт пиво`, `Старые хиты`, `Дискотека Авария`, `Retro`, `Владимир Высоцкий`, `Несчастный Случай`, `zvezda`) | ✅ присутствуют |
|
||||||
|
|
||||||
**Причина:** `ND_SCANSCHEDULE=1h` + watcher **добавили** новые альбомы, но **не удалили** старые
|
### ❌ ЧТО ПРОБОВАЛОСЬ И НЕ ПОМОГЛО (факт)
|
||||||
записи, оставшиеся без файлов. Инкрементальный скан в Navidrome не чистит сироты сам.
|
|
||||||
|
|
||||||
**Варианты rescan (не выполнено, ждёт слова Alex):**
|
| # | Способ | Результат |
|
||||||
|
|
||||||
| # | Способ | Оценка |
|
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 1 | `docker restart navidrome` — полный скан на старте | ✅ предпочтительно, пароль не нужен |
|
| 1 | `docker restart navidrome` | ❌ лог: `fullScan=false` → теги не перечитаны, всё те же **14** |
|
||||||
| 2 | Дождаться планового скана (`1h`) | ⏳ не чистит автоматически, вероятно не поможет |
|
| 2 | `docker compose down` + `up -d` (**пересоздание контейнера**) | ❌ лог: `fullScan=false`, `duration=3.12s` → снова **14** |
|
||||||
| 3 | Rescan через UI/API | требует пароль `navi_admin` — **неизвестен, не выдумывать** |
|
| 3 | Проверка БД после обоих | `LIKE '(%'` = **14** (число не двинулось) |
|
||||||
|
|
||||||
**Проверка после rescan:** тот же запрос `LIKE '(%'` → должно стать **0**, и в UI не должно
|
⚠️ **Пересоздание контейнера БД НЕ чистит** — `navidrome.db` лежит на диске и монтируется томом
|
||||||
остаться дублей «альбом со скобками» + «альбом без скобок».
|
(`/mnt/RED_2TB/docker/navidrome/data:/data`), `down` его не удаляет. Compose-файл не менялся,
|
||||||
|
бэкап `docker-compose.yml.bak-20260927-052857`. Данные/музыка не пострадали.
|
||||||
|
|
||||||
|
⚠️ **`updated_at` у 14 сирот = 10:09–10:23 UTC, `missing=0`** — они считаются живыми записями
|
||||||
|
(скан их не помечает missing). Причина: album = пара `(name, album_artist)`; теги сменились →
|
||||||
|
Navidrome **создал новые** альбомы, **старые не удалил** (быстрый скан файлы не перечитывает).
|
||||||
|
|
||||||
|
### 🔑 СЛЕДУЮЩИЙ ШАГ (не сделан): перечитать `mtime` файлов → полный скан
|
||||||
|
|
||||||
|
Единственный надёжный путь без пароля: **`touch` 306 файлов** (меняет только `mtime`, содержимое
|
||||||
|
и аудио не трогает) → Navidrome увидит «изменённые» файлы → перечитает теги → сироты уйдут.
|
||||||
|
Либо через UI Navidrome: `Скан` с галкой **«Full scan»** (пароль `navi_admin` неизвестен —
|
||||||
|
спрашивать у Alex, не выдумывать; `curl /rest/ping` → `code 40 Wrong username or password`).
|
||||||
|
|
||||||
|
**Проверка после:** тот же запрос `LIKE '(%'` → должно стать **0**, в UI не должно быть дублей
|
||||||
|
«альбом со скобками» + «альбом без скобок».
|
||||||
|
|
||||||
|
> 🔴 **ПИТФОЛЛ (важно на будущее): `docker restart` и `docker compose down/up` для Navidrome
|
||||||
|
> НЕ вызывают полный скан.** В логе всегда `fullScan=false`. Navidrome читает только новые/изменённые
|
||||||
|
> файлы. Для принудительного перечитывания тегов нужно менять `mtime` файлов или использовать
|
||||||
|
> UI-скан с `Full scan`. Полный скан на старте — `ND_SCANONSTARTUP` + `ND_SCANONSTARTUP` force
|
||||||
|
> (**не проверено**, в ENV отсутствует; проверять, если `touch` не поможет).
|
||||||
|
|
||||||
> 🔴 **ВАЖНО на будущее: `sqlite3` ЕСТЬ на NAS напрямую (`/usr/bin/sqlite3`, 3.40.1)** —
|
> 🔴 **ВАЖНО на будущее: `sqlite3` ЕСТЬ на NAS напрямую (`/usr/bin/sqlite3`, 3.40.1)** —
|
||||||
> не нужно `docker exec`. В доке выше есть устаревшее утверждение «`docker exec navidrome sqlite3`»:
|
> не нужно `docker exec`. В доке выше есть устаревшее утверждение «`docker exec navidrome sqlite3`»:
|
||||||
@@ -396,6 +415,11 @@ Navidrome помечает missing только при полном рескан
|
|||||||
- **`.ndignore` пустой = игнорировать ВСЁ** (проверено строкой в бинаре).
|
- **`.ndignore` пустой = игнорировать ВСЁ** (проверено строкой в бинаре).
|
||||||
- **`strings <бинарь> | grep ndignore`** — быстрый способ подтвердить фичу без чтения доки.
|
- **`strings <бинарь> | grep ndignore`** — быстрый способ подтвердить фичу без чтения доки.
|
||||||
- **`docker exec navidrome sqlite3`** есть внутри контейнера — БД читается напрямую (в отличие от Jellyfin).
|
- **`docker exec navidrome sqlite3`** есть внутри контейнера — БД читается напрямую (в отличие от Jellyfin).
|
||||||
|
- 🔴 **`docker restart` и `docker compose down/up` НЕ вызывают полный скан Navidrome** — в логе всегда
|
||||||
|
`fullScan=false` (`duration≈3s`). Смена тегов без смены `mtime` файлов **не подхватывается**.
|
||||||
|
Для принудительного перечитывания — `touch` файлов либо UI-скан с галкой **Full scan**.
|
||||||
|
- 🔴 **Пересоздание контейнера не чистит БД** — `navidrome.db` в томе на диске; после `down/up`
|
||||||
|
данные и число сирот те же. Пересоздавать контейнер ради «чистого скана» бессмысленно.
|
||||||
- **Navidrome не имеет дефолтного логина** — первый вход = форма «Create admin», это не поломка.
|
- **Navidrome не имеет дефолтного логина** — первый вход = форма «Create admin», это не поломка.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ created: '2026-09-26'
|
|||||||
updated: '2026-09-27'
|
updated: '2026-09-27'
|
||||||
type: plan
|
type: plan
|
||||||
namespace: personal
|
namespace: personal
|
||||||
status: session21-apply-306-done-navidrome-rescan-pending
|
status: session22-apply-306-done-navidrome-rescan-failed-14-orphans
|
||||||
tags:
|
tags:
|
||||||
- music
|
- music
|
||||||
- truenas
|
- truenas
|
||||||
@@ -85,7 +85,7 @@ CSV: /app/data/apply-plan.csv ← 306 строк
|
|||||||
🔴 **Правило: приёмка = чтение тегов с диска по значению, а не `ok=306` из отчёта скрипта.**
|
🔴 **Правило: приёмка = чтение тегов с диска по значению, а не `ok=306` из отчёта скрипта.**
|
||||||
Дополнительно проверять **размер файла** (`>100KB`) — он доказывает, что MPEG-поток не тронут (W2).
|
Дополнительно проверять **размер файла** (`>100KB`) — он доказывает, что MPEG-поток не тронут (W2).
|
||||||
|
|
||||||
### ⏳ ОТКРЫТО: NAVidrome — СТАРЫЕ И НОВЫЕ АЛЬБОМЫ СОСУЩЕСТВУЮТ
|
### ❌ ОТКРЫТО (сессия 22): RESCAN ПРОВЕДЁН — НЕ ПОМОГ, 14 СИРОТ ОСТАЛИСЬ
|
||||||
|
|
||||||
Navidrome смотрит в **ту же** папку (`/mnt/RED_2TB/storage/Music → /music`), данные
|
Navidrome смотрит в **ту же** папку (`/mnt/RED_2TB/storage/Music → /music`), данные
|
||||||
`/mnt/RED_2TB/docker/navidrome/data`, `ND_SCANSCHEDULE=1h`, порт 4533, `https://music.mallexxx.duckdns.org`.
|
`/mnt/RED_2TB/docker/navidrome/data`, `ND_SCANSCHEDULE=1h`, порт 4533, `https://music.mallexxx.duckdns.org`.
|
||||||
@@ -94,29 +94,40 @@ Navidrome смотрит в **ту же** папку (`/mnt/RED_2TB/storage/Musi
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
DB=/mnt/RED_2TB/docker/navidrome/data/navidrome.db
|
DB=/mnt/RED_2TB/docker/navidrome/data/navidrome.db
|
||||||
sqlite3 "file:$DB?mode=ro" "SELECT COUNT(*) FROM album WHERE name LIKE '(%';" # → 14
|
sqlite3 "file:$DB?mode=ro" "SELECT COUNT(*) FROM album WHERE name LIKE '(%';" # → 14 (до И после rescan)
|
||||||
```
|
```
|
||||||
|
|
||||||
| Что | Значение |
|
| Что | Значение |
|
||||||
|---|---|
|
|---|---|
|
||||||
| альбомов в БД | 967 |
|
| альбомов в БД | 967 |
|
||||||
| со скобками | **14** |
|
| со скобками | **14** ← число НЕ изменилось от rescan |
|
||||||
| новые значения (`Философские`, `Морские`, `Москва пьёт пиво`, `Retro`, `Владимир Высоцкий`, …) | ✅ появились |
|
| новые значения (`Философские`, `Морские`, `Москва пьёт пиво`, `Retro`, `Владимир Высоцкий`, …) | ✅ появились |
|
||||||
| старые скобочные (`(Философские)`, `(Авария)` ×2, `(Высоцкий)`, …) | ❌ **НЕ удалены** |
|
| старые скобочные (`(Философские)`, `(Авария)` ×2, `(Высоцкий)`, …) | ❌ **НЕ удалены** |
|
||||||
|
|
||||||
**Диагноз:** watcher/плановый скан **добавил** новые альбомы, но **не вычистил старые записи**,
|
**Диагноз:** watcher/плановый скан **добавил** новые альбомы, но **не вычистил старые записи**,
|
||||||
к которым больше нет файлов. Нормальное поведение инкрементального скана — нужен полный rescan.
|
к которым больше нет файлов. Нормальное поведение инкрементального скана — нужен полный rescan.
|
||||||
|
|
||||||
**Что нужно (не сделано, ждёт решения Alex):**
|
**Alex: «Navidrome rescan теперь надо» → «Просто контейнер пересоздай». Выполнено — НЕ ПОМОГЛО:**
|
||||||
|
|
||||||
1. **Рестарт контейнера** — `docker restart navidrome` (полный скан на старте, чистит пропавшие) —
|
| # | Способ | Результат |
|
||||||
предпочтительный вариант, без пароля;
|
|---|---|---|
|
||||||
2. **Плановый скан** — сам раз в час (`ND_SCANSCHEDULE=1h`);
|
| 1 | `docker restart navidrome` | ❌ лог `fullScan=false` → теги не перечитаны, всё те же **14** |
|
||||||
3. Rescan через API требует пароль `navi_admin` — **неизвестен, не выдумывать**
|
| 2 | `docker compose down` + `up -d` (пересоздание контейнера) | ❌ лог `fullScan=false`, `duration=3.12s` → снова **14** |
|
||||||
(`curl …/rest/ping` → `code 40 Wrong username or password`).
|
|
||||||
|
⚠️ **Пересоздание контейнера БД не чистит** — `navidrome.db` в томе на диске, `down` его не удаляет.
|
||||||
|
Compose не менялся (бэкап `docker-compose.yml.bak-20260927-052857`), данные/музыка целы.
|
||||||
|
⚠️ Сироты: `updated_at` 10:09–10:23 UTC, `missing=0` — скан их живыми считает.
|
||||||
|
|
||||||
|
**🔑 СЛЕДУЮЩИЙ ШАГ (не сделан): `touch` 306 файлов → полный скан.** `touch` меняет только `mtime`,
|
||||||
|
содержимое/аудио не трогает; Navidrome увидит «изменённые» файлы и перечитает теги. Альтернатива —
|
||||||
|
UI-скан с галкой **Full scan** (пароль `navi_admin` неизвестен — **не выдумывать**,
|
||||||
|
`curl …/rest/ping` → `code 40 Wrong username or password`).
|
||||||
|
|
||||||
Проверка результата — тот же запрос: `LIKE '(%'` должно стать **0**.
|
Проверка результата — тот же запрос: `LIKE '(%'` должно стать **0**.
|
||||||
|
|
||||||
|
🔴 **ПИТФОЛЛ: `docker restart` и `docker compose down/up` для Navidrome НЕ дают полного скана** —
|
||||||
|
в логе всегда `fullScan=false`. Смена тегов без смены `mtime` не подхватывается.
|
||||||
|
|
||||||
🔴 **Питфолл-нюанс:** Navidrome при скане **пересчитывает album из тегов**, поэтому у 306 файлов
|
🔴 **Питфолл-нюанс:** Navidrome при скане **пересчитывает album из тегов**, поэтому у 306 файлов
|
||||||
кроме `TALB` сменился и `TPE2` — в БД это **новые** записи альбомов, а не апдейт старых.
|
кроме `TALB` сменился и `TPE2` — в БД это **новые** записи альбомов, а не апдейт старых.
|
||||||
Пока старые не вычищены, в UI видны оба варианта (со скобками и без).
|
Пока старые не вычищены, в UI видны оба варианта (со скобками и без).
|
||||||
|
|||||||
Reference in new issue
Block a user