Remove softcore and hardcore scene leaks
This commit is contained in:
+100
-30
@@ -642,6 +642,66 @@ def _heuristic_cast_compatible(text: str, women_count: int, men_count: int) -> b
|
||||
return True
|
||||
|
||||
|
||||
HARDCORE_ENVIRONMENT_ANCHOR_REPLACEMENTS = (
|
||||
(r"\bstacked bodies on the bed\b", "stacked bodies with close body alignment"),
|
||||
(r"\bthree bodies tangled on the bed\b", "three bodies tangled in close contact"),
|
||||
(r"\ba triangle of bodies on the mattress\b", "a triangle of bodies in close contact"),
|
||||
(r"\bbodies tangled on the sheets\b", "bodies tangled in close contact"),
|
||||
(r"\bwet bodies tangled on sheets\b", "wet bodies tangled in close contact"),
|
||||
(r"\bbody arched on rumpled sheets\b", "body arched with clear skin contact"),
|
||||
(r"\bface-down ass-up on the mattress\b", "face-down ass-up position"),
|
||||
(r"\bsitting on the edge of the bed\b", "sitting on a raised edge"),
|
||||
(r"\blying at the bed edge with thighs open\b", "lying near a raised edge with thighs open"),
|
||||
(r"\bedge[- ]of[- ]bed\b", "edge-supported"),
|
||||
(r"\bbed[- ]edge\b", "edge-supported"),
|
||||
(r"\bedge of (?:the )?bed\b", "raised edge"),
|
||||
(r"\bbed edge\b", "raised edge"),
|
||||
(r"\bhands? braced on the bed\b", "hands braced beside the body"),
|
||||
(r"\bone hand pressing into the mattress\b", "one hand braced beside the body"),
|
||||
(r"\bone foot planted on the bed\b", "one foot planted for leverage"),
|
||||
(r"\bfingers gripping sheets and skin\b", "fingers gripping skin"),
|
||||
(r"\bfingers gripping sheets\b", "fingers gripping skin"),
|
||||
(r"\bhands gripping sheets\b", "hands gripping skin"),
|
||||
(r"\bone hand gripping the sheets\b", "one hand gripping skin"),
|
||||
(r"\brumpled bed sheets\b", "wrinkled body-contact fabric"),
|
||||
(r"\bwet sheets beneath the bodies\b", "visible wetness beneath the bodies"),
|
||||
(r"\bsexual fluids on sheets\b", "sexual fluids visible on skin"),
|
||||
(r"\bcum dripping onto sheets\b", "cum visible on skin"),
|
||||
(r"\bfluid dripping onto sheets\b", "fluid visible on skin"),
|
||||
(r"\bsquirting fluid on the sheets\b", "squirting fluid visible on skin"),
|
||||
(r"\bsoft sheets\b", "soft fabric"),
|
||||
(r"\bsilk sheets\b", "silk fabric"),
|
||||
(r"\bsheets\b", "fabric"),
|
||||
(r"\bmattress\b", "low support surface"),
|
||||
(r"\ba low support surface\b", "a low body support"),
|
||||
(r"\ba low mattress\b", "a low body support"),
|
||||
(r"\ba wide couch\b", "a wide body support"),
|
||||
(r"\bwide couch\b", "wide body support"),
|
||||
(r"\bcouch\b", "body support"),
|
||||
(r"\bsofa\b", "body support"),
|
||||
(r"\bon the bed\b", "on a body support"),
|
||||
(r"\bon a bed\b", "on a body support"),
|
||||
(r"\bbedroom-floor\b", "floor-level"),
|
||||
(r"\bbedroom floor\b", "floor-level"),
|
||||
)
|
||||
|
||||
|
||||
def _sanitize_hardcore_environment_anchors(value: Any) -> str:
|
||||
text = str(value or "")
|
||||
if not text:
|
||||
return ""
|
||||
for pattern, replacement in HARDCORE_ENVIRONMENT_ANCHOR_REPLACEMENTS:
|
||||
text = re.sub(pattern, replacement, text, flags=re.IGNORECASE)
|
||||
text = re.sub(r"\s+,", ",", text)
|
||||
text = re.sub(r",\s*,", ",", text)
|
||||
text = re.sub(r"\s{2,}", " ", text)
|
||||
return text.strip()
|
||||
|
||||
|
||||
def _sanitize_hardcore_axis_values(values: dict[str, str]) -> dict[str, str]:
|
||||
return {key: _sanitize_hardcore_environment_anchors(value) for key, value in values.items()}
|
||||
|
||||
|
||||
def _compatible_entry(entry: Any, women_count: int, men_count: int) -> bool:
|
||||
if not isinstance(entry, dict):
|
||||
return _heuristic_cast_compatible(_entry_text(entry), women_count, men_count)
|
||||
@@ -3803,6 +3863,10 @@ def _build_custom_row(
|
||||
items = _list_from(subcategory.get("items", [subcategory["name"]]))
|
||||
item = _weighted_choice(content_rng, items)
|
||||
item_text, item_name, item_axis_values = _compose_item(content_rng, category, subcategory, item, women_count, men_count)
|
||||
is_pose_category = _is_pose_content_category(category, subcategory)
|
||||
if is_pose_category:
|
||||
item_text = _sanitize_hardcore_environment_anchors(item_text)
|
||||
item_axis_values = _sanitize_hardcore_axis_values(item_axis_values)
|
||||
subject_type = str(_merged_field(category, subcategory, item, "subject_type", "single_any"))
|
||||
context = _subject_context(person_rng, subject_type, ethnicity, figure, no_plus_women, no_black, women_count, men_count)
|
||||
character_slots = _parse_character_cast(character_cast)
|
||||
@@ -3834,6 +3898,8 @@ def _build_custom_row(
|
||||
else []
|
||||
)
|
||||
source_role_graph = _role_graph(role_rng, subcategory, context, item_axis_values)
|
||||
if is_pose_category:
|
||||
source_role_graph = _sanitize_hardcore_environment_anchors(source_role_graph)
|
||||
role_graph = _pov_role_graph_prompt(source_role_graph, pov_character_labels)
|
||||
cast_descriptors: list[str] = []
|
||||
cast_descriptor_text = ""
|
||||
@@ -3880,6 +3946,8 @@ def _build_custom_row(
|
||||
pose = str(_merged_field(category, subcategory, item, "pose", "") or context.get("fallback_pose") or _choose_text(
|
||||
pose_rng, _compatible_entries(_pose_pool(category, subcategory, item, subject_type, poses), women_count, men_count)
|
||||
))
|
||||
if is_pose_category:
|
||||
pose = _sanitize_hardcore_environment_anchors(pose)
|
||||
expression_pool = _expression_pool(category, subcategory, item)
|
||||
if expression_disabled:
|
||||
expression = ""
|
||||
@@ -3914,6 +3982,8 @@ def _build_custom_row(
|
||||
composition_rng,
|
||||
_compatible_entries(_composition_pool(category, subcategory, item, subject_type), women_count, men_count),
|
||||
)
|
||||
if is_pose_category:
|
||||
source_composition = _sanitize_hardcore_environment_anchors(source_composition)
|
||||
composition = _pov_composition_prompt(source_composition, pov_character_labels)
|
||||
|
||||
negative_prompt = str(_merged_field(category, subcategory, item, "negative_prompt", g.NEGATIVE_PROMPT))
|
||||
@@ -4218,7 +4288,7 @@ def build_prompt_from_configs(
|
||||
|
||||
|
||||
INSTA_OF_SOFT_LEVELS = {
|
||||
"social_tease": "Instagram-style thirst-trap post, suggestive but non-explicit, polished social feed energy",
|
||||
"social_tease": "Instagram-style thirst-trap post, suggestive polished social feed energy",
|
||||
"lingerie_tease": "premium OF teaser set, lingerie-focused, sensual and intimate",
|
||||
"implied_nude": "implied nude creator set, strategically covered body and intimate teaser framing",
|
||||
"explicit_tease": "stronger adult teaser set with bolder nude-adjacent styling and solo-tease framing",
|
||||
@@ -4281,11 +4351,11 @@ INSTA_OF_SOFTCORE_OUTFITS = {
|
||||
"silk slip dress with thin straps, thigh slit, and subtle lace trim",
|
||||
"matching balconette bra and brief set under a loosely draped satin robe",
|
||||
"velvet lingerie set with covered cups, garter belt, sheer stockings, and small gold accents",
|
||||
"mesh robe over a covered lace teddy, styled as a premium non-explicit teaser",
|
||||
"mesh robe over a covered lace teddy, styled as a premium creator teaser",
|
||||
"structured corset top with opaque panels, matching briefs, and sheer stockings",
|
||||
],
|
||||
"implied_nude": [
|
||||
"oversized white shirt slipping off one shoulder, body mostly covered, bare legs, and soft sheets",
|
||||
"oversized white shirt slipping off one shoulder, body mostly covered, bare legs, and soft creator-shot styling",
|
||||
"towel wrap held across the chest and hips, implied nude but fully covered",
|
||||
"satin sheet wrapped around the body with shoulders and legs visible but intimate areas covered",
|
||||
"open robe held closed by hand, implied nude beneath without explicit exposure",
|
||||
@@ -4295,18 +4365,18 @@ INSTA_OF_SOFTCORE_OUTFITS = {
|
||||
"explicit_tease": [
|
||||
"sheer robe over matching lingerie with intimate areas obscured by lace pattern and pose",
|
||||
"wet-look bodysuit with opaque panels, high-cut legs, and glossy club-light styling",
|
||||
"transparent mesh dress over covered lingerie, posed as an adult teaser without sex act",
|
||||
"transparent mesh dress over covered lingerie, posed as an adult creator teaser",
|
||||
"lace teddy with strategic opaque embroidery, garter straps, and sheer stockings",
|
||||
"bare-shoulder robe opened around covered lingerie, explicit adult tease without partnered contact",
|
||||
"bare-shoulder robe opened around covered lingerie, bold solo adult tease",
|
||||
"strappy lingerie set with covered cups and high-waisted bottoms, styled as a stronger solo teaser",
|
||||
],
|
||||
"explicit_nude": [
|
||||
"body fully exposed with jewelry accents and direct adult selfie confidence",
|
||||
"mirror-selfie body exposure with jewelry accents and bold creator-shot framing",
|
||||
"body fully exposed on soft sheets with direct eye contact",
|
||||
"body fully exposed with direct eye contact and soft creator-shot styling",
|
||||
"vanity-mirror body exposure with necklace detail and premium creator-shot styling",
|
||||
"shower-afterglow body exposure with wet hair, skin highlights, and phone-shot framing",
|
||||
"bedroom body exposure with one hand holding the phone and direct camera awareness",
|
||||
"indoor body exposure with one hand holding the phone and direct camera awareness",
|
||||
],
|
||||
}
|
||||
|
||||
@@ -4314,40 +4384,40 @@ INSTA_OF_SOFTCORE_POSES = {
|
||||
"social_tease": [
|
||||
"taking a mirror selfie with one hip angled and relaxed social-feed confidence",
|
||||
"leaning against a doorway with one hand holding the phone and a casual teasing smile",
|
||||
"sitting on the edge of the bed for a polished outfit-check selfie",
|
||||
"sitting casually for a polished outfit-check selfie",
|
||||
"standing by the window with shoulders relaxed and body angled toward the phone",
|
||||
"posing in a clean feed-post stance with one hand at the waist",
|
||||
"stretching one arm above the head in a casual morning selfie pose",
|
||||
],
|
||||
"lingerie_tease": [
|
||||
"taking a mirror lingerie selfie with one hip angled and the outfit clearly visible",
|
||||
"kneeling on the bed in a covered lingerie teaser pose with hands kept on fabric",
|
||||
"leaning against the vanity with the robe draped around covered lingerie",
|
||||
"kneeling in a covered lingerie teaser pose with hands resting on fabric",
|
||||
"leaning with the robe draped around covered lingerie",
|
||||
"standing in a three-quarter lingerie outfit-check pose with legs softly crossed",
|
||||
"sitting on the bed with stockings and garter details visible, non-explicit and posed",
|
||||
"sitting with stockings and garter details visible in a controlled teaser pose",
|
||||
"turning slightly over one shoulder to show the lingerie silhouette",
|
||||
],
|
||||
"implied_nude": [
|
||||
"holding the towel or sheet securely in place while posing for an implied nude selfie",
|
||||
"sitting under soft sheets with shoulders visible and the body strategically covered",
|
||||
"standing by the bathroom mirror with a towel wrapped around the body",
|
||||
"reclining under a satin sheet with intimate areas fully obscured",
|
||||
"sitting with soft fabric wrapped securely around the body and shoulders visible",
|
||||
"standing by a mirror with a towel wrapped around the body",
|
||||
"reclining under satin fabric with intimate areas fully obscured",
|
||||
"holding an open robe closed in a covered implied nude teaser pose",
|
||||
"looking into the phone camera while wrapped in a blanket with bare shoulders visible",
|
||||
],
|
||||
"explicit_tease": [
|
||||
"posing in a stronger adult teaser stance with covered lingerie and no partnered contact",
|
||||
"kneeling on the bed with a sheer robe arranged around covered lingerie",
|
||||
"standing close to the mirror with the outfit framed boldly but non-explicitly",
|
||||
"posing in a stronger adult teaser stance with covered lingerie and direct camera awareness",
|
||||
"kneeling with a sheer robe arranged around covered lingerie",
|
||||
"standing close to the mirror with the outfit framed boldly",
|
||||
"leaning forward slightly with hands on the robe and intimate areas obscured",
|
||||
"sitting at the vanity in a bolder covered lingerie pose with direct eye contact",
|
||||
"sitting in a bolder covered lingerie pose with direct eye contact",
|
||||
"arching subtly in a solo adult tease while the styling keeps explicit anatomy obscured",
|
||||
],
|
||||
"explicit_nude": [
|
||||
"taking a bold mirror selfie with direct eye contact and the body clearly framed",
|
||||
"posing on the bed with body fully exposed and jewelry accents as styling",
|
||||
"standing at the vanity with body fully exposed in a premium creator-shot pose",
|
||||
"reclining on soft sheets with body fully exposed and the phone held close",
|
||||
"posing with body fully exposed and jewelry accents as styling",
|
||||
"standing with body fully exposed in a premium creator-shot pose",
|
||||
"reclining with body fully exposed and the phone held close",
|
||||
"turning slightly in a mirror pose with the body framed head-to-thigh",
|
||||
"kneeling in a controlled adult teaser pose with body fully exposed and direct phone-camera awareness",
|
||||
],
|
||||
@@ -4592,14 +4662,14 @@ def _insta_of_prompt_cast_descriptors(text: str) -> str:
|
||||
|
||||
|
||||
SOFTCORE_CAST_POSES = [
|
||||
"standing together for a mirror selfie with bodies close but no sexual contact",
|
||||
"standing together for a mirror selfie with relaxed close body language",
|
||||
"posing shoulder-to-shoulder in a creator-shot group teaser",
|
||||
"leaning together on the bed in a non-explicit subscriber preview",
|
||||
"sitting close together with hands kept above clothing",
|
||||
"arranged around Woman A in a flirtatious non-explicit teaser pose",
|
||||
"leaning together in a polished subscriber preview",
|
||||
"sitting close together with relaxed hands and styled outfit visibility",
|
||||
"arranged around Woman A in a flirtatious creator-teaser pose",
|
||||
"posing together as a coordinated adult creator set",
|
||||
"standing near the phone tripod with relaxed teasing body language",
|
||||
"framed together in a softcore cast reveal with no sex act",
|
||||
"framed together in a softcore cast reveal",
|
||||
]
|
||||
|
||||
|
||||
@@ -4887,16 +4957,16 @@ def build_insta_of_pair(
|
||||
soft_cast = (
|
||||
"solo creator setup with Woman A alone"
|
||||
if options["softcore_cast"] == "solo"
|
||||
else f"non-explicit teaser setup with {_insta_of_cast_phrase(hard_women_count, hard_men_count)}"
|
||||
else f"soft creator-teaser setup with {_insta_of_cast_phrase(hard_women_count, hard_men_count)}"
|
||||
)
|
||||
soft_cast_presence = (
|
||||
(
|
||||
"Frame Woman A from the POV participant's first-person camera in a non-explicit teaser setup; "
|
||||
"Frame Woman A from the POV participant's first-person camera in a soft creator-teaser setup; "
|
||||
"keep the POV participant off-camera as the viewpoint and implied by camera perspective or foreground cues. "
|
||||
)
|
||||
if options["softcore_cast"] == "same_as_hardcore" and pov_character_labels
|
||||
else (
|
||||
"Place Woman A and the listed partners together in a non-explicit teaser pose with no sex act or genital contact. "
|
||||
"Place Woman A and the listed partners together in a soft creator-teaser pose. "
|
||||
if options["softcore_cast"] == "same_as_hardcore"
|
||||
else "Keep the softcore version focused on Woman A alone. "
|
||||
)
|
||||
@@ -4947,7 +5017,7 @@ def build_insta_of_pair(
|
||||
f"{_labeled_expression_sentence('Facial expression', soft_row.get('expression'))}"
|
||||
f"Composition: {soft_row['composition']}. "
|
||||
f"{soft_camera_sentence}"
|
||||
"Keep the softcore version seductive, creator-shot, and non-explicit. "
|
||||
"Keep the softcore version seductive, creator-shot, and styled as a soft teaser. "
|
||||
f"{soft_row['positive_suffix']}."
|
||||
)
|
||||
hard_prompt = (
|
||||
|
||||
Reference in New Issue
Block a user