- Replace the Python implementation with a Go module compiling to a single static binary (no Python/pip runtime dependency) - internal/tonieapi: minimal, dependency-light HTTP client for the TonieCloud REST API (login, households, creative tonies, file upload via presigned S3 request, chapter add/sort/clear) - internal/config: YAML-based mapping of local playlist folders to Kreativ-Tonies, credentials never stored - internal/syncer: diff/apply logic (upload new tracks, prune removed chapters, reorder to match local file order), built against a TonieClient interface for testability - cmd/toni-sync: Cobra CLI with `tonies list`, `config add/list/remove`, `sync [NAME|--all] [--dry-run]` - Unit tests for config persistence and syncer plan/apply logic Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
123 lines
3.2 KiB
Markdown
123 lines
3.2 KiB
Markdown
# toni-sync
|
|
|
|
Ein CLI-Tool zur Verwaltung von Kreativ-Tonies: Es synchronisiert lokale
|
|
Audio-Ordner (z. B. exportierte Deezer-Playlists) automatisch zu den
|
|
passenden Kreativ-Tonies über die inoffizielle TonieCloud-API. Geschrieben
|
|
in Go, kompiliert zu einer einzigen statischen Binary - keine Laufzeit-
|
|
Abhängigkeiten (kein Python/pip nötig).
|
|
|
|
> **Hinweis:** toni-sync lädt selbst keine Musik von Deezer herunter. Das
|
|
> Herunterladen/Umgehen von DRM-geschützten Streams verstößt gegen die
|
|
> Nutzungsbedingungen von Deezer und ggf. gegen Urheberrecht. Lege deine
|
|
> bereits legal exportierten Audiodateien einfach in die konfigurierten
|
|
> lokalen Ordner - toni-sync kümmert sich nur um den Abgleich mit der
|
|
> TonieCloud.
|
|
|
|
## Installation
|
|
|
|
Benötigt wird nur ein Go-Toolchain (>= 1.21) zum Bauen - danach ist das
|
|
Ergebnis eine einzelne Binary ohne weitere Abhängigkeiten:
|
|
|
|
```bash
|
|
go build -o toni-sync ./cmd/toni-sync
|
|
./toni-sync --help
|
|
```
|
|
|
|
Oder direkt installieren (landet in `$(go env GOPATH)/bin`):
|
|
|
|
```bash
|
|
go install ./cmd/toni-sync
|
|
```
|
|
|
|
## Anmeldedaten
|
|
|
|
toni-sync benötigt deine TonieCloud-Zugangsdaten (dieselben wie in der
|
|
Tonies-App). Sie werden **nicht** gespeichert, sondern bei jedem Aufruf
|
|
über Umgebungsvariablen oder interaktiven Prompt abgefragt:
|
|
|
|
```bash
|
|
export TONI_SYNC_USERNAME="you@example.com"
|
|
export TONI_SYNC_PASSWORD="********"
|
|
```
|
|
|
|
Alternativ: `--username`/`--password` Flags bei `tonies list` und `sync`.
|
|
|
|
## Nutzung
|
|
|
|
### 1. Household- und Tonie-IDs herausfinden
|
|
|
|
```bash
|
|
toni-sync tonies list
|
|
```
|
|
|
|
Beispielausgabe:
|
|
|
|
```
|
|
Household: Familie Müller [id=abcd-1234]
|
|
- Peppa Wutz [id=ef01-5678] (12 chapters, 3600s)
|
|
- Gute-Nacht-Geschichten [id=9876-4321] (0 chapters, 0s)
|
|
```
|
|
|
|
### 2. Playlist <-> Toni Mapping konfigurieren
|
|
|
|
```bash
|
|
toni-sync config add \
|
|
--name peppa-wutz \
|
|
--household-id abcd-1234 \
|
|
--tonie-id ef01-5678 \
|
|
--folder ~/Musik/deezer-export/peppa-wutz \
|
|
--playlist-ref "https://www.deezer.com/playlist/XXXXXXXXX"
|
|
```
|
|
|
|
Weitere Kommandos:
|
|
|
|
```bash
|
|
toni-sync config list
|
|
toni-sync config remove peppa-wutz
|
|
```
|
|
|
|
Konfiguration wird standardmäßig in `~/.config/toni-sync/config.yaml`
|
|
gespeichert (überschreibbar via `--config-path` oder `TONI_SYNC_CONFIG`).
|
|
|
|
### 3. Synchronisieren
|
|
|
|
Lege deine (legal exportierten) Audiodateien in den konfigurierten Ordner,
|
|
z. B. `01 - Track.mp3`, `02 - Track.mp3`, ... - die alphabetische
|
|
Dateireihenfolge bestimmt die Kapitelreihenfolge auf dem Tonie.
|
|
|
|
```bash
|
|
# einzelnes Mapping
|
|
toni-sync sync peppa-wutz
|
|
|
|
# alle Mappings
|
|
toni-sync sync --all
|
|
|
|
# nur anzeigen, was sich ändern würde
|
|
toni-sync sync --all --dry-run
|
|
```
|
|
|
|
`sync` lädt neue Dateien hoch, entfernt Kapitel, die lokal nicht mehr
|
|
existieren (abschaltbar via `--no-prune` bei `config add`), und sortiert
|
|
die Kapitel passend zur lokalen Dateireihenfolge.
|
|
|
|
## Unterstützte Audioformate
|
|
|
|
`.mp3`, `.m4a`, `.aac`, `.ogg`, `.flac`, `.wav`
|
|
|
|
## Projektstruktur
|
|
|
|
```
|
|
cmd/toni-sync/ CLI-Einstiegspunkt (Cobra-Kommandos)
|
|
internal/tonieapi/ Eigener, minimaler TonieCloud-API-Client
|
|
internal/config/ Laden/Speichern der Playlist<->Toni-Mappings (YAML)
|
|
internal/syncer/ Diff-/Apply-Logik zwischen lokalem Ordner und Tonie
|
|
```
|
|
|
|
## Entwicklung / Tests
|
|
|
|
```bash
|
|
go build ./...
|
|
go vet ./...
|
|
go test ./...
|
|
```
|