An audiobook library cleanup & management app, written as a frontend for web use of m4b-merge.
Bragi - (god of poetry in Norse mythology): Bragibooks provides a minimal and straightforward webserver that you can run remotely or locally on your server. Since Bragibooks runs in a docker, you no longer need to install dependencies on whichever OS you are on. You can
Some basics of what Bragi does:
- Merge multiple files
- Convert mp3(s)
- Cleanup existing data on an m4b file
- More features on m4b-merge's help page
Folder/file selection | ASIN input |
---|---|
![]() |
![]() |
Folder/file selection | Post-proccess overview |
---|---|
![]() |
![]() |
You can either install this project directly or run it prepackaged in Docker.
- All prerequisites are included in the image.
- You'll need to install m4b-tool and it's dependants from the project's readme
- Run
pip install -r requirements.txt
from this project's directory.
To run Bragibooks as a container, you need to pass some paramaters in the run command:
Parameter | Function |
---|---|
-v /path/to/input:/input |
Input folder |
-v /path/to/output:/output |
Output folder |
-v /appdata/bragibooks/config:/config |
Persistent config storage |
-p 8000:8000/tcp |
Port for your browser to use |
-e LOG_LEVEL=WARNING |
Choose any logging level |
-e DEBUG=False |
Turn django debug on or off (default False) |
-e UID=99 |
User ID to run the container as (default 99) |
-e GID=100 |
Group ID to run the container as (default 100) |
-e CELERY_WORKERS=1 |
The number or celery workers for processing books (default 1) |
-e CSRF_TRUSTED_ORIGINS=https://bragibooks.mydomain.com |
Domains to trust if bragibooks is hosted behind a reverse proxy. |
Which all together should look like:
docker run --rm -d --name bragibooks -v /path/to/input:/input -v /path/to/output:/output -v /appdata/bragibooks/config:/config -p 8000:8000/tcp -e LOG_LEVEL=WARNING ghcr.io/djdembeck/bragibooks:main
version: '3'
services:
bragi:
image: ghcr.io/djdembeck/bragibooks:main
container_name: bragibooks
environment:
- CSRF_TRUSTED_ORIGINS=https://bragibooks.mydomain.com
- LOG_LEVEL=INFO
- DEBUG=False
- UID=1000
- GID=1000
volumes:
- path/to/config:/config
- path/to/input:/input
- path/to/output/output:/output
- path/to/done:/done
ports:
- 8000:8000
restart: unless-stopped
- Copy static assets to project folder:
python manage.py collectstatic
- Create the database:
python manage.py migrate
- Run the celery worker for processing books:
celery -A bragibooks_proj worker \ --loglevel=info \ --concurrency 1 \ -E
- Run the web server:
gunicorn bragibooks_proj.wsgi \ --bind 0.0.0.0:8000 \ --timeout 1200 \ --worker-tmp-dir /dev/shm \ --workers=2 \ --threads=4 \ --worker-class=gthread \ --reload \ --enable-stdio-inheritance
The Bragibooks process is a linear, 3 step process:
- Select input - Use the file multi-select box to choose which books to process this session, and click next.
- Submit ASINs - Bragi will auto search for the audiobook data on Audible.com (US only). If the data found is incorrect you can do a custom search to find the correct title and then submit for processing.
- Wait for books to finish processing. This can take anywhere from 10 seconds to a few hours, depending on the number and type of files submitted. This will be done in the background.
- Books page - Page where you can see the data assigned to each book after it has finished processing. You can also check the status of the books still being processed.
- Django - Server/web framework
- Celery - Task queue and worker
- Bulma - Frontend CSS framework
- audnexus - API backend for metadata
- m4b-merge - File merging and tagging
@djdembeck - Idea & Initial work
Thanks goes to these wonderful people (emoji key):
Koby Huckabee ๐ป ๐ค ๐ |
Andreas ๐ง |
This project follows the all-contributors specification. Contributions of any kind welcome!