summary extra title

This commit is contained in:
2026-05-23 21:05:24 +02:00
parent c544728c77
commit a04c052388
2 changed files with 78 additions and 14 deletions
+78 -13
View File
@@ -694,6 +694,63 @@ class ComicInfoBuilder:
return result return result
def _collect_all_alt_titles(self, md: dict) -> "dict[str, list[str]]":
"""
Returns all known title variants grouped by language/script.
Groups collected (skipped when empty):
"en" English (language = "en")
"de" German (language = "de")
"ja" Japanese native kanji (language = "ja")
"ja-romaji" Japanese romanized (language = "ja-Latn" / "ja-romaji")
"ko" Korean native (language = "ko")
"ko-romaji" Korean romanized (language = "ko-Latn" / "ko-romaji")
"zh" Chinese native (language = "zh" / "zh-hk" / "zh-tw" / …)
"zh-romaji" Chinese romanized (language = "zh-Latn")
All variants are included (not just primary), preserving API order.
Duplicates within a group are removed.
"""
_GROUPS: "dict[str, tuple]" = {
"en": ("en",),
"de": ("de",),
"ja": ("ja",),
"ja-romaji": ("ja-latn", "ja-romaji"),
"ko": ("ko",),
"ko-romaji": ("ko-latn", "ko-romaji"),
"zh": ("zh", "zh-hk", "zh-tw", "zh-hans", "zh-hant"),
"zh-romaji": ("zh-latn",),
}
# Pre-build a flat lang → group mapping for O(1) lookup
lang_to_group: "dict[str, str]" = {
lang: group
for group, langs in _GROUPS.items()
for lang in langs
}
result: "dict[str, list[str]]" = {}
seen: "dict[str, set[str]]" = {}
for entry in (md.get("titles") or md.get("alt_titles") or []):
if not isinstance(entry, dict):
continue
lang = (entry.get("language") or entry.get("lang") or "").lower()
group = lang_to_group.get(lang)
if not group:
continue
title = (entry.get("title") or "").strip()
if not title:
continue
if group not in result:
result[group] = []
seen[group] = set()
if title not in seen[group]:
result[group].append(title)
seen[group].add(title)
return result
# ====================================================================== # ======================================================================
# Summary / notes # Summary / notes
# ====================================================================== # ======================================================================
@@ -706,10 +763,6 @@ class ComicInfoBuilder:
1. MAL statistics — HTML link + table with padded columns 1. MAL statistics — HTML link + table with padded columns
2. Series description — Markdown converted to HTML 2. Series description — Markdown converted to HTML
3. Alternate titles — HTML table 3. Alternate titles — HTML table
IMPORTANT: no raw \\n characters anywhere in the output — Kavita
renders every bare newline as a <br>. Sections are separated with
an explicit <br> instead.
""" """
# Inline style applied to label cells for readable column spacing. # Inline style applied to label cells for readable column spacing.
_TD = 'style="padding-right:1.5em"' _TD = 'style="padding-right:1.5em"'
@@ -744,16 +797,28 @@ class ComicInfoBuilder:
if desc_raw: if desc_raw:
parts.append(_md_to_html(desc_raw)) parts.append(_md_to_html(desc_raw))
# 3. Alternate titles table (bottom) ------------------------------ # 3. Alternate titles table (bottom) — all variants per language ------
alt = self._collect_alt_titles(md) all_alt = self._collect_all_alt_titles(md)
if alt: if all_alt:
label_map = {"en": "EN", "de": "DE", "romaji": "Romaji", "jp": "JP (Kanji)"} label_map = {
"en": "EN",
"de": "DE",
"ja": "JA",
"ja-romaji": "JA Romaji",
"ko": "KO",
"ko-romaji": "KO Romaji",
"zh": "ZH",
"zh-romaji": "ZH Romaji",
}
alt_rows: list[str] = [] alt_rows: list[str] = []
for code in ("en", "de", "romaji", "jp"): for group in ("en", "de", "ja", "ja-romaji",
if code in alt: "ko", "ko-romaji", "zh", "zh-romaji"):
alt_rows.append( titles = all_alt.get(group)
f"<tr><td {_TD}>{label_map[code]}</td><td>{alt[code]}</td></tr>" if not titles:
) continue
label = label_map[group]
cell = "<br>".join(titles)
alt_rows.append(f"<tr><td {_TD}>{label}</td><td>{cell}</td></tr>")
if alt_rows: if alt_rows:
parts.append(f"<table>{''.join(alt_rows)}</table>") parts.append(f"<table>{''.join(alt_rows)}</table>")
-1
View File
@@ -197,7 +197,6 @@ class MangaDexVolumeResolver:
if result is None and chapter_map: if result is None and chapter_map:
result = self.estimate_volume_for_chapter( result = self.estimate_volume_for_chapter(
chapter_map, chapter, volume_page_counts) chapter_map, chapter, volume_page_counts)
print(result)
return result return result
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------