feat: smart synopsis truncation at sentence boundary (500 chars)
CI / Test (Python 3.11) (push) Has been cancelled
CI / Test (Python 3.12) (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Type Check (push) Has been cancelled
CI / Summary (push) Has been cancelled

This commit is contained in:
root
2026-03-28 00:52:44 +00:00
parent c94f97b357
commit 4e27bcaa13
+27 -1
View File
@@ -77,6 +77,20 @@ def get_download_manager() -> DownloadManager:
# ==================== ANIME SEARCH ====================
def _truncate_at_sentence(text: str, max_len: int = 500) -> str:
"""Truncate text at the last sentence boundary before max_len."""
if not text or len(text) <= max_len:
return text
truncated = text[:max_len]
last_period = truncated.rfind(".")
if last_period > 0:
return text[: last_period + 1]
last_space = truncated.rfind(" ")
if last_space > 0:
return text[:last_space] + "..."
return truncated + "..."
@router.get("/anime/search")
async def search_anime_unified(
request: Request,
@@ -189,11 +203,15 @@ async def search_anime_unified(
if not isinstance(meta, Exception) and meta:
results[pid][pos]["metadata"] = meta.model_dump()
# 5. Sort results
# 5. Sort results and truncate synopses
for pid in results:
results[pid].sort(key=lambda x: -x.get("_relevance_boost", 0))
for item in results[pid]:
item.pop("_relevance_boost", None)
meta = item.get("metadata") or {}
syn = meta.get("synopsis")
if syn:
meta["synopsis"] = _truncate_at_sentence(syn, 500)
elapsed = time.time() - start_time
total_found = sum(len(r) for r in results.values())
@@ -302,6 +320,14 @@ async def search_series_unified(
meta.model_dump() if hasattr(meta, "model_dump") else meta
)
# Truncate synopses at sentence boundaries
for pid in results:
for item in results[pid]:
meta = item.get("metadata") or {}
syn = meta.get("synopsis")
if syn:
meta["synopsis"] = _truncate_at_sentence(syn, 500)
elapsed = time.time() - start_time
total_found = sum(len(r) for r in results.values())
print(