48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
|
|
def _clean(value: Any) -> str:
|
|
return " ".join(str(value or "").strip().split())
|
|
|
|
|
|
def softcore_cast_presence_phrase(
|
|
*,
|
|
same_cast: bool,
|
|
pov_labels: list[str] | tuple[str, ...] | None = None,
|
|
cast_label: str = "",
|
|
woman_label: str = "the woman",
|
|
) -> str:
|
|
pov_labels = [str(label) for label in (pov_labels or []) if str(label).strip()]
|
|
cast_label = _clean(cast_label)
|
|
woman_label = _clean(woman_label) or "the woman"
|
|
if same_cast and pov_labels:
|
|
return (
|
|
f"{woman_label} is framed from the POV participant's first-person creator camera, "
|
|
"with the POV participant implied by camera position or foreground body cues"
|
|
)
|
|
if same_cast:
|
|
visible_cast = cast_label or "the named cast"
|
|
verb = "share" if " and " in visible_cast or "," in visible_cast else "shares"
|
|
return f"{visible_cast} {verb} a styled creator-teaser frame"
|
|
return f"solo creator frame with {woman_label} as the only visible subject"
|
|
|
|
|
|
def softcore_caption_setup_phrase(*, same_cast: bool, target_auto: bool = False) -> str:
|
|
if same_cast:
|
|
return (
|
|
"The softcore side keeps the same adult cast together in a styled creator setup"
|
|
if target_auto
|
|
else "The same adult cast shares a styled creator setup"
|
|
)
|
|
return (
|
|
"The softcore side is a solo styled creator setup"
|
|
if target_auto
|
|
else "Solo styled creator setup"
|
|
)
|
|
|
|
|
|
def softcore_style_directive() -> str:
|
|
return "Use seductive creator-shot teaser styling."
|