audiobookifier 2.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- audiobookifier-2.6.0/CHANGELOG.md +310 -0
- audiobookifier-2.6.0/LICENSE +674 -0
- audiobookifier-2.6.0/MANIFEST.in +12 -0
- audiobookifier-2.6.0/PKG-INFO +561 -0
- audiobookifier-2.6.0/README.md +504 -0
- audiobookifier-2.6.0/audiobookifier.egg-info/SOURCES.txt +85 -0
- audiobookifier-2.6.0/epub2tts_edge/__init__.py +270 -0
- audiobookifier-2.6.0/epub2tts_edge/audio_generator.py +767 -0
- audiobookifier-2.6.0/epub2tts_edge/audio_normalization.py +244 -0
- audiobookifier-2.6.0/epub2tts_edge/batch_processor.py +811 -0
- audiobookifier-2.6.0/epub2tts_edge/chapter_detector.py +1384 -0
- audiobookifier-2.6.0/epub2tts_edge/chapter_selector.py +215 -0
- audiobookifier-2.6.0/epub2tts_edge/config.py +249 -0
- audiobookifier-2.6.0/epub2tts_edge/content_filter.py +469 -0
- audiobookifier-2.6.0/epub2tts_edge/core/__init__.py +39 -0
- audiobookifier-2.6.0/epub2tts_edge/core/events.py +231 -0
- audiobookifier-2.6.0/epub2tts_edge/core/output_naming.py +242 -0
- audiobookifier-2.6.0/epub2tts_edge/core/pipeline.py +627 -0
- audiobookifier-2.6.0/epub2tts_edge/core/profiles.py +179 -0
- audiobookifier-2.6.0/epub2tts_edge/epub2tts_edge.py +1305 -0
- audiobookifier-2.6.0/epub2tts_edge/errors.py +212 -0
- audiobookifier-2.6.0/epub2tts_edge/job_manager.py +556 -0
- audiobookifier-2.6.0/epub2tts_edge/logger.py +97 -0
- audiobookifier-2.6.0/epub2tts_edge/mobi_parser.py +466 -0
- audiobookifier-2.6.0/epub2tts_edge/multi_voice.py +315 -0
- audiobookifier-2.6.0/epub2tts_edge/pause_resume.py +262 -0
- audiobookifier-2.6.0/epub2tts_edge/pronunciation.py +208 -0
- audiobookifier-2.6.0/epub2tts_edge/silence_detection.py +235 -0
- audiobookifier-2.6.0/epub2tts_edge/testing/__init__.py +11 -0
- audiobookifier-2.6.0/epub2tts_edge/testing/mock_tts.py +243 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/__init__.py +64 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/app.py +2055 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/handlers/__init__.py +9 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/handlers/event_adapter.py +281 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/models/__init__.py +6 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/models/preview_state.py +138 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/models/voice_status.py +69 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/panels/__init__.py +23 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/panels/file_panel.py +419 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/panels/jobs_panel.py +325 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/panels/log_panel.py +46 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/panels/preview_panel.py +894 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/panels/progress_panel.py +114 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/panels/queue_panel.py +89 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/panels/settings_panel.py +464 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/screens/__init__.py +6 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/screens/directory_browser.py +109 -0
- audiobookifier-2.6.0/epub2tts_edge/tui/screens/help_screen.py +104 -0
- audiobookifier-2.6.0/epub2tts_edge/voice_preview.py +655 -0
- audiobookifier-2.6.0/examples/pronunciation.json +44 -0
- audiobookifier-2.6.0/examples/pronunciation.txt +42 -0
- audiobookifier-2.6.0/examples/voice_mapping.json +19 -0
- audiobookifier-2.6.0/pyproject.toml +197 -0
- audiobookifier-2.6.0/requirements.txt +25 -0
- audiobookifier-2.6.0/setup.cfg +4 -0
- audiobookifier-2.6.0/setup.py +6 -0
- audiobookifier-2.6.0/tests/__init__.py +0 -0
- audiobookifier-2.6.0/tests/conftest.py +368 -0
- audiobookifier-2.6.0/tests/fixtures/__init__.py +9 -0
- audiobookifier-2.6.0/tests/fixtures/epub_factory.py +275 -0
- audiobookifier-2.6.0/tests/mocks/__init__.py +11 -0
- audiobookifier-2.6.0/tests/mocks/tts_mock.py +10 -0
- audiobookifier-2.6.0/tests/test_audio_normalization.py +281 -0
- audiobookifier-2.6.0/tests/test_batch_processor.py +349 -0
- audiobookifier-2.6.0/tests/test_chapter_detector.py +277 -0
- audiobookifier-2.6.0/tests/test_chapter_selector.py +224 -0
- audiobookifier-2.6.0/tests/test_config.py +266 -0
- audiobookifier-2.6.0/tests/test_content_filter.py +430 -0
- audiobookifier-2.6.0/tests/test_e2e_workflow.py +666 -0
- audiobookifier-2.6.0/tests/test_event_bus.py +333 -0
- audiobookifier-2.6.0/tests/test_external_constraints.py +92 -0
- audiobookifier-2.6.0/tests/test_integration.py +354 -0
- audiobookifier-2.6.0/tests/test_job_manager.py +455 -0
- audiobookifier-2.6.0/tests/test_mobi_parser.py +464 -0
- audiobookifier-2.6.0/tests/test_multi_voice.py +380 -0
- audiobookifier-2.6.0/tests/test_output_naming.py +312 -0
- audiobookifier-2.6.0/tests/test_packaging.py +94 -0
- audiobookifier-2.6.0/tests/test_pause_resume.py +222 -0
- audiobookifier-2.6.0/tests/test_pipeline.py +743 -0
- audiobookifier-2.6.0/tests/test_preview_export.py +352 -0
- audiobookifier-2.6.0/tests/test_profiles.py +248 -0
- audiobookifier-2.6.0/tests/test_pronunciation.py +302 -0
- audiobookifier-2.6.0/tests/test_silence_detection.py +299 -0
- audiobookifier-2.6.0/tests/test_test_mode.py +205 -0
- audiobookifier-2.6.0/tests/test_tts_connectivity.py +200 -0
- audiobookifier-2.6.0/tests/test_tts_params.py +128 -0
- audiobookifier-2.6.0/tests/test_tui_workflows.py +980 -0
- audiobookifier-2.6.0/tests/test_voice_preview.py +192 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Audiobookify will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [2.6.0] - 2026-07-24
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- **The PyPI distribution is now `audiobookifier`** (was `audiobookify`). The
|
|
14
|
+
`audiobookify` name on PyPI belongs to an account that is no longer accessible
|
|
15
|
+
and is frozen at 2.3.0; it is not this project and will not receive updates.
|
|
16
|
+
**Nothing users type changes** — `pip install audiobookifier` still provides the
|
|
17
|
+
`audiobookify`, `abfy`, `audiobookify-tui` and `abfy-tui` commands, and the
|
|
18
|
+
import package remains `epub2tts_edge`. The GitHub repository, the Docker image
|
|
19
|
+
(`ghcr.io/loganrooks/audiobookify`) and the CLI are all unchanged.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- **`--version` reported `0.0.0.dev0` after the rename.** Both version lookups
|
|
23
|
+
named the distribution literally, so they resolved against the unrelated
|
|
24
|
+
`audiobookify` project instead of this one, and fell back when it was absent.
|
|
25
|
+
The `all` extra self-referenced the same stale name, so
|
|
26
|
+
`pip install audiobookifier[all]` would have installed the foreign 2.3.0
|
|
27
|
+
package as a dependency — an install that succeeds while being silently wrong.
|
|
28
|
+
`tests/test_packaging.py` now pins all three, each verified to fail when
|
|
29
|
+
reverted. Note that a stale `audiobookify.egg-info/` in a working tree masks
|
|
30
|
+
this locally: it satisfies the old name, so delete it after pulling.
|
|
31
|
+
- **Live TTS was impossible: the `edge-tts` pin excluded every working release.**
|
|
32
|
+
`edge-tts>=6.1.0,<7.1.0` was written 2025-12-07 against a real breakage, but
|
|
33
|
+
upstream fixed it in 7.2.4 on **2025-12-11 — four days later**. The pin then
|
|
34
|
+
spent seven months as the sole cause of the outage it was meant to prevent,
|
|
35
|
+
while reading as vindicated each time it failed. Measured 2026-07-24 against
|
|
36
|
+
the live service: 7.0.2, 7.1.0 and 7.2.1 all get HTTP 403 on the synthesis
|
|
37
|
+
WebSocket; 7.2.4 and 7.2.8 return audio. The floor is now `>=7.2.4,<8`.
|
|
38
|
+
- **Error messages told users to downgrade into the broken range.** Both the
|
|
39
|
+
TTS failure handler and `TTSGenerationError` advised
|
|
40
|
+
`pip install 'edge-tts>=6.1.0,<7.1.0'`, which would break a working install.
|
|
41
|
+
They now advise upgrading to `>=7.2.4`. `_is_auth_or_ssl_error()` also
|
|
42
|
+
recognises 403, which is the status Microsoft actually returns.
|
|
43
|
+
- **Full conversion could never produce an audiobook.**
|
|
44
|
+
`ConversionPipeline.package_audiobook()` called `make_m4b()` with
|
|
45
|
+
`chapternames=`, `cover=` and `output=`, none of which that function accepts,
|
|
46
|
+
so every EPUB→M4B run died with `TypeError: make_m4b() got an unexpected
|
|
47
|
+
keyword argument 'chapternames'` at the packaging step. `audiobookify
|
|
48
|
+
book.epub` routes through this pipeline, so the primary documented workflow
|
|
49
|
+
was broken regardless of TTS. No test had ever called `make_m4b` — the only
|
|
50
|
+
reference in the suite was `assert make_m4b is not None`. Three consequences
|
|
51
|
+
of that code path never running are fixed at the same time: chapter markers
|
|
52
|
+
were never generated (`generate_metadata()` was not called), cover art was
|
|
53
|
+
silently dropped (`add_cover()` was not called), and `--normalize` /
|
|
54
|
+
`--trim-silence` were accepted but never applied.
|
|
55
|
+
- **Finished audiobooks were left in the job scratch directory.** Output stayed
|
|
56
|
+
in `~/.audiobookify/jobs/<id>/`, so the documented
|
|
57
|
+
`docker run --rm -v ./books:/books` workflow destroyed the result and the
|
|
58
|
+
bind mount received nothing. The M4B is now delivered next to the source file
|
|
59
|
+
(matching existing TUI behaviour), falling back to the job directory with a
|
|
60
|
+
warning when the destination is not writable.
|
|
61
|
+
- **Docker image was unusable.** `pyproject.toml` was never copied into the build
|
|
62
|
+
context, so `pip install -e .` fell back to the minimal `setup.py`, which
|
|
63
|
+
declares no `[project.scripts]`. The `audiobookify` console script was never
|
|
64
|
+
created and `ENTRYPOINT ["audiobookify"]` could not resolve. CI only ran
|
|
65
|
+
`docker build`, never `docker run`, so this was never caught.
|
|
66
|
+
- **`--test-mode` crashed for installed users.** `audio_generator.enable_test_mode()`
|
|
67
|
+
imported `MockTTSEngine` from the `tests` package, which is not distributed in
|
|
68
|
+
the wheel, raising `ModuleNotFoundError: No module named 'tests'`. The mock now
|
|
69
|
+
ships as `epub2tts_edge.testing`.
|
|
70
|
+
- **`IndexError` on chapters with no readable content.** `read_book()` indexed
|
|
71
|
+
`files[-1]` / `filenames[-1]` without checking for empty lists, so a chapter
|
|
72
|
+
with no paragraphs (or a whitespace-only paragraph) crashed the conversion.
|
|
73
|
+
Empty chapters now emit a silent placeholder segment, which also keeps segment
|
|
74
|
+
count aligned with `chapter_titles` in `generate_metadata()`.
|
|
75
|
+
- Documented `pip install ".[tui]"` and `pip install -e ".[all]"` referenced
|
|
76
|
+
extras that did not exist. Both are now defined in `pyproject.toml`.
|
|
77
|
+
|
|
78
|
+
### Added
|
|
79
|
+
- `external-constraints.toml` and `tests/test_external_constraints.py`: a registry
|
|
80
|
+
of decisions that depend on facts outside this repository, each recording the
|
|
81
|
+
claim, how to disprove it, the evidence, and an expiry date. The build fails
|
|
82
|
+
once a constraint passes its `recheck_after` without re-verification. The
|
|
83
|
+
edge-tts pin is the worked example of why — a constraint whose justification
|
|
84
|
+
has expired keeps enforcing itself with its original authority.
|
|
85
|
+
- Regression tests covering the pipeline→`make_m4b` call contract, chapter-title
|
|
86
|
+
propagation, output delivery location, and an ffmpeg-backed end-to-end test
|
|
87
|
+
that ffprobes the resulting M4B for ordered chapter markers.
|
|
88
|
+
- `--version` flag and `epub2tts_edge.__version__`, both sourced from installed
|
|
89
|
+
package metadata.
|
|
90
|
+
- Tag-driven release pipeline (`.github/workflows/release.yml`): publishes to
|
|
91
|
+
PyPI via Trusted Publishing, pushes multi-arch images to GHCR, and creates a
|
|
92
|
+
GitHub Release with notes extracted from this changelog. Verifies the tag
|
|
93
|
+
matches `pyproject.toml` and that a changelog entry exists before publishing.
|
|
94
|
+
- Weekly TTS canary (`.github/workflows/tts-canary.yml`) that exercises the live
|
|
95
|
+
Edge TTS service and opens an issue when the integration breaks.
|
|
96
|
+
- `requires_ffmpeg` pytest marker; those tests now skip with a clear reason
|
|
97
|
+
instead of failing with `FileNotFoundError` when ffmpeg is absent.
|
|
98
|
+
- `scripts/check_requirements_sync.py`, enforced in CI, to stop `requirements.txt`
|
|
99
|
+
drifting from `[project.dependencies]`.
|
|
100
|
+
- Dependabot config, issue/PR templates, and `SECURITY.md`.
|
|
101
|
+
- Wheel and Docker smoke tests in CI that actually execute the built artifacts.
|
|
102
|
+
|
|
103
|
+
### Changed
|
|
104
|
+
- **The TTS canary now tests two versions, not one** — the pinned release *and*
|
|
105
|
+
the latest release, reported separately. Testing only the pinned version made
|
|
106
|
+
it structurally unable to answer "is our pin the problem?", which is how the
|
|
107
|
+
stale pin survived. The four pinned/latest outcomes each carry a distinct
|
|
108
|
+
meaning, documented in the issue the canary files.
|
|
109
|
+
- **`edge-tts` is no longer hidden from Dependabot.** It was ignored with the
|
|
110
|
+
note "only bump after the TTS canary passes against the new version" — but the
|
|
111
|
+
canary only tested the pinned version, so that condition could never be met.
|
|
112
|
+
The ignore rule suppressed the very release that fixed the breakage.
|
|
113
|
+
- README documents that the Docker image runs as uid 1000 and needs
|
|
114
|
+
`--user "$(id -u):$(id -g)" -e HOME=/tmp` to write into a bind-mounted
|
|
115
|
+
directory, which keeps its host ownership regardless of the build-time `chown`.
|
|
116
|
+
- `scripts/doctor.sh` starts a stopped Docker daemon before judging Docker
|
|
117
|
+
availability, and probes real Edge TTS *synthesis* rather than the voice list —
|
|
118
|
+
a plain GET that succeeds even when the WebSocket upgrade is refused. It now
|
|
119
|
+
distinguishes "reachable", "TLS verification failed" and "refused by the
|
|
120
|
+
service" instead of reporting one undifferentiated "unreachable".
|
|
121
|
+
- CI no longer calls Microsoft's TTS service. `SKIP_TTS_TESTS=1` is set for the
|
|
122
|
+
whole workflow, so a Microsoft outage can no longer turn a contributor's PR red.
|
|
123
|
+
- CI runs `mypy` (non-blocking, pending backlog cleanup) and `bandit`, which were
|
|
124
|
+
previously installed or configured but never executed.
|
|
125
|
+
- `ruff format --check` is now enforced instead of `continue-on-error`, scoped to
|
|
126
|
+
Python sources (ruff >=0.16 also reformats Markdown code blocks).
|
|
127
|
+
- Added Python 3.13 to the test matrix, least-privilege `permissions`,
|
|
128
|
+
`concurrency` cancellation, and `workflow_dispatch` to CI.
|
|
129
|
+
- Docker image now runs as a non-root user and uses OCI-standard labels with a
|
|
130
|
+
build-arg version instead of a hardcoded, stale `2.3.0`.
|
|
131
|
+
- Internal design docs moved from `claudedocs/` to `docs/`; completed working
|
|
132
|
+
documents archived under `docs/archive/`.
|
|
133
|
+
|
|
134
|
+
## [2.5.0] - 2025-12
|
|
135
|
+
|
|
136
|
+
### Added
|
|
137
|
+
- **Unified conversion pipeline** - `core/pipeline.py` with `ConversionPipeline`
|
|
138
|
+
shared by both CLI and TUI
|
|
139
|
+
- **EventBus** - Decoupled pub-sub communication with 17 event types, plus
|
|
140
|
+
`TUIEventAdapter` for thread-safe UI updates
|
|
141
|
+
- **Processing profiles** - 5 built-in presets (Quick Draft, High Quality,
|
|
142
|
+
Audiobook, Accessibility) selectable from the Settings panel
|
|
143
|
+
- **Output naming templates** - Configurable `{author} - {title}.m4b` patterns
|
|
144
|
+
with 6 presets plus custom templates
|
|
145
|
+
- **Job management** - `job_manager.py` for job tracking, persistence, and
|
|
146
|
+
per-job directory isolation
|
|
147
|
+
- **Testing infrastructure** - 558 tests total
|
|
148
|
+
- Mock TTS engine for fast, offline testing (no network calls)
|
|
149
|
+
- `--test-mode` CLI flag for development/CI testing
|
|
150
|
+
- Test mode APIs: `enable_test_mode()`, `disable_test_mode()`, `is_test_mode()`,
|
|
151
|
+
`get_mock_engine()`
|
|
152
|
+
- E2E workflow tests covering EPUB → text → audio → M4B (14 tests)
|
|
153
|
+
- Core pipeline tests for `ConversionPipeline`, `PipelineConfig`,
|
|
154
|
+
`PipelineResult` (29 tests)
|
|
155
|
+
- Error handling tests for file errors, invalid formats, TTS failures (15 tests)
|
|
156
|
+
- Test fixtures in `tests/fixtures/` for creating test EPUBs
|
|
157
|
+
|
|
158
|
+
### Fixed
|
|
159
|
+
- Type mismatch in `ConversionPipeline.export_text()`, which expected
|
|
160
|
+
`ChapterNode` objects but received dicts from `detect_chapters()`
|
|
161
|
+
- Incorrect relative imports in the TUI app module
|
|
162
|
+
|
|
163
|
+
### Changed
|
|
164
|
+
- CI workflow gained coverage reporting (Codecov integration)
|
|
165
|
+
- Pipeline coverage improved from 22% to 60%
|
|
166
|
+
|
|
167
|
+
## [2.4.0] - 2025-12
|
|
168
|
+
|
|
169
|
+
### Added
|
|
170
|
+
- **TUI module extraction** - Split the `tui.py` monolith (4,277 → 1,995 lines,
|
|
171
|
+
53% reduction) into `tui/panels/`, `tui/models/`, and `tui/screens/`
|
|
172
|
+
- **Range/batch selection** - Anchor-based range selection (Enter) and toggle
|
|
173
|
+
mode (V)
|
|
174
|
+
- **Directory browser** - `DirectoryTree` modal for folder selection (📂, `b`)
|
|
175
|
+
- **Path autocomplete** - Tab completion in the directory input field
|
|
176
|
+
- **Settings panel redesign** - Tabbed settings (Voice, Audio, Chapters, Advanced)
|
|
177
|
+
- **Job queue improvements** - Multi-select, reordering, and batch operations
|
|
178
|
+
- **Preview chapter editing** - Merge/delete chapters with undo, inline title
|
|
179
|
+
editing (`E`)
|
|
180
|
+
|
|
181
|
+
### Notes
|
|
182
|
+
- Neither 2.4.0 nor 2.5.0 was published to PyPI or tagged at the time. These
|
|
183
|
+
entries were reconstructed from the git history and ROADMAP when the release
|
|
184
|
+
pipeline was introduced.
|
|
185
|
+
|
|
186
|
+
## [2.3.0] - 2025-11-27
|
|
187
|
+
|
|
188
|
+
### Added
|
|
189
|
+
- **MOBI/AZW format support** - Parse Amazon Kindle ebook formats
|
|
190
|
+
- MOBI, AZW, and AZW3 file support
|
|
191
|
+
- Chapter detection from HTML headings in Kindle books
|
|
192
|
+
- Metadata extraction (title, author, language, publisher)
|
|
193
|
+
- Cover image extraction
|
|
194
|
+
- `--preview` mode for MOBI/AZW files
|
|
195
|
+
- **New module** - `epub2tts_edge/mobi_parser.py`
|
|
196
|
+
- `MobiParser` class for parsing Kindle files
|
|
197
|
+
- `MobiBook` and `MobiChapter` dataclasses
|
|
198
|
+
- `is_kindle_file()`, `is_mobi_file()`, `is_azw_file()` helper functions
|
|
199
|
+
- **Docker support** - Containerized deployment
|
|
200
|
+
- `Dockerfile` for building the image
|
|
201
|
+
- `docker-compose.yml` for easy usage
|
|
202
|
+
- `.dockerignore` for optimized builds
|
|
203
|
+
- **Calibre plugin** - Integration with Calibre library
|
|
204
|
+
- Convert books directly from Calibre
|
|
205
|
+
- Preview chapters before conversion
|
|
206
|
+
- Configurable voice, rate, and volume settings
|
|
207
|
+
- Audio normalization and silence trimming options
|
|
208
|
+
|
|
209
|
+
### Dependencies
|
|
210
|
+
- Added `mobi` library for Kindle format parsing
|
|
211
|
+
|
|
212
|
+
## [2.2.0] - 2025-11-27
|
|
213
|
+
|
|
214
|
+
### Added
|
|
215
|
+
- **Audio normalization** - Consistent volume levels across all chapters
|
|
216
|
+
- `--normalize` flag to enable normalization
|
|
217
|
+
- `--normalize-target` to set target loudness (default: -16 dBFS)
|
|
218
|
+
- `--normalize-method` to choose peak or RMS normalization
|
|
219
|
+
- **Silence detection and trimming** - Remove excessive pauses
|
|
220
|
+
- `--trim-silence` flag to enable silence trimming
|
|
221
|
+
- `--silence-thresh` to set silence threshold (default: -40 dBFS)
|
|
222
|
+
- `--max-silence` to set maximum silence duration (default: 2000ms)
|
|
223
|
+
- **Custom pronunciation dictionary** - Correct mispronounced words
|
|
224
|
+
- `--pronunciation` to specify dictionary file (JSON or text format)
|
|
225
|
+
- `--pronunciation-case-sensitive` for case-sensitive matching
|
|
226
|
+
- Support for word-boundary aware replacements
|
|
227
|
+
- **Multiple voice support** - Different voices for characters and narration
|
|
228
|
+
- `--voice-mapping` to specify voice mapping JSON file
|
|
229
|
+
- `--narrator-voice` to set narrator voice separately
|
|
230
|
+
- Automatic dialogue detection and speaker attribution
|
|
231
|
+
- **Example configuration files** in `examples/` directory
|
|
232
|
+
- `pronunciation.json` and `pronunciation.txt` templates
|
|
233
|
+
- `voice_mapping.json` template
|
|
234
|
+
- **TUI integration** for all v2.2.0 features
|
|
235
|
+
- Audio quality switches (normalize, trim silence)
|
|
236
|
+
- Pronunciation and voice mapping file inputs
|
|
237
|
+
|
|
238
|
+
### Changed
|
|
239
|
+
- Updated documentation with v2.2.0 features
|
|
240
|
+
|
|
241
|
+
## [2.1.0] - 2025-11-27
|
|
242
|
+
|
|
243
|
+
### Added
|
|
244
|
+
- **Voice preview** - Listen to voice samples before converting
|
|
245
|
+
- `--list-voices` to display all available voices
|
|
246
|
+
- `--preview-voice VOICE` to generate a sample
|
|
247
|
+
- **Speech rate and volume control**
|
|
248
|
+
- `--rate` to adjust speech speed (e.g., "+20%", "-10%")
|
|
249
|
+
- `--volume` to adjust volume (e.g., "+50%", "-20%")
|
|
250
|
+
- **Chapter selection** - Convert only specific chapters
|
|
251
|
+
- `--chapters` with flexible syntax: "3", "1-5", "1,3,5-7", "5-"
|
|
252
|
+
- **Pause/resume support** - Resume interrupted conversions
|
|
253
|
+
- `--resume` to continue from saved state
|
|
254
|
+
- `--no-resume` to start fresh
|
|
255
|
+
- Automatic state saving on interruption (Ctrl+C)
|
|
256
|
+
- **TUI integration** for all v2.1.0 features
|
|
257
|
+
- Voice selector with preview button
|
|
258
|
+
- Rate and volume sliders
|
|
259
|
+
- Chapter range input
|
|
260
|
+
- Resume option
|
|
261
|
+
|
|
262
|
+
## [2.0.0] - 2025-11-27
|
|
263
|
+
|
|
264
|
+
### Added
|
|
265
|
+
- **Enhanced chapter detection**
|
|
266
|
+
- EPUB2 NCX Table of Contents parsing
|
|
267
|
+
- EPUB3 NAV document parsing
|
|
268
|
+
- Multi-level heading detection (h1-h6)
|
|
269
|
+
- `--detect` option with methods: toc, headings, combined, auto
|
|
270
|
+
- Hierarchical chapter structure with ChapterNode tree
|
|
271
|
+
- `--hierarchy` option with styles: flat, numbered, arrow, breadcrumb, indented
|
|
272
|
+
- `--preview` mode to inspect chapters without converting
|
|
273
|
+
- **Batch processing**
|
|
274
|
+
- Process entire folders of EPUB files
|
|
275
|
+
- `--recursive` for subfolder scanning
|
|
276
|
+
- Skip already-processed files
|
|
277
|
+
- Resume interrupted batches
|
|
278
|
+
- JSON report generation
|
|
279
|
+
- `--output-dir` for custom output location
|
|
280
|
+
- `--export-only` mode for text extraction only
|
|
281
|
+
- **Terminal UI (TUI)**
|
|
282
|
+
- Interactive file browser
|
|
283
|
+
- Settings panel for voice and detection options
|
|
284
|
+
- Real-time progress display
|
|
285
|
+
- Processing queue with status tracking
|
|
286
|
+
- Log panel for detailed output
|
|
287
|
+
- Keyboard shortcuts
|
|
288
|
+
|
|
289
|
+
### Changed
|
|
290
|
+
- Renamed CLI from `epub2tts-edge` to `audiobookify` (with `abfy` alias)
|
|
291
|
+
- Reorganized codebase into modular components
|
|
292
|
+
|
|
293
|
+
## [1.2.7] - 2024
|
|
294
|
+
|
|
295
|
+
### Notes
|
|
296
|
+
- Original epub2tts-edge features (forked from aedocw/epub2tts-edge)
|
|
297
|
+
- Basic EPUB to M4B conversion
|
|
298
|
+
- Microsoft Edge TTS integration
|
|
299
|
+
- Chapter markers in output
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
[Unreleased]: https://github.com/loganrooks/audiobookify/compare/v2.6.0...HEAD
|
|
304
|
+
[2.6.0]: https://github.com/loganrooks/audiobookify/compare/v2.5.0...v2.6.0
|
|
305
|
+
[2.5.0]: https://github.com/loganrooks/audiobookify/compare/v2.4.0...v2.5.0
|
|
306
|
+
[2.4.0]: https://github.com/loganrooks/audiobookify/compare/v2.3.0...v2.4.0
|
|
307
|
+
[2.3.0]: https://github.com/loganrooks/audiobookify/compare/v2.2.0...v2.3.0
|
|
308
|
+
[2.2.0]: https://github.com/loganrooks/audiobookify/compare/v2.1.0...v2.2.0
|
|
309
|
+
[2.1.0]: https://github.com/loganrooks/audiobookify/compare/v2.0.0...v2.1.0
|
|
310
|
+
[2.0.0]: https://github.com/loganrooks/audiobookify/releases/tag/v2.0.0
|