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.
Files changed (88) hide show
  1. audiobookifier-2.6.0/CHANGELOG.md +310 -0
  2. audiobookifier-2.6.0/LICENSE +674 -0
  3. audiobookifier-2.6.0/MANIFEST.in +12 -0
  4. audiobookifier-2.6.0/PKG-INFO +561 -0
  5. audiobookifier-2.6.0/README.md +504 -0
  6. audiobookifier-2.6.0/audiobookifier.egg-info/SOURCES.txt +85 -0
  7. audiobookifier-2.6.0/epub2tts_edge/__init__.py +270 -0
  8. audiobookifier-2.6.0/epub2tts_edge/audio_generator.py +767 -0
  9. audiobookifier-2.6.0/epub2tts_edge/audio_normalization.py +244 -0
  10. audiobookifier-2.6.0/epub2tts_edge/batch_processor.py +811 -0
  11. audiobookifier-2.6.0/epub2tts_edge/chapter_detector.py +1384 -0
  12. audiobookifier-2.6.0/epub2tts_edge/chapter_selector.py +215 -0
  13. audiobookifier-2.6.0/epub2tts_edge/config.py +249 -0
  14. audiobookifier-2.6.0/epub2tts_edge/content_filter.py +469 -0
  15. audiobookifier-2.6.0/epub2tts_edge/core/__init__.py +39 -0
  16. audiobookifier-2.6.0/epub2tts_edge/core/events.py +231 -0
  17. audiobookifier-2.6.0/epub2tts_edge/core/output_naming.py +242 -0
  18. audiobookifier-2.6.0/epub2tts_edge/core/pipeline.py +627 -0
  19. audiobookifier-2.6.0/epub2tts_edge/core/profiles.py +179 -0
  20. audiobookifier-2.6.0/epub2tts_edge/epub2tts_edge.py +1305 -0
  21. audiobookifier-2.6.0/epub2tts_edge/errors.py +212 -0
  22. audiobookifier-2.6.0/epub2tts_edge/job_manager.py +556 -0
  23. audiobookifier-2.6.0/epub2tts_edge/logger.py +97 -0
  24. audiobookifier-2.6.0/epub2tts_edge/mobi_parser.py +466 -0
  25. audiobookifier-2.6.0/epub2tts_edge/multi_voice.py +315 -0
  26. audiobookifier-2.6.0/epub2tts_edge/pause_resume.py +262 -0
  27. audiobookifier-2.6.0/epub2tts_edge/pronunciation.py +208 -0
  28. audiobookifier-2.6.0/epub2tts_edge/silence_detection.py +235 -0
  29. audiobookifier-2.6.0/epub2tts_edge/testing/__init__.py +11 -0
  30. audiobookifier-2.6.0/epub2tts_edge/testing/mock_tts.py +243 -0
  31. audiobookifier-2.6.0/epub2tts_edge/tui/__init__.py +64 -0
  32. audiobookifier-2.6.0/epub2tts_edge/tui/app.py +2055 -0
  33. audiobookifier-2.6.0/epub2tts_edge/tui/handlers/__init__.py +9 -0
  34. audiobookifier-2.6.0/epub2tts_edge/tui/handlers/event_adapter.py +281 -0
  35. audiobookifier-2.6.0/epub2tts_edge/tui/models/__init__.py +6 -0
  36. audiobookifier-2.6.0/epub2tts_edge/tui/models/preview_state.py +138 -0
  37. audiobookifier-2.6.0/epub2tts_edge/tui/models/voice_status.py +69 -0
  38. audiobookifier-2.6.0/epub2tts_edge/tui/panels/__init__.py +23 -0
  39. audiobookifier-2.6.0/epub2tts_edge/tui/panels/file_panel.py +419 -0
  40. audiobookifier-2.6.0/epub2tts_edge/tui/panels/jobs_panel.py +325 -0
  41. audiobookifier-2.6.0/epub2tts_edge/tui/panels/log_panel.py +46 -0
  42. audiobookifier-2.6.0/epub2tts_edge/tui/panels/preview_panel.py +894 -0
  43. audiobookifier-2.6.0/epub2tts_edge/tui/panels/progress_panel.py +114 -0
  44. audiobookifier-2.6.0/epub2tts_edge/tui/panels/queue_panel.py +89 -0
  45. audiobookifier-2.6.0/epub2tts_edge/tui/panels/settings_panel.py +464 -0
  46. audiobookifier-2.6.0/epub2tts_edge/tui/screens/__init__.py +6 -0
  47. audiobookifier-2.6.0/epub2tts_edge/tui/screens/directory_browser.py +109 -0
  48. audiobookifier-2.6.0/epub2tts_edge/tui/screens/help_screen.py +104 -0
  49. audiobookifier-2.6.0/epub2tts_edge/voice_preview.py +655 -0
  50. audiobookifier-2.6.0/examples/pronunciation.json +44 -0
  51. audiobookifier-2.6.0/examples/pronunciation.txt +42 -0
  52. audiobookifier-2.6.0/examples/voice_mapping.json +19 -0
  53. audiobookifier-2.6.0/pyproject.toml +197 -0
  54. audiobookifier-2.6.0/requirements.txt +25 -0
  55. audiobookifier-2.6.0/setup.cfg +4 -0
  56. audiobookifier-2.6.0/setup.py +6 -0
  57. audiobookifier-2.6.0/tests/__init__.py +0 -0
  58. audiobookifier-2.6.0/tests/conftest.py +368 -0
  59. audiobookifier-2.6.0/tests/fixtures/__init__.py +9 -0
  60. audiobookifier-2.6.0/tests/fixtures/epub_factory.py +275 -0
  61. audiobookifier-2.6.0/tests/mocks/__init__.py +11 -0
  62. audiobookifier-2.6.0/tests/mocks/tts_mock.py +10 -0
  63. audiobookifier-2.6.0/tests/test_audio_normalization.py +281 -0
  64. audiobookifier-2.6.0/tests/test_batch_processor.py +349 -0
  65. audiobookifier-2.6.0/tests/test_chapter_detector.py +277 -0
  66. audiobookifier-2.6.0/tests/test_chapter_selector.py +224 -0
  67. audiobookifier-2.6.0/tests/test_config.py +266 -0
  68. audiobookifier-2.6.0/tests/test_content_filter.py +430 -0
  69. audiobookifier-2.6.0/tests/test_e2e_workflow.py +666 -0
  70. audiobookifier-2.6.0/tests/test_event_bus.py +333 -0
  71. audiobookifier-2.6.0/tests/test_external_constraints.py +92 -0
  72. audiobookifier-2.6.0/tests/test_integration.py +354 -0
  73. audiobookifier-2.6.0/tests/test_job_manager.py +455 -0
  74. audiobookifier-2.6.0/tests/test_mobi_parser.py +464 -0
  75. audiobookifier-2.6.0/tests/test_multi_voice.py +380 -0
  76. audiobookifier-2.6.0/tests/test_output_naming.py +312 -0
  77. audiobookifier-2.6.0/tests/test_packaging.py +94 -0
  78. audiobookifier-2.6.0/tests/test_pause_resume.py +222 -0
  79. audiobookifier-2.6.0/tests/test_pipeline.py +743 -0
  80. audiobookifier-2.6.0/tests/test_preview_export.py +352 -0
  81. audiobookifier-2.6.0/tests/test_profiles.py +248 -0
  82. audiobookifier-2.6.0/tests/test_pronunciation.py +302 -0
  83. audiobookifier-2.6.0/tests/test_silence_detection.py +299 -0
  84. audiobookifier-2.6.0/tests/test_test_mode.py +205 -0
  85. audiobookifier-2.6.0/tests/test_tts_connectivity.py +200 -0
  86. audiobookifier-2.6.0/tests/test_tts_params.py +128 -0
  87. audiobookifier-2.6.0/tests/test_tui_workflows.py +980 -0
  88. 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