Audiolib 0824894a7f Read ID3 tags during scan — fixes 'Folge 114 Die Villa der Toten' problem
Diagnosis from connectivity check: 4/5 APIs reachable (only Google Books
rate-limited). So the network is fine — the search title was the problem.
'Folge 114 Die Villa der Toten' isn't indexed under that name anywhere.
The MP3 itself has the real metadata in ID3 tags (album, artist, year).

Scanner now reads ID3/Vorbis/MP4 tags from the first audio file:
- album → item.title
- albumartist / composer / artist → item.author
- date → publish_year
- organization / publisher → publisher
- language → language
- genre → genres
- artist (heuristic) → series, if it doesn't appear in album title

Parent folder name → series hint (skipped if it's a library root).

Only fills empty fields, never overwrites manually edited or matched data.
Runs on new items AND on re-scan for items without an active match.

Search title normalization improved: 'Folge 123 - X' / 'Band 7: Y' etc.
prefixes and infixes get stripped so APIs see the actual episode title.

New endpoint POST /api/items/{id}/extract-tags + 'Tags lesen' button in
BookDetail — triggers tag extraction on demand for existing items.
Returns before/after diff so user can see what was filled in.

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