Remove softcore and hardcore scene leaks
This commit is contained in:
+80
-10
@@ -41,6 +41,68 @@ def _clean(value: Any) -> str:
|
|||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
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 = _clean(value)
|
||||||
|
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: Any) -> dict[str, str]:
|
||||||
|
if not isinstance(values, dict):
|
||||||
|
return {}
|
||||||
|
return {str(key): _sanitize_hardcore_environment_anchors(value) for key, value in values.items()}
|
||||||
|
|
||||||
|
|
||||||
def _is_false(value: Any) -> bool:
|
def _is_false(value: Any) -> bool:
|
||||||
if isinstance(value, bool):
|
if isinstance(value, bool):
|
||||||
return value is False
|
return value is False
|
||||||
@@ -1435,11 +1497,16 @@ def _normal_row_to_krea(row: dict[str, Any], detail_level: str, style_mode: str)
|
|||||||
cast_labels = _merge_labels(cast_labels, pov_labels)
|
cast_labels = _merge_labels(cast_labels, pov_labels)
|
||||||
expression = _filter_pov_labeled_clauses(expression, pov_labels)
|
expression = _filter_pov_labeled_clauses(expression, pov_labels)
|
||||||
expression = _natural_label_text(expression, cast_labels)
|
expression = _natural_label_text(expression, cast_labels)
|
||||||
role_graph = _sanitize_scene_text_for_cast(row.get("source_role_graph") or row.get("role_graph"), cast_labels)
|
composition = _sanitize_hardcore_environment_anchors(composition)
|
||||||
item = _sanitize_scene_text_for_cast(item, cast_labels)
|
source_composition = _sanitize_hardcore_environment_anchors(source_composition)
|
||||||
|
role_graph = _sanitize_scene_text_for_cast(
|
||||||
|
_sanitize_hardcore_environment_anchors(row.get("source_role_graph") or row.get("role_graph")),
|
||||||
|
cast_labels,
|
||||||
|
)
|
||||||
|
item = _sanitize_scene_text_for_cast(_sanitize_hardcore_environment_anchors(item), cast_labels)
|
||||||
role_graph = _natural_label_text(role_graph, cast_labels)
|
role_graph = _natural_label_text(role_graph, cast_labels)
|
||||||
item = _natural_label_text(item, cast_labels)
|
item = _natural_label_text(item, cast_labels)
|
||||||
axis_values = row.get("item_axis_values") if isinstance(row.get("item_axis_values"), dict) else {}
|
axis_values = _sanitize_hardcore_axis_values(row.get("item_axis_values"))
|
||||||
detail_density = _normalize_hardcore_detail_density(row.get("hardcore_detail_density"))
|
detail_density = _normalize_hardcore_detail_density(row.get("hardcore_detail_density"))
|
||||||
action = _hardcore_action_sentence(role_graph, item, source_composition, axis_values, detail_density)
|
action = _hardcore_action_sentence(role_graph, item, source_composition, axis_values, detail_density)
|
||||||
action = _pov_action_phrase(action, pov_labels)
|
action = _pov_action_phrase(action, pov_labels)
|
||||||
@@ -1526,8 +1593,8 @@ def _insta_pair_to_krea(row: dict[str, Any], detail_level: str, style_mode: str)
|
|||||||
hard_level = _clean(options.get("hardcore_level")).replace("_", " ")
|
hard_level = _clean(options.get("hardcore_level")).replace("_", " ")
|
||||||
same_room = options.get("continuity") == "same_creator_same_room"
|
same_room = options.get("continuity") == "same_creator_same_room"
|
||||||
hard_scene = soft.get("scene_text") if same_room and soft.get("scene_text") else hard.get("scene_text")
|
hard_scene = soft.get("scene_text") if same_room and soft.get("scene_text") else hard.get("scene_text")
|
||||||
hard_composition = hard.get("composition")
|
hard_composition = _sanitize_hardcore_environment_anchors(hard.get("composition"))
|
||||||
hard_source_composition = hard.get("source_composition") or hard_composition
|
hard_source_composition = _sanitize_hardcore_environment_anchors(hard.get("source_composition") or hard_composition)
|
||||||
pov_labels = _merge_labels(
|
pov_labels = _merge_labels(
|
||||||
_pov_labels_from_value(row.get("pov_character_labels")),
|
_pov_labels_from_value(row.get("pov_character_labels")),
|
||||||
_pov_labels_from_value(soft.get("pov_character_labels")),
|
_pov_labels_from_value(soft.get("pov_character_labels")),
|
||||||
@@ -1545,11 +1612,14 @@ def _insta_pair_to_krea(row: dict[str, Any], detail_level: str, style_mode: str)
|
|||||||
hard_cast_prose, hard_labels = _cast_prose(cast_descriptor_text, omit_labels=pov_labels)
|
hard_cast_prose, hard_labels = _cast_prose(cast_descriptor_text, omit_labels=pov_labels)
|
||||||
soft_labels = _merge_labels(soft_labels, pov_labels if options.get("softcore_cast") == "same_as_hardcore" else [])
|
soft_labels = _merge_labels(soft_labels, pov_labels if options.get("softcore_cast") == "same_as_hardcore" else [])
|
||||||
hard_labels = _merge_labels(hard_labels, pov_labels)
|
hard_labels = _merge_labels(hard_labels, pov_labels)
|
||||||
hard_item = _sanitize_scene_text_for_cast(hard.get("item"), hard_labels)
|
hard_item = _sanitize_scene_text_for_cast(_sanitize_hardcore_environment_anchors(hard.get("item")), hard_labels)
|
||||||
hard_role_graph = _sanitize_scene_text_for_cast(hard.get("source_role_graph") or hard.get("role_graph"), hard_labels)
|
hard_role_graph = _sanitize_scene_text_for_cast(
|
||||||
|
_sanitize_hardcore_environment_anchors(hard.get("source_role_graph") or hard.get("role_graph")),
|
||||||
|
hard_labels,
|
||||||
|
)
|
||||||
hard_item = _natural_label_text(hard_item, hard_labels)
|
hard_item = _natural_label_text(hard_item, hard_labels)
|
||||||
hard_role_graph = _natural_label_text(hard_role_graph, hard_labels)
|
hard_role_graph = _natural_label_text(hard_role_graph, hard_labels)
|
||||||
hard_axis_values = hard.get("item_axis_values") if isinstance(hard.get("item_axis_values"), dict) else {}
|
hard_axis_values = _sanitize_hardcore_axis_values(hard.get("item_axis_values"))
|
||||||
hard_detail_density = _normalize_hardcore_detail_density(
|
hard_detail_density = _normalize_hardcore_detail_density(
|
||||||
hard.get("hardcore_detail_density") or row.get("hardcore_detail_density") or options.get("hardcore_detail_density")
|
hard.get("hardcore_detail_density") or row.get("hardcore_detail_density") or options.get("hardcore_detail_density")
|
||||||
)
|
)
|
||||||
@@ -1566,12 +1636,12 @@ def _insta_pair_to_krea(row: dict[str, Any], detail_level: str, style_mode: str)
|
|||||||
soft_output_composition = _pov_composition_text(soft.get("composition"), pov_labels if same_soft_cast else [])
|
soft_output_composition = _pov_composition_text(soft.get("composition"), pov_labels if same_soft_cast else [])
|
||||||
if same_soft_cast and pov_labels:
|
if same_soft_cast and pov_labels:
|
||||||
soft_cast_presence = (
|
soft_cast_presence = (
|
||||||
"the woman is framed from the POV participant's first-person camera in a non-explicit teaser pose, "
|
"the woman is framed from the POV participant's first-person camera in a soft creator-teaser pose, "
|
||||||
"with the POV participant kept off-camera as the viewpoint and implied by camera position or foreground cues"
|
"with the POV participant kept off-camera as the viewpoint and implied by camera position or foreground cues"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
soft_cast_presence = (
|
soft_cast_presence = (
|
||||||
f"{_label_join(soft_labels)} are together in a non-explicit teaser pose, with no sex act or genital contact"
|
f"{_label_join(soft_labels)} share the frame in a soft creator-teaser pose"
|
||||||
if same_soft_cast
|
if same_soft_cast
|
||||||
else "The image focuses on the woman alone"
|
else "The image focuses on the woman alone"
|
||||||
)
|
)
|
||||||
|
|||||||
+100
-30
@@ -642,6 +642,66 @@ def _heuristic_cast_compatible(text: str, women_count: int, men_count: int) -> b
|
|||||||
return True
|
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:
|
def _compatible_entry(entry: Any, women_count: int, men_count: int) -> bool:
|
||||||
if not isinstance(entry, dict):
|
if not isinstance(entry, dict):
|
||||||
return _heuristic_cast_compatible(_entry_text(entry), women_count, men_count)
|
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"]]))
|
items = _list_from(subcategory.get("items", [subcategory["name"]]))
|
||||||
item = _weighted_choice(content_rng, items)
|
item = _weighted_choice(content_rng, items)
|
||||||
item_text, item_name, item_axis_values = _compose_item(content_rng, category, subcategory, item, women_count, men_count)
|
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"))
|
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)
|
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)
|
character_slots = _parse_character_cast(character_cast)
|
||||||
@@ -3834,6 +3898,8 @@ def _build_custom_row(
|
|||||||
else []
|
else []
|
||||||
)
|
)
|
||||||
source_role_graph = _role_graph(role_rng, subcategory, context, item_axis_values)
|
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)
|
role_graph = _pov_role_graph_prompt(source_role_graph, pov_character_labels)
|
||||||
cast_descriptors: list[str] = []
|
cast_descriptors: list[str] = []
|
||||||
cast_descriptor_text = ""
|
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 = 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)
|
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)
|
expression_pool = _expression_pool(category, subcategory, item)
|
||||||
if expression_disabled:
|
if expression_disabled:
|
||||||
expression = ""
|
expression = ""
|
||||||
@@ -3914,6 +3982,8 @@ def _build_custom_row(
|
|||||||
composition_rng,
|
composition_rng,
|
||||||
_compatible_entries(_composition_pool(category, subcategory, item, subject_type), women_count, men_count),
|
_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)
|
composition = _pov_composition_prompt(source_composition, pov_character_labels)
|
||||||
|
|
||||||
negative_prompt = str(_merged_field(category, subcategory, item, "negative_prompt", g.NEGATIVE_PROMPT))
|
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 = {
|
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",
|
"lingerie_tease": "premium OF teaser set, lingerie-focused, sensual and intimate",
|
||||||
"implied_nude": "implied nude creator set, strategically covered body and intimate teaser framing",
|
"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",
|
"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",
|
"silk slip dress with thin straps, thigh slit, and subtle lace trim",
|
||||||
"matching balconette bra and brief set under a loosely draped satin robe",
|
"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",
|
"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",
|
"structured corset top with opaque panels, matching briefs, and sheer stockings",
|
||||||
],
|
],
|
||||||
"implied_nude": [
|
"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",
|
"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",
|
"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",
|
"open robe held closed by hand, implied nude beneath without explicit exposure",
|
||||||
@@ -4295,18 +4365,18 @@ INSTA_OF_SOFTCORE_OUTFITS = {
|
|||||||
"explicit_tease": [
|
"explicit_tease": [
|
||||||
"sheer robe over matching lingerie with intimate areas obscured by lace pattern and pose",
|
"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",
|
"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",
|
"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",
|
"strappy lingerie set with covered cups and high-waisted bottoms, styled as a stronger solo teaser",
|
||||||
],
|
],
|
||||||
"explicit_nude": [
|
"explicit_nude": [
|
||||||
"body fully exposed with jewelry accents and direct adult selfie confidence",
|
"body fully exposed with jewelry accents and direct adult selfie confidence",
|
||||||
"mirror-selfie body exposure with jewelry accents and bold creator-shot framing",
|
"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",
|
"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",
|
"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": [
|
"social_tease": [
|
||||||
"taking a mirror selfie with one hip angled and relaxed social-feed confidence",
|
"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",
|
"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",
|
"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",
|
"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",
|
"stretching one arm above the head in a casual morning selfie pose",
|
||||||
],
|
],
|
||||||
"lingerie_tease": [
|
"lingerie_tease": [
|
||||||
"taking a mirror lingerie selfie with one hip angled and the outfit clearly visible",
|
"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",
|
"kneeling in a covered lingerie teaser pose with hands resting on fabric",
|
||||||
"leaning against the vanity with the robe draped around covered lingerie",
|
"leaning with the robe draped around covered lingerie",
|
||||||
"standing in a three-quarter lingerie outfit-check pose with legs softly crossed",
|
"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",
|
"turning slightly over one shoulder to show the lingerie silhouette",
|
||||||
],
|
],
|
||||||
"implied_nude": [
|
"implied_nude": [
|
||||||
"holding the towel or sheet securely in place while posing for an implied nude selfie",
|
"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",
|
"sitting with soft fabric wrapped securely around the body and shoulders visible",
|
||||||
"standing by the bathroom mirror with a towel wrapped around the body",
|
"standing by a mirror with a towel wrapped around the body",
|
||||||
"reclining under a satin sheet with intimate areas fully obscured",
|
"reclining under satin fabric with intimate areas fully obscured",
|
||||||
"holding an open robe closed in a covered implied nude teaser pose",
|
"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",
|
"looking into the phone camera while wrapped in a blanket with bare shoulders visible",
|
||||||
],
|
],
|
||||||
"explicit_tease": [
|
"explicit_tease": [
|
||||||
"posing in a stronger adult teaser stance with covered lingerie and no partnered contact",
|
"posing in a stronger adult teaser stance with covered lingerie and direct camera awareness",
|
||||||
"kneeling on the bed with a sheer robe arranged around covered lingerie",
|
"kneeling with a sheer robe arranged around covered lingerie",
|
||||||
"standing close to the mirror with the outfit framed boldly but non-explicitly",
|
"standing close to the mirror with the outfit framed boldly",
|
||||||
"leaning forward slightly with hands on the robe and intimate areas obscured",
|
"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",
|
"arching subtly in a solo adult tease while the styling keeps explicit anatomy obscured",
|
||||||
],
|
],
|
||||||
"explicit_nude": [
|
"explicit_nude": [
|
||||||
"taking a bold mirror selfie with direct eye contact and the body clearly framed",
|
"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",
|
"posing with body fully exposed and jewelry accents as styling",
|
||||||
"standing at the vanity with body fully exposed in a premium creator-shot pose",
|
"standing with body fully exposed in a premium creator-shot pose",
|
||||||
"reclining on soft sheets with body fully exposed and the phone held close",
|
"reclining with body fully exposed and the phone held close",
|
||||||
"turning slightly in a mirror pose with the body framed head-to-thigh",
|
"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",
|
"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 = [
|
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",
|
"posing shoulder-to-shoulder in a creator-shot group teaser",
|
||||||
"leaning together on the bed in a non-explicit subscriber preview",
|
"leaning together in a polished subscriber preview",
|
||||||
"sitting close together with hands kept above clothing",
|
"sitting close together with relaxed hands and styled outfit visibility",
|
||||||
"arranged around Woman A in a flirtatious non-explicit teaser pose",
|
"arranged around Woman A in a flirtatious creator-teaser pose",
|
||||||
"posing together as a coordinated adult creator set",
|
"posing together as a coordinated adult creator set",
|
||||||
"standing near the phone tripod with relaxed teasing body language",
|
"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 = (
|
soft_cast = (
|
||||||
"solo creator setup with Woman A alone"
|
"solo creator setup with Woman A alone"
|
||||||
if options["softcore_cast"] == "solo"
|
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 = (
|
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. "
|
"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
|
if options["softcore_cast"] == "same_as_hardcore" and pov_character_labels
|
||||||
else (
|
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"
|
if options["softcore_cast"] == "same_as_hardcore"
|
||||||
else "Keep the softcore version focused on Woman A alone. "
|
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"{_labeled_expression_sentence('Facial expression', soft_row.get('expression'))}"
|
||||||
f"Composition: {soft_row['composition']}. "
|
f"Composition: {soft_row['composition']}. "
|
||||||
f"{soft_camera_sentence}"
|
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']}."
|
f"{soft_row['positive_suffix']}."
|
||||||
)
|
)
|
||||||
hard_prompt = (
|
hard_prompt = (
|
||||||
|
|||||||
Reference in New Issue
Block a user