A web UI for automatically organising your Audiobookshelfā library. Reads your metadata directly from ABS, renames audio files consistently, and reorganises your folders into a clean hierarchy ā all with a live preview before anything is touched.
curl -O https://raw.githubusercontent.com/Donald-Win/abs-tidy-library/main/compose.yaml
volumes:
- /your/audiobooks:/library # same host path as your ABS compose (see note below)
- /any/config/folder:/config # any persistent folder for settings
environment:
ABS_SERVER_URL: "http://192.168.1.100:13378" # LAN IP ā used for API calls
ABS_EXTERNAL_URL: "http://192.168.1.100:13378" # browser-facing URL ā used for deep links
ABS_TOKEN: "your-api-key-here" # from ABS ā Settings ā API Keys
docker compose up -d
Open http://your-server:5050ā ā if your env vars are set it will connect automatically. Hit Scan Library.
Volume path must match your ABS setup
The left side of the audiobooks volume mount must point to the same host directory that ABS is already serving. The right side (container path) can be anything, but must match LIBRARY_PATH.
# Your ABS compose might have:
- /media/Audiobooks:/audiobooks
# So this tool needs the same left side:
- /media/Audiobooks:/library
Use your LAN IP, not localhost
Even if ABS is running on the same machine, containers can't reach each other via localhost or 127.0.0.1. Use the actual LAN IP of your server (e.g. 192.168.1.100).
Running behind a reverse proxy (Caddy, Nginx, etc.)
If ABS is accessed via a hostname like http://abs.internal, set ABS_SERVER_URL to the internal container address for API calls (e.g. http://audiobookshelf:80) and ABS_EXTERNAL_URL to the browser-facing address (e.g. http://abs.internal). Without this, deep links to books will fail with a DNS error.
ABS_SERVER_URL: "http://audiobookshelf:80" # internal ā for API calls
ABS_EXTERNAL_URL: "http://abs.internal" # external ā for browser links
The API key needs to be from an admin account The tool reads library metadata, updates book metadata, and triggers rescans. A non-admin token won't have access to do this.
LIBRARY_PATH must match your volume mount
If you mount as :/library, set LIBRARY_PATH: "/library". They must agree.
The config mount must be a folder, not a file Docker will create it automatically if it doesn't exist yet, as long as the path doesn't conflict with an existing file.
| Variable | Required | Description |
|---|---|---|
ABS_SERVER_URL | Yes | Internal ABS address used for API calls. Use LAN IP or container name ā not localhost |
ABS_EXTERNAL_URL | Recommended | Browser-facing ABS address used for deep links. Set this if you use a reverse proxy or custom domain. Falls back to ABS_SERVER_URL if not set |
ABS_TOKEN | Yes | Admin API key from ABS ā Settings ā API Keys |
ABS_LIBRARY_ID | Optional | Auto-selects a library on load. Find it in ABS ā Settings ā Libraries ā click your library ā copy the ID from the URL |
LIBRARY_PATH | Optional | Path inside the container where books are mounted. Must match your volume mount. Default: /library |
CONFIG_PATH | Optional | Where naming config is saved. Default: /config/naming.json |
Templates are configured in the Settings drawer and save automatically. Available tokens:
| Token | Example |
|---|---|
{Author} | Brandon Sanderson |
{Title} | The Final Empire |
{Series} | Mistborn |
{Series-Index} | 01 |
{Narrator} | Michael Kramer |
{Year} | 2006 |
{Part-Index} | 02 |
{Part-Total} | 12 |
{Subtitle} {Publisher} {Genre} {Language} {ISBN} {ASIN} | if set in ABS |
Default output looks like:
Brandon Sanderson/
āāā The Way of Kings/
ā āāā Brandon Sanderson - The Way of Kings.m4b
āāā Mistborn/
āāā 01 The Final Empire/
ā āāā Brandon Sanderson - Mistborn 01 - The Final Empire.m4b
āāā 02 The Well of Ascension/
āāā Brandon Sanderson - Mistborn 02 - The Well of Ascension (Part 01 of 08).m4b
āāā Brandon Sanderson - Mistborn 02 - The Well of Ascension (Part 02 of 08).m4b
Nothing is moved until you explicitly click Apply.
If you hit permission errors, add a user line matching your host user:
services:
abs-tidy-library:
user: "1000:1000" # run `id` on your host to find your UID:GID
docker compose pull && docker compose up -d
MIT ā see LICENSEā .
Content type
Image
Digest
sha256:811bb7ef2ā¦
Size
52.4 MB
Last updated
7 months ago
docker pull donaldwin/abs-tidy-library