Awesome
<p align="center"> <a href="" rel="noopener"> <img width=200px height=200px src="../assets/logos/logo.png?raw=true" alt="Project logo"></a> </p> <h3 align="center">Bragibooks</h3> <div align="center"> <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-BADGE:END --> </div><p align="center"> An audiobook library cleanup & management app, written as a frontend for web use of <a href="https://github.com/djdembeck/m4b-merge">m4b-merge</a>. <br> </p>
📝 Table of Contents
🧐 About <a name = "about"></a>
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
Screens
Folder/file selection | ASIN input |
---|---|
Folder/file selection | Post-proccess overview |
---|---|
🏁 Getting Started <a name = "getting_started"></a>
You can either install this project directly or run it prepackaged in Docker.
Prerequisites
Docker
- All prerequisites are included in the image.
Direct (Gunicorn)
- 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.
Installing
Docker
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
Docker Compose
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
Direct Build (Gunicorn)
- 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
🎈 Usage <a name="usage"></a>
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.
⛏️ Built Using <a name = "built_using"></a>
- Django - Server/web framework
- Celery - Task queue and worker
- Bulma - Frontend CSS framework
- audnexus - API backend for metadata
- m4b-merge - File merging and tagging
✍️ Authors <a name = "authors"></a>
<img src="https://github.com/djdembeck.png?size=100"/>@djdembeck - Idea & Initial work
Contributors ✨
Thanks goes to these wonderful people (emoji key):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tbody> <tr> <td align="center" valign="top" width="14.28%"><a href="https://koby.huckabee.dev"><img src="https://avatars.githubusercontent.com/u/14910857?v=4?s=100" width="100px;" alt="Koby Huckabee"/><br /><sub><b>Koby Huckabee</b></sub></a><br /><a href="https://github.com/djdembeck/bragibooks/commits?author=AceTugboat" title="Code">💻</a> <a href="#ideas-AceTugboat" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/djdembeck/bragibooks/commits?author=AceTugboat" title="Documentation">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://pilabor.com"><img src="https://avatars.githubusercontent.com/u/2050604?v=4?s=100" width="100px;" alt="Andreas"/><br /><sub><b>Andreas</b></sub></a><br /><a href="#tool-sandreas" title="Tools">🔧</a></td> </tr> </tbody> </table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->This project follows the all-contributors specification. Contributions of any kind welcome!