djdembeck
m4b-merge
Python

A Python-based CLI tool that standardizes audiobook files with clean metadata, cover art, and structured chapters, sourced from Audible. Essential for achieving organized and high-quality audiobook files.

Last updated Jun 6, 2026
87
Stars
14
Forks
17
Issues
0
Stars/day
Attention Score
61
Language breakdown
No language data available.
Files click to expand
README

m4b-merge

[Status]() GitHub Issues GitHub Pull Requests License PyPI PyPI - Python Version Python package CodeFactor Grade PyPI - Downloads

A CLI tool which outputs consistently sorted, tagged, single m4b files regardless of the input.

📝 Table of Contents

🧐 About

m4b-merge was originally part of Bragi Books, but was split apart to allow savvy users to automate its usage in more advanced ways. Some of the things m4b-merge offers are:
  • Accepts single and multiple mp3, m4a and m4b files.
  • mp3s are converted to m4b. m4a/m4b files are edited/merged without conversion.
  • Matches existing bitrate and samplerate for target file conversions.
  • Final files moved to /output/Author/Book/Book: Subtitle.m4b format.
  • Moves finished files into done folder in input directory.
Metadata provided by audnexus:
  • Title, authors, narrators, description, series, genres, release year - written as tags.
  • Chapter times/titles (only when input is m4b or a single mp3) - written as tags and chapters.txt.
  • High resolution (2000x2000 or greater) cover art - embedded into output file.

🏁 Getting Started

Prerequisites

You can either install this project via pip directly or run it prepackaged in Docker:
  • If installing directly on your system, you'll need to install m4b-tool and it's dependants from the project's readme
  • If using Docker, all prerequisites are included in the image.

Installing

For a pip installation

Simply run
pip install m4b-merge

For a Docker installation

You'll need to specify input/output volumes in the run command for easy use later:
docker run --name=merge -v /path/to/input:/input -v /path/to/output:/output ghcr.io/djdembeck/m4b-merge:main
You may also specify the user and group to run as with env variables:
-e UID=99 -e GID=100

🔧 Running the tests

  • Run pip install pytest
  • To run all tests, run pytest from inside this project directory.
  • To run a single test, run pytest tests/test_NAME.py

🎈 Usage

Workflow

The process is simple
  • Pass the file as input via -i FILE.ext or folder -i DIR/
  • Enter the ASIN (found on audible.com) when prompted.
  • Depending on necessary conversions, the process will take between 5 seconds and 5-10 minutes.

CLI usage

usage: m4b-merge [-h] [--apiurl APIURL] [--completeddirectory COMPLETEDDIRECTORY] -i INPUTS [INPUTS ...] [--loglevel LOGLEVEL]
                 [--numcpus NUMCPUS] [-o OUTPUT]

m4bmerge cli

optional arguments:
  -h, --help            show this help message and exit
  --apiurl APIURL     Audnexus mirror to use
  --completeddirectory COMPLETEDDIRECTORY
                        Directory path to move original input files to
  -i INPUTS [INPUTS ...], --inputs INPUTS [INPUTS ...]
                        Input paths to process
  --loglevel LOGLEVEL
                        Set logging level
  --numcpus NUMCPUS   Number of CPUs to use
  -o OUTPUT, --output OUTPUT
                        Output directory
  -p PATHFORMAT, --pathformat PATH_FORMAT
                        Structure of output path/naming.Supported terms: author, narrator, seriesname, seriesposition, subtitle, title, year

When installed via pip, you can run inputs like so

m4b-merge -i /path/to/file.mp3
Or for multiple inputs
m4b-merge -i /path/to/file.mp3 /dir/ /path/to/other/file

On Docker, you can run inputs like so

docker run -it merge m4b-merge -i /input/file.mp3
For a folder of multiple audio files, simply pass the folder itself as an input, such as -i /input/dir

⛏️ Built Using

✍️ Authors

🎉 Acknowledgements

🔗 More in this category

© 2026 GitRepoTrend · djdembeck/m4b-merge · Updated daily from GitHub