Fix memoir image delivery and Android rendering

This commit is contained in:
Kevin
2026-03-11 10:06:12 +08:00
parent 0970cb7408
commit a76cf8da18
23 changed files with 537 additions and 51 deletions

View File

@@ -106,7 +106,9 @@ def _merge_chapter_image_assets(
merged_item["size"] = merged_item.get("size") or size
merged_item["created_at"] = merged_item.get("created_at") or now_iso
merged_item["updated_at"] = merged_item.get("updated_at") or now_iso
if merged_item.get("status") == "completed" and not merged_item.get("url"):
if merged_item.get("status") == "completed" and not (
merged_item.get("storage_key") or merged_item.get("url")
):
merged_item["status"] = "failed"
merged_item["error"] = merged_item.get("error") or "missing image url"
else:
@@ -131,6 +133,7 @@ def initialize_chapter_images(chapter) -> list[dict]:
settings = MemoirImageSettings.from_env()
if not settings.enabled:
chapter.images = []
logger.info(f"章节图片初始化跳过: chapter={chapter.id}, enabled=false")
return chapter.images
prompt_service = MemoirImagePromptService(llm=None, settings=settings)
@@ -144,6 +147,13 @@ def initialize_chapter_images(chapter) -> list[dict]:
size=settings.default_size,
now_iso=datetime.now(timezone.utc).isoformat(),
)
logger.info(
"章节图片初始化完成: chapter=%s, placeholders=%d, images=%d, statuses=%s",
chapter.id,
len(placeholders),
len(chapter.images or []),
[item.get("status") for item in (chapter.images or [])],
)
return chapter.images
@@ -479,6 +489,7 @@ def process_memoir_segments(self, user_id: str, segment_ids: List[str]):
for chapter_id in sorted(chapters_to_enqueue):
try:
logger.info(f"派发章节补图任务: chapter={chapter_id}")
generate_chapter_images.delay(chapter_id)
except Exception as exc:
logger.warning(f"补图任务派发失败: chapter={chapter_id}, error={exc}")
@@ -599,6 +610,7 @@ def generate_chapter_images(self, chapter_id: str):
try:
chapter = db.get(Chapter, chapter_id)
if not chapter or not chapter.images:
logger.info(f"章节补图跳过: chapter={chapter_id}, reason=no_images")
return {"status": "no_images"}
settings = MemoirImageSettings.from_env()
@@ -606,9 +618,16 @@ def generate_chapter_images(self, chapter_id: str):
provider = LiblibImageProvider(template_uuid=settings.liblib_template_uuid)
storage = TencentCosStorageService.from_env()
images = [dict(item) for item in (chapter.images or [])]
pending_count = sum(1 for item in images if item.get("status") in {"pending", "failed"})
logger.info(
"章节补图开始: chapter=%s, total_images=%d, pending_images=%d",
chapter_id,
len(images),
pending_count,
)
for index, item in enumerate(images):
if item.get("status") == "completed" and item.get("url"):
if item.get("status") == "completed" and (item.get("storage_key") or item.get("url")):
continue
if item.get("status") not in {"pending", "failed"}:
continue
@@ -643,12 +662,19 @@ def generate_chapter_images(self, chapter_id: str):
)
image_bytes = provider.download_image(job)
key = build_cos_key(chapter.user_id, chapter.id, current_item["index"], prompt_data["prompt"])
current_item["storage_key"] = key
current_item["url"] = storage.upload_bytes(image_bytes, key, "image/png")
current_item["prompt"] = prompt_data["prompt"]
current_item["style"] = prompt_data["style"]
current_item["size"] = prompt_data["size"]
current_item["status"] = "completed"
current_item["error"] = None
logger.info(
"章节补图成功: chapter=%s, index=%s, url=%s",
chapter_id,
current_item.get("index"),
current_item["url"],
)
except Exception as exc:
current_item["status"] = "failed"
current_item["error"] = str(exc)