Audiolib e3e6492b1f Make matching debuggable + fix metadata search blockers
DNB rewrite:
- Multiple query strategies with fallback (title+author+mat=ton →
  title+author → title+mat=ton → title-only → fulltext). Returns on
  first hit. Most German audiobooks aren't tagged mat=ton in DNB,
  which was killing all searches.
- Strip CQL wildcard chars (?, *, <, >, =, /, quotes) from search
  terms. The "???" in "Die drei ???" was breaking the CQL parser.
- Log HTTP status, body snippet on non-200, and numberOfRecords on
  every query so log shows exactly what DNB returned.
- Parse SRU diagnostic elements (DNB error messages buried in XML).
- Convert author/narrator from "Lastname, Firstname" to
  "Firstname Lastname" for consistency with other sources.

Matcher:
- Split series patterns: WITH_EPISODE (need digit) and SERIES_ONLY
  (just the series name). "Die drei ??? und der Fluch des Rubins"
  now properly detects "Die drei ???" as series even without folge#.
- New _build_search_title: removes ??? sequences, trailing parens,
  collapses whitespace, before sending to APIs.
- Manual search also passes through normalization. Logs source +
  hit count per query.

Debug endpoint:
- GET /api/items/match/debug?title=...&author=... returns raw results
  from all 4 sources with status, error messages, and full metadata.
- "Debug" button added in BookDetail — shows what each API actually
  returns inline, so the user can see if it's a search problem,
  parse problem, or threshold problem.
- "Cover aus Datei" button — triggers local cover extraction
  (folder.jpg or embedded artwork) on demand.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 18:34:49 +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%