Serverseitig: Uploads landen in der Navidrome-Bibliothek
Auf Wunsch: was vom Handy hochgeladen wird, soll auch in Navidrome auftauchen. Die Subsonic-API kennt keinen Upload — also erledigt es die Melo-Cloud selbst. Server (/home/dustin/scripts/melo_cloud.py, nicht versioniert — Backup als melo_cloud.py.bak-20260821-084506): - verknuepfe_navidrome(): Hardlink der Registry-Datei nach /home/dustin/navidrome/music (Bind-Mount des Containers). Gleiche Partition -> kein zusaetzlicher Speicher. Fallback: Kopie. - rescan_navidrome(): Subsonic startScan.view ueber Navidromes AuthProxyHeader (TrustedSources 127.0.0.1) — kein Passwort im Code. Nur zur Beschleunigung, der Watcher findet neue Dateien ohnehin. - upload() verknuepft neue UND bereits bekannte Titel (heilt Bestand). - handle_delete() entfernt die Datei aus Registry + Navidrome, sobald kein Konto sie mehr aktiv hat. Der Registry-EINTRAG bleibt stehen: handle_list haengt die Grabsteine daran (JOIN registry) — ohne ihn erfuehren die anderen Geraete nie von der Loeschung (Zombie-Song). - registry_pfad(): gemeinsame Dateisuche ueber alle Audio-Endungen, mit Rueckfall auf den Navidrome-Ordner. Nebenbei repariert: - Alle 325 Cloud-Dateien lagen nur noch im Navidrome-Ordner, REG war leer: jeder Download antwortete "File missing". Per Hardlink zurueckverknuepft (scripts/melo_cloud_migriere_registry.py). - upload() legte jede Datei als ".mp3" ab, auch m4a/flac. Jetzt echte Endung; _download liefert passenden Content-Type und einen Dateinamen ohne doppelte Endung. App: - MeloCloudService.herunterladen() gibt die geschriebene Datei zurueck und leitet die Endung aus dem Content-Type ab (endungFuer) — sonst landet eine M4A als .mp3 auf dem Handy und Android ordnet sie falsch ein. - loeschBremseGreift(): der Abgleich reicht keine Loeschwelle mehr zum Server durch (>10 Titel UND >1/3 des Serverbestands). Ohne die Bremse haette eine nicht eingehaengte Speicherkarte die Sammlung auf allen Geraeten geloescht. 276 Tests gruen (1 uebersprungen), flutter analyze ohne Befund, plus ein Durchlauf gegen den echten Server (scripts/test_melo_cloud_navidrome.py): Upload -> Registry + Navidrome (ein Hardlink) -> Navidrome liest ein -> Loeschen entfernt beides, Grabstein bleibt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FpPu4nuKjKKeX1RpdDeX81
This commit is contained in:
co-authored by
Claude Opus 5
parent
9fa027fca1
commit
cd79213bb3
@@ -5,6 +5,55 @@ Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### 📚 Hochgeladene Titel landen jetzt auch in Navidrome (2026-08-21)
|
||||
|
||||
- 🎵 **Was sich ändert:** Was du vom Handy hochlädst, taucht ab sofort **auch
|
||||
in der Navidrome-Bibliothek** auf — also im Browser und in jeder anderen
|
||||
Musik-App, die auf den Server zugreift. Vorher blieb es in der Melo-Cloud
|
||||
liegen und war nur in Melo sichtbar.
|
||||
🔧 **Wie:** Die Melo-Cloud hängt die hochgeladene Datei zusätzlich in
|
||||
Navidromes Musikordner (als *Hardlink* — dieselbe Datei unter zwei Namen,
|
||||
also **kein zusätzlicher Speicherplatz**) und stößt einen Scan an.
|
||||
Navidrome hat den Titel binnen Sekunden. Löschst du ihn, verschwindet er
|
||||
auch aus Navidrome — aber nur, wenn ihn kein anderes Konto mehr hat.
|
||||
⚠️ **Zu wissen:** Navidrome hat **eine gemeinsame** Bibliothek. Was ein
|
||||
Konto hochlädt, sehen dort alle Navidrome-Nutzer. In Melo bleibt die
|
||||
Trennung pro Konto bestehen.
|
||||
- 🩹 **Nebenbei repariert: Downloads vom Server gingen gar nicht.** Die 325
|
||||
Titel der Melo-Cloud lagen nur noch im Navidrome-Ordner — der Ablageordner
|
||||
der Cloud war leer. Jeder Download antwortete deshalb mit *„File missing"*.
|
||||
Alle Dateien sind zurückverknüpft, Downloads gehen wieder.
|
||||
- 🏷️ **Nebenbei repariert: falsche Dateiendungen.** Hochgeladene Dateien
|
||||
wurden immer als `.mp3` abgelegt, auch M4A und FLAC; heruntergeladene
|
||||
bekamen den Namen `Lied.m4a.m4a`. Jetzt zählt der echte Dateityp — auf dem
|
||||
Server wie auf dem Handy (wichtig, damit Android den Titel richtig
|
||||
einordnet).
|
||||
- 🛑 **Neu: Sicherheitsbremse gegen Massenlöschung.** Der Bibliotheks-Scan
|
||||
markiert jeden Titel als gelöscht, dessen Datei er nicht findet. Ist die
|
||||
Speicherkarte einmal nicht eingehängt oder die Berechtigung entzogen,
|
||||
betrifft das die halbe Sammlung — und ohne Bremse hätte der Abgleich sie
|
||||
am Server und damit auf **allen** Geräten gelöscht. Melo hält jetzt an,
|
||||
wenn mehr als 10 Titel **und** mehr als ein Drittel des Serverbestands auf
|
||||
einmal verschwinden sollen, und sagt warum. Einzelne Löschungen laufen
|
||||
unverändert durch.
|
||||
- 🔧 **Details für Technikinteressierte:**
|
||||
- `melo_cloud.py`: `verknuepfe_navidrome()` (Hardlink, Fallback Kopie),
|
||||
`loese_navidrome()`, `rescan_navidrome()` (Subsonic `startScan.view` über
|
||||
Navidromes `AuthProxyHeader` — **kein Passwort im Code**),
|
||||
`registry_pfad()` als gemeinsame Dateisuche über alle Audio-Endungen.
|
||||
- `handle_delete()` räumt die Datei ab, sobald kein Konto sie mehr aktiv
|
||||
hat — der Registry-**Eintrag** bleibt aber stehen, sonst verlöre
|
||||
`/list` den Grabstein und andere Geräte bekämen den Titel als Zombie
|
||||
zurück.
|
||||
- Neu: `scripts/melo_cloud_migriere_registry.py` (einmalige Rückverknüpfung)
|
||||
und `scripts/test_melo_cloud_navidrome.py` (Durchlauf-Test).
|
||||
- App: `MeloCloudService.herunterladen()` gibt die geschriebene Datei
|
||||
zurück und leitet die Endung aus dem Inhaltstyp ab (`endungFuer`);
|
||||
`loeschBremseGreift()` in `sync_service.dart`.
|
||||
- ✅ **Getestet:** 276 Tests grün (9 neue) plus ein Durchlauf gegen den
|
||||
echten Server: Upload → Registry + Navidrome (ein Hardlink) → Navidrome
|
||||
liest ein → Löschen entfernt beides, Grabstein bleibt.
|
||||
|
||||
### 🔊 Lokale Lieder spielen wieder + Abgleich zwischen Handy und Server (2026-08-21)
|
||||
|
||||
- ▶️ **Behoben: Musik vom Handy war nicht abspielbar.** Titel, die auf dem
|
||||
|
||||
Reference in New Issue
Block a user