From 7340d52ebbb2f256907c8b36ce25647466216787 Mon Sep 17 00:00:00 2001 From: Sanjay Santhanam <51058514+Sanjays2402@users.noreply.github.com> Date: Sat, 18 Jul 2026 07:32:41 -0700 Subject: [PATCH] fix(webui): preserve user-entered book metadata Apply the book form after extraction-backed pending job creation so explicit title and author values take precedence over fallback metadata. Add a focused regression test for the upload path. --- abogen/webui/routes/utils/form.py | 2 ++ tests/test_pending_job_metadata.py | 40 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 tests/test_pending_job_metadata.py diff --git a/abogen/webui/routes/utils/form.py b/abogen/webui/routes/utils/form.py index 9301c55..40b8432 100644 --- a/abogen/webui/routes/utils/form.py +++ b/abogen/webui/routes/utils/form.py @@ -826,6 +826,8 @@ def build_pending_job_from_extraction( analysis_requested=initial_analysis, ) + apply_book_step_form(pending, form, settings=settings, profiles=profiles_map) + return PendingBuildResult( pending=pending, selected_speaker_config=selected_speaker_config or None, diff --git a/tests/test_pending_job_metadata.py b/tests/test_pending_job_metadata.py new file mode 100644 index 0000000..8d84fd9 --- /dev/null +++ b/tests/test_pending_job_metadata.py @@ -0,0 +1,40 @@ +import sys +import types +from pathlib import Path +from types import SimpleNamespace + + +routes_package = types.ModuleType("abogen.webui.routes") +routes_package.__path__ = [ + str(Path(__file__).parents[1] / "abogen" / "webui" / "routes") +] +sys.modules["abogen.webui.routes"] = routes_package + +from abogen.webui.routes.utils.form import ( # noqa: E402 + build_pending_job_from_extraction, + load_settings, +) + + +def test_user_metadata_overrides_extraction_fallback(tmp_path: Path) -> None: + extraction = SimpleNamespace( + chapters=[SimpleNamespace(title="Chapter 1", text="Text")], + metadata={"title": "423d828962c34d2b8a53bbe91176305a"}, + cover_image=None, + cover_mime=None, + total_characters=4, + combined_text="Text", + ) + + result = build_pending_job_from_extraction( + stored_path=tmp_path / "book.txt", + original_name="book.txt", + extraction=extraction, + form={"meta_title": "My Book", "meta_author": "Ada Author"}, + settings=load_settings(), + profiles={}, + ) + + assert result.pending.metadata_tags["title"] == "My Book" + assert result.pending.metadata_tags["author"] == "Ada Author" + assert result.pending.metadata_tags["authors"] == "Ada Author"