Tighten hardcore Krea action wording

This commit is contained in:
2026-06-24 16:00:01 +02:00
parent 81d9b20db7
commit 8589035a07
4 changed files with 215 additions and 70 deletions
+53 -5
View File
@@ -83,6 +83,52 @@ def _human_join(parts: list[str]) -> str:
return f"{', '.join(parts[:-1])}, and {parts[-1]}"
def _prompt_cast_descriptors(text: str) -> str:
return _clean_text(text).replace("Woman A / primary creator:", "Woman A:")
def _cast_entries(text: str) -> list[tuple[str, str]]:
text = _prompt_cast_descriptors(text)
entries: list[tuple[str, str]] = []
for part in text.split(";"):
part = _clean_text(part)
match = re.match(r"^((?:Woman|Man) [A-Z]):\s*(.+)$", part)
if match:
entries.append((match.group(1), _clean_text(match.group(2))))
return entries
def _natural_cast_descriptor_text(text: str) -> str:
entries = _cast_entries(text)
if not entries:
return _clean_text(text)
labels = [label for label, _descriptor in entries]
if labels == ["Woman A"] or labels == ["Man A"]:
return f"A {entries[0][1]}"
if set(labels) == {"Woman A", "Man A"} and len(labels) == 2:
by_label = {label: descriptor for label, descriptor in entries}
return f"A {by_label['Woman A']} alongside a {by_label['Man A']}"
return " ".join(f"{label} is {descriptor}." for label, descriptor in entries)
def _cast_labels(text: str) -> list[str]:
return [label for label, _descriptor in _cast_entries(text)]
def _natural_label_text(text: Any, labels: list[str]) -> str:
text = _clean_text(text)
if not text:
return ""
if set(labels) == {"Woman A", "Man A"}:
text = re.sub(r"\bWoman A\b", "the woman", text)
text = re.sub(r"\bMan A\b", "the man", text)
elif labels == ["Woman A"]:
text = re.sub(r"\bWoman A\b", "the woman", text)
elif labels == ["Man A"]:
text = re.sub(r"\bMan A\b", "the man", text)
return text
def _strip_style_tail(text: str) -> str:
text = _clean_text(text)
for tail in STYLE_TAILS:
@@ -428,7 +474,7 @@ def _configured_cast_from_row(row: dict[str, Any], detail_level: str, keep_style
parts = [f"{_cap_first(subject)} {verb} shown as a consensual {scene_kind}"]
if cast_descriptor_text:
parts.append(f"The named characters are {cast_descriptor_text}")
parts.append(_natural_cast_descriptor_text(cast_descriptor_text))
if cast and not cast_descriptor_text:
parts.append(f"The cast is {cast}")
if role_graph:
@@ -505,19 +551,20 @@ def _insta_of_pair_from_row(row: dict[str, Any], detail_level: str, keep_style:
options = row.get("options") if isinstance(row.get("options"), dict) else {}
cast_descriptors = row.get("shared_cast_descriptors")
if isinstance(cast_descriptors, list):
cast_descriptor_text = _human_join([_clean_text(item) for item in cast_descriptors if _clean_text(item)])
cast_descriptor_text = "; ".join(_clean_text(item) for item in cast_descriptors if _clean_text(item))
else:
cast_descriptor_text = _clean_text(cast_descriptors)
labels = _cast_labels(cast_descriptor_text)
same_soft_cast = options.get("softcore_cast") == "same_as_hardcore"
parts = []
if cast_descriptor_text and same_soft_cast:
parts.append(f"The shared cast descriptors are {cast_descriptor_text}")
parts.append(_natural_cast_descriptor_text(cast_descriptor_text))
elif descriptor:
parts.append(f"The softcore primary creator descriptor is {descriptor}")
parts.append(f"A {descriptor}")
if cast_descriptor_text and not same_soft_cast:
parts.append(f"The hardcore cast descriptors are {cast_descriptor_text}")
parts.append(_natural_cast_descriptor_text(cast_descriptor_text))
if same_soft_cast:
parts.append("The softcore version keeps the same adult cast present together in a non-explicit teaser setup")
partner_styling = row.get("softcore_partner_styling")
@@ -525,6 +572,7 @@ def _insta_of_pair_from_row(row: dict[str, Any], detail_level: str, keep_style:
outfits = partner_styling.get("outfits")
if isinstance(outfits, list):
outfit_text = _human_join([_clean_text(item) for item in outfits if _clean_text(item)])
outfit_text = _natural_label_text(outfit_text, labels)
if outfit_text:
parts.append(f"Softcore partner styling: {outfit_text}")
pose = _clean_text(partner_styling.get("pose"))