From 4123cadd8777e65051a35f450e479e69eb06c28a Mon Sep 17 00:00:00 2001 From: Artem Akymenko Date: Thu, 23 Jul 2026 07:20:34 +0000 Subject: [PATCH] feat: m4b finalizer in service (embed_m4b_metadata) --- abogen/application/conversion_service.py | 37 +++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/abogen/application/conversion_service.py b/abogen/application/conversion_service.py index 54461d9..12465f9 100644 --- a/abogen/application/conversion_service.py +++ b/abogen/application/conversion_service.py @@ -79,7 +79,9 @@ def run_conversion( tts_context=tts_context, ) - # Stage 4: Finalize + # Stage 4: Finalize (m4b metadata embedding) + _finalize(request, result, events) + events.log("Conversion complete") return result @@ -88,6 +90,39 @@ def run_conversion( raise +def _finalize( + request: ConversionRequest, + result: ConversionResult, + events: ConversionEvents, +) -> None: + """Post-conversion finalization (m4b metadata embedding, etc.).""" + from abogen.domain.enums import OutputFormat + + if ( + result.audio_path + and request.output_format == OutputFormat.M4B + ): + from pathlib import Path + + from abogen.infrastructure.exporters import ExportService + + export_svc = ExportService() + cover_path = request.cover_image_path if request.cover_image_path and request.cover_image_path.exists() else None + + try: + export_svc.embed_m4b_metadata( + audio_path=result.audio_path, + metadata=result.metadata or {}, + chapters=result.chapter_markers or [], + cover_path=cover_path, + cover_mime=request.cover_image_mime, + log_callback=lambda msg, level="info": events.log(msg, level=level), + ) + except Exception as exc: + events.log(f"Failed to embed m4b metadata: {exc}", level="error") + raise RuntimeError(f"Failed to embed m4b metadata: {exc}") from exc + + def _prepare_tts_context( request: ConversionRequest, events: ConversionEvents,