No description
- HTML 53.1%
- Python 41.8%
- Shell 2.8%
- JavaScript 1.2%
- Dockerfile 1.1%
| static | ||
| docker-compose.yml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| LICENSE | ||
| README.md | ||
| server.py | ||
Audiobook Uploader
A mobile-first PWA for uploading audiobook zip files from your phone. It
auto-extracts them, strips junk, and organizes everything into a clean
Author/Book/ folder structure. Single Flask app served by gunicorn, with a
minimal light/dark web UI.
Features
- Mobile-first PWA — add to the iOS home screen, runs fullscreen
- Light / dark theme — toggle in the header, remembered across sessions
- Step-by-step wizard — pick zip, choose author, name book, done
- Auto-extraction — strips the zip, removes junk (
.DS_Store,__MACOSX), flattens nested folders - Author management — lists existing authors, create new ones inline
- Library browser — all authors and books with file counts and sizes
- Delete — remove audiobooks with a confirmation sheet
- Zip preview — peeks inside the archive before upload
- Self-contained icons — PWA icons are rendered live by the server
Deploy
Edit the host library path in docker-compose.yml, then:
docker compose up -d
Open http://<server-ip>:5001.
docker-compose.yml
The host audiobook folder is bind-mounted into the container:
volumes:
- /mnt/decimus/audiobooks:/audiobooks # host path : container path
environment:
- PUID=1000 # match your host user so written files are owned correctly
- PGID=1000
- TZ=Europe/Berlin
Environment variables
| Variable | Default | Description |
|---|---|---|
AUDIOBOOKS_PATH |
/audiobooks |
Library path inside the container |
UPLOAD_TEMP_PATH |
/tmp/audiobook-uploads |
Temp dir for processing |
MAX_UPLOAD_SIZE_MB |
4096 |
Max upload size in MB |
PUID / PGID |
1000 |
Owner UID/GID for written files |
TZ |
UTC |
Timezone |
Common commands
docker compose logs -f # follow logs
docker compose up -d --build # rebuild + restart after changes
docker compose down # stop and remove the container
docker compose down only removes the container — your audiobooks on the host
bind-mount are never touched.
Tech
- Python 3 / Flask + flask-cors, served by gunicorn
- Vanilla HTML/CSS/JS frontend, no build step, minimal flat UI with dark mode
- PWA: manifest, service worker, server-rendered icons
License
MIT — see LICENSE.