Audiolib 7c8e98917d Show cover thumbnail + chapter count in match search results
Backend: After the parallel search, fetch get_release_details for the
top-3 MusicBrainz hits in parallel. MB's search response carries
neither cover_url nor tracklist, so without this nothing useful
would show for MB results. Other sources already include cover in
their search response and don't have chapter data anyway.

Adds chapterCount to every result (0 when unknown). For MB matches
that resolve to a release with a tracklist, this is the actual count
that would be created as Chapters on apply.

UI: Match results now render as a row with a 48px cover thumbnail on
the left, title + metadata in the middle, Apply button on the right.
Metadata line shows author, year, source, confidence, and chapter
count (highlighted in green when present). Broken cover URLs hide
gracefully via onError.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 20:54:41 +02:00

Audiolib

Selbst gehosteter Audiobook- und Podcast-Server, vollständig API-kompatibel mit Audiobookshelf (ABS) v2.x. Bestehende Audiobookshelf-Apps (iOS, Android, etc.) funktionieren ohne Änderungen.

Voraussetzungen

  • Docker und Docker Compose installiert
  • Audiodateien (MP3/WAV) auf dem Server verfügbar

Schnellstart

1. Repository klonen / Dateien vorbereiten

cd /opt/audiolib
cp .env.example .env

2. .env anpassen

Mindestens folgende Werte setzen:

JWT_SECRET=mein_langer_geheimer_zufallsstring
ADMIN_USERNAME=admin
ADMIN_PASSWORD=sicheres_passwort
AUDIOFILES_PATH=/pfad/zu/meinen/audiodateien

3. Starten

docker-compose up -d --build

Der Server ist dann erreichbar unter: http://<server-ip>:3000

4. Erste Schritte

  1. Öffne http://<server-ip>:3000 im Browser
  2. Melde dich mit den in .env gesetzten Admin-Daten an
  3. In der Audiobookshelf-App: Server-URL http://<server-ip>:3000 eintragen
  4. Library scannen: Admin → Libraries → Scan

Konfiguration

Alle Einstellungen werden über die .env-Datei konfiguriert:

Variable Standard Beschreibung
SERVER_PORT 3000 Externer Port
JWT_SECRET Unbedingt ändern! Langer zufälliger String
ADMIN_USERNAME admin Admin-Benutzername
ADMIN_PASSWORD changeme Unbedingt ändern!
AUDIOFILES_PATH ./audiofiles Pfad zu den Audiodateien (NAS-Mount möglich)
AUTO_MATCH_BOOKS true Automatisches Metadaten-Matching für Hörbücher
AUTO_MATCH_PODCASTS true Automatisches Matching für Podcasts
PODCAST_UPDATE_INTERVAL_HOURS 24 Wie oft Podcast-Feeds aktualisiert werden

Projektstruktur

audiolib/
├── backend/         Python/FastAPI Backend
│   └── app/
│       ├── models/      SQLAlchemy-Datenmodelle
│       ├── routers/     API-Endpoints
│       ├── schemas/     Pydantic-Schemas (ABS-kompatibel)
│       └── services/    Scanner, HLS, File Watcher, Matching
├── frontend/        React/Vite Web-Interface (Phase 8)
├── nginx/           Reverse-Proxy-Konfiguration
├── data/            Persistente Daten (DB, Cover, HLS-Cache)
└── docker-compose.yml

API-Kompatibilität

Implementierte ABS-Endpoints:

  • POST /login — Authentifizierung
  • GET /api/authorize — Token-Validierung + User/Libraries
  • GET /api/libraries — Library-Liste
  • GET /api/libraries/:id/items — Hörbücher/Podcasts einer Library
  • GET /api/items/:id — Einzelnes Item mit Metadaten
  • GET /api/items/:id/cover — Cover-Bild
  • POST /api/items/:id/play — HLS-Streaming starten
  • POST /api/playback-session/:id/sync — Fortschritt synchronisieren
  • GET /api/me — User-Profil mit Fortschritt
  • PATCH /api/me/progress/:id — Hörfortschritt setzen
  • POST /api/me/bookmark/:id — Lesezeichen setzen
  • GET /api/users — User-Verwaltung (Admin)
  • GET /api/settings — Server-Einstellungen

Entwicklung

Backend lokal starten (ohne Docker)

cd backend
pip install -r requirements.txt
cp ../.env.example .env
uvicorn app.main:app --reload --port 8000

Frontend lokal starten

cd frontend
npm install
npm run dev

Geplante Features (nächste Phasen)

  • Phase 5: Matching-Engine Hörbücher (MusicBrainz, OpenLibrary, Google Books)
  • Phase 6: Matching-Engine Podcasts (iTunes, Podcastindex)
  • Phase 7: Vollständiger Podcast-Support (RSS-Feeds, Episoden)
  • Phase 8: Vollständiges Web-Interface mit Player
  • Phase 9: Web-Player mit Kapitelnavigation, Lesezeichen, Sleep-Timer

Lizenz

MIT

Description
No description provided
Readme 418 KiB
Languages
Python 57.1%
TypeScript 39.9%
Shell 2.1%
JavaScript 0.3%
Dockerfile 0.2%
Other 0.4%