# wordarr Request and import manager for **ebooks**, **comics/manga** and **audiobooks**, in the style of Sonarr/Radarr. Search metadata providers, keep a list of wanted titles, and move finished downloads into your library under a naming scheme of your choice. ## Deployment ```bash docker compose up -d --build # web UI: http://localhost:8787 ``` Mount `/mnt/downloads` and your library roots so that the `root_path` values configured in wordarr exist inside the container. Keep downloads and libraries on the same mount, otherwise moving turns into copy + delete. | Env | Default | Description | |---|---|---| | `WORDARR_DOWNLOAD_DIR` | `/mnt/downloads` | scanned download folder | | `WORDARR_CONFIG_DIR` | `/config` | location of the SQLite database | | `WORDARR_AUDIBLE_REGIONS` | `de,com` | Audible marketplaces, first ranks first | | `WORDARR_MUSICBRAINZ_UA` | see `metadata/musicbrainz.py` | user agent MusicBrainz requires | ## Usage 1. **Libraries** – create one per target folder with a media type, a naming scheme (`{Author}` `{Authors}` `{Narrator}` `{Narrators}` `{Title}` `{Year}` `{Series}` `{Volume}`) and optionally a language that filters the search. 2. **Search** – look up a title (ebooks: Open Library, audiobooks: Audible plus MusicBrainz, manga: AniList) and request it, or add it by hand. For a series, *Ganze Serie…* requests every episode at once. 3. **Import** – scan the download folder. wordarr suggests file→request matches, which you confirm or correct; entries can be merged, split, or turned into requests from their folder names. Importing renames and moves the files according to the library's scheme and writes audio tags. Imported titles can be edited afterwards; *Speichern & neu ablegen* re-applies the naming scheme to files already in the library. ## Development ```bash 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 ``` The browser tests in `tests/test_ui_dialogs.py` need `playwright` plus its chromium build and skip themselves when either is missing.