wordarr

Sonarr/Radarr-Style Request- & Import-Manager für Ebooks, Comics/Mangas und Audiobooks.

Funktionsweise

  1. Anfragen: Im Web-UI per Titel/Autor/ISBN suchen (Ebooks: Open Library · Audiobooks: Audible · Manga: AniList) oder manuell anlegen. Beim Request wählst du die Ziel-Library (z.B. deine 8 Bookorbit-Libraries oder die 3 Audiobookshelf-Libraries english/adult/kids). Der Titel erscheint als Missing. Gehört ein Audiobook-Treffer zu einer Serie, legt „Ganze Serie…" alle Folgen auf einmal an (Folgennummer + echter Titel von Audible, optional auf einen Folgenbereich eingegrenzt). Audible hat keine Serien-Abfrage — wordarr sammelt die Folgen über mehrere Suchläufe ein; sollte eine fehlen, zeigt der Dialog die Lücke an.
  2. Download-Ordner: wordarr überwacht keinen Downloader aktiv — du legst Dateien selbst in den Download-Ordner (/mnt/downloads).
  3. Import missing: Im Tab Import den Ordner scannen. wordarr schlägt per Fuzzy-Matching Datei→Request-Zuordnungen vor (bei Serien zählt die Folgennummer im Ordnernamen plus der Serienname im Pfad, ??? und Fragezeichen gelten als dasselbe); du bestätigst oder korrigierst. Über 🔍 lässt sich zu einem Ordner direkt eine Anfrage suchen — eine führende Folgennummer (017 - Titel) wird dabei aus der Suchanfrage genommen, weil Audible sonst schlechter trifft, und stattdessen als Band/Folge übernommen. Was Audible gar nicht führt (Live-Hörspiele, Fan-Editionen), legst du im selben Dialog unter Nicht bei Audible? Manuell anlegen an — Titel und Folge sind aus dem Ordnernamen vorbelegt, die Serie bleibt für den nächsten Eintrag stehen. Beim Import wird die Datei nach dem Namensschema der Library umbenannt und verschoben. Die Einträge werden einzeln abgearbeitet: die laufende Zeile ist blau markiert (die Ansicht blättert ihr nach), fertige werden grün, fehlgeschlagene rot mit der Fehlermeldung als Tooltip, und unten läuft ein Balken über alle Einträge. Erfolgreich importierte Zeilen verschwinden nach 15 Sekunden aus der Tabelle (die Liste darunter behält sie); Fehler und Konflikte bleiben stehen, bis du sie erledigt hast. Für den nächsten Durchgang erneut scannen.

Zum Auswählen gibt es Alle mit Vorschlag auswählen, Diese Seite auswählen (nur die gerade sichtbaren 25, alles andere wird abgewählt — praktisch, um in Etappen zu importieren) und Alle abwählen. Ordner mit mehreren Audio-Dateien werden als ein Audiobook behandelt (Titel - Part 01.mp3, …). Enthält ein Ordner dagegen je Datei ein eigenes Buch (eine Reihe als Einzeltitel gekauft), teilt ✂️ ihn in einzelne Einträge auf; wordarr markiert solche Ordner mit n Titel?, wenn die Dateinamen verschiedene Titel tragen und jede Datei groß genug für ein ganzes Buch ist. Die Checkbox Ordner als Einzeldateien behandeln macht dasselbe für den gesamten Scan. Auch Ordner, die in Disc-Unterordner (CD, CD1, CD 2, Disc 3, Teil 1) aufgeteilt sind, gelten als ein Audiobook — der Ordnername darüber liefert den Titel, die Parts werden über alle Discs hinweg durchnummeriert. Unterordner ohne Audio (Cover, Scans, Booklets) werden dabei ignoriert. Mehrteiler in Unterordnern (Teil A/Teil B, A - Titel/B - Titel) zählen ebenfalls als ein Hörbuch. Liegen die Teile dagegen nebeneinander (100 - Toteninsel Teil 1, … Teil 2, …), markierst du sie und klickst Ausgewählte zusammenfassen — sie werden als ein Hörbuch mit durchlaufenden Parts importiert (✂️ löst das wieder auf). Liegen die Dateien einer bereits importierten Anfrage nicht mehr in der Library (zurück in den Download-Ordner verschoben, um sie nach einem neuen Namensschema abzulegen), gilt sie wieder als offen: der Scan schlägt sie ganz normal vor (mit markiert) und der Import legt sie neu ab. Sind mehrere Einträge derselben Anfrage zugeordnet, fragt wordarr vor dem Import nach: zusammenfassen (bei einem Mehrteiler) oder überspringen — dann werden nur die betroffenen Einträge zurückgestellt, rot markiert und über den Filter Nur Konflikte wiedergefunden, während alles andere importiert wird. Ohne diese Abfrage würde nur der erste Eintrag importiert und der Rest scheitern. Fehlt einem bereits importierten Hörbuch später ein Teil, wählst du es im Zuordnungs-Dropdown unter Bereits importiert — Teile anhängen (↩︎); die neuen Dateien werden hinten angehängt und alle Tracks neu getaggt.

Setup (Docker)

docker compose up -d --build
# Web-UI: http://localhost:8787

docker-compose.yml anpassen: /mnt/downloads und die Library-Roots so mounten, dass die in wordarr konfigurierten root_path-Werte im Container existieren. Download-Ordner und Libraries sollten auf demselben Mount liegen, sonst wird das Verschieben zum Kopieren+Löschen (funktioniert, dauert nur länger).

Env Default Beschreibung
WORDARR_DOWNLOAD_DIR /mnt/downloads Gescannter Download-Ordner
WORDARR_CONFIG_DIR /config Ablage der SQLite-DB

Metadaten korrigieren

Audible führt Reihen manchmal anders, als man sie ablegen möchte (Harry Potter steht dort unter Wizarding World, und das landet über {Series} im Ordnernamen). Deshalb:

  • Vor dem Anlegen: Im Import-Dialog übernimmt ✎ an einem Treffer dessen Felder (Titel, Autor, Serie, Band) in die Eingabemaske — Sprecher, Cover, Jahr und ASIN bleiben erhalten. Erst Anlegen & verbinden erzeugt die Anfrage.
  • Danach: Im Tab Missing bzw. Importiert öffnet ein Klick auf die Karte alle Felder. Speichern & neu taggen schreibt die ID3-Tags neu, Speichern & neu ablegen wendet das Namensschema der Library auf die bereits verschobenen Dateien an — der Ordner wird also umbenannt bzw. verschoben, Cover ziehen mit um und leer gewordene Ordner verschwinden. Ein belegter Zielordner bricht den Vorgang ab, statt etwas zu überschreiben — dasselbe gilt beim Import selbst: Rendern zwei Titel nach dem Namensschema denselben Pfad (etwa zwei Bände mit identischem Titel bei einem Schema ohne {Volume}), scheitert der zweite mit einer Meldung, statt den ersten zu überschreiben.

Dateinamen mit kaputter Kodierung

Linux erlaubt in Dateinamen beliebige Bytes, ältere Rips tragen ihre Umlaute deshalb manchmal als Latin-1 (Die Fu\xdfball-Falle statt UTF-8). Python liest solche Namen mit Ersatzzeichen ein, die sich nicht als JSON ausliefern lassen — früher scheiterte daran der gesamte Scan mit einem 500er. wordarr zeigt betroffene Einträge jetzt mit an und überträgt den Pfad verlustfrei im Hintergrund, sodass Scan und Import normal funktionieren. Beim Import bekommt die Datei ohnehin den Namen aus dem Schema — danach ist der Name sauber.

Sprachen

Jede Library kann eine Sprache tragen (Deutsch/Englisch, Default: egal). Audible liefert zu jedem Titel die Sprache mit, deshalb zeigt die Suche für eine englische Library nur englische Ausgaben und für eine deutsche nur deutsche — praktisch, wenn dieselbe Reihe in beiden Sprachen in getrennten Libraries liegt (A Song of Ice and Fire vs. Das Lied von Eis und Feuer). Gesucht wird dann auch auf dem passenden Marktplatz (audible.com bzw. audible.de), was die Trefferqualität deutlich hebt. Im Tab Suche lässt sich die Sprache zusätzlich frei filtern; im Import-Dialog kommt sie automatisch aus der gewählten Ziel-Library.

Namensschemata

Pro Library konfigurierbar (Tab Libraries), Platzhalter: {Author} {Authors} {Narrator} {Narrators} {Title} {Year} {Series} {Volume}.

{Author} und {Narrator} nennen jeweils nur den ersten Namen, {Authors} und {Narrators} die vollständige Liste — bei einer Full-Cast-Produktion mit 20 Sprechern willst du Letzteres nicht im Ordnernamen. Fehlt ein Wert, verschwindet er samt Klammern und Trennzeichen: {Series}/{Volume} - {Title} ({Narrator}) wird für einen Einzeltitel ohne Sprecherangabe schlicht zu Titel.

Liegt dieselbe Ausgabe in mehreren Fassungen vor (Harry Potter mit Stephen Fry und als Full-Cast), gehört {Narrator} in den Ordnernamen — sonst kollidieren beide im selben Verzeichnis:

Harry Potter/01 - Philosopher's Stone (Stephen Fry)/
Harry Potter/01 - Philosopher's Stone (Hugh Laurie)/

Defaults:

  • Ebook: {Author}/{Title} ({Year}) / {Author} - {Title}
  • Audiobook: {Author}/{Title} / {Title}
  • Comic: {Series} / {Series} - Band {Volume}

Entwicklung

python3 -m venv .venv && .venv/bin/pip install -e '.[dev]'
.venv/bin/pytest
WORDARR_CONFIG_DIR=./config WORDARR_DOWNLOAD_DIR=/mnt/downloads .venv/bin/uvicorn wordarr.main:app --port 8787
S
Description
No description provided
Readme
1.1 MiB
2026-08-31 09:54:32 +02:00
Languages
Python 57.5%
JavaScript 32.1%
HTML 6.6%
CSS 3.7%
Dockerfile 0.1%