Files
Audiolib/frontend/src/api/items.ts
Audiolib 52c10a7518 Phase 5-9: Matching-Engine, Podcast-Support, Web-Interface + Player
Backend:
- Matching-Orchestrator mit deutschen Serien-Patterns (drei ???, TKKG, ...)
- Vollständige MusicBrainz-Integration (Tracklist → Kapitel, Cover Art Archive)
- OpenLibrary + Google Books als Fallback-Quellen
- Auto-Accept (≥0.75) vs zu_prüfen (0.5-0.75) vs kein Match
- Manuelles Matching: GET /api/items/:id/match/search, POST apply
- RSS-Feed-Manager: feedparser, iTunes Search, periodisches Update
- APScheduler für Podcast-Feed-Updates (konfigurierbares Intervall)
- Podcast-Router: Feed-URL setzen, Episoden, Feed-Suche
- HLS: FFmpeg läuft als Background-Task, wartet auf ersten Segment
- main.py: APScheduler + neue Router eingebunden

Frontend (React + Vite + Tailwind + HLS.js):
- Login-Seite mit Fehlerbehandlung
- Library-Seite: Grid/Listen-Ansicht, Suche, Tag-Filter, Pagination, Scan
- BookCard: Cover, Fortschrittsbalken, zu_prüfen Badge, Quick-Play
- BookDetail: Metadaten, Matching-Panel, Kapitel-Liste, Lesezeichen
- AudioPlayer: HLS.js, Kapitel-Marker auf Fortschrittsbalken, Speed,
  Sleep-Timer, Lesezeichen, Keyboard-Shortcuts (Space/Arrows)
- MiniPlayer: persistent an Fußzeile, expandierbar
- PodcastDetail: Feed-URL, iTunes-Suche, Episoden-Liste
- Admin-Panel: Benutzer/Bibliotheken/Einstellungen verwalten
- App.tsx: React Router, Auth-Guard, Player-Overlay

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-26 13:11:04 +02:00

31 lines
1.1 KiB
TypeScript

import api from './client'
export const getItem = (id: string) =>
api.get(`/api/items/${id}`).then((r) => r.data)
export const updateItem = (id: string, data: object) =>
api.patch(`/api/items/${id}`, data).then((r) => r.data)
export const deleteItem = (id: string) =>
api.delete(`/api/items/${id}`).then((r) => r.data)
export const startPlayback = (id: string, body?: object) =>
api.post(`/api/items/${id}/play`, body || {}).then((r) => r.data)
export const syncSession = (sessionId: string, data: object) =>
api.post(`/api/playback-session/${sessionId}/sync`, data).then((r) => r.data)
export const closeSession = (sessionId: string) =>
api.delete(`/api/playback-session/${sessionId}`).then((r) => r.data)
export const searchMatch = (id: string, q?: string) =>
api.get(`/api/items/${id}/match/search`, { params: q ? { q } : {} }).then((r) => r.data)
export const applyMatch = (id: string, match: object) =>
api.post(`/api/items/${id}/match/apply`, match).then((r) => r.data)
export const triggerMatch = (id: string) =>
api.post(`/api/items/${id}/match`).then((r) => r.data)
export const coverUrl = (id: string) => `/api/items/${id}/cover`