Improve oral hardcore pose variation

This commit is contained in:
2026-06-25 01:35:31 +02:00
parent 8ecb1a65c5
commit 0e27f2e5f4
2 changed files with 201 additions and 46 deletions
+59 -20
View File
@@ -55,7 +55,7 @@ HARDCORE_ENVIRONMENT_ANCHOR_REPLACEMENTS = (
(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"\bbed[- ]edge\b", "raised edge"),
(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"),
@@ -544,6 +544,9 @@ def _mentions_rear_entry(text: str) -> bool:
def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = "", axis_values: Any = None) -> str:
text = _position_context_text(role_graph, hard_item, composition, axis_values)
item_text = " ".join(part for part in (_clean(hard_item).lower(), _axis_values_text(axis_values).lower()) if part)
position_text = ""
if isinstance(axis_values, dict):
position_text = _clean(axis_values.get("position", "")).lower()
if not text:
return ""
if _is_toy_assisted_double_text(role_graph, hard_item, composition, _axis_values_text(axis_values)):
@@ -582,10 +585,30 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
if "kneeling" in text:
return "kneeling front-and-back double-penetration pose"
return "front-and-back double-penetration pose"
if "sixty-nine" in text:
if "sixty-nine" in position_text or ("sixty-nine" in text and not position_text):
return "sixty-nine oral pose"
if "face-sitting" in text:
if "face-sitting" in position_text or ("face-sitting" in text and not position_text):
return "face-sitting oral pose"
if "side-lying oral" in position_text or (("side-lying oral position" in item_text or "side-lying oral" in text) and not position_text):
return "side-lying oral pose"
if (
"edge-of-bed oral" in position_text
or "edge-supported oral" in position_text
or (("edge-of-bed oral position" in item_text or "edge-of-bed oral" in text or "edge-supported oral" in text) and not position_text)
):
return "edge-supported oral pose"
if "standing oral" in position_text or (("standing oral position" in item_text or "standing oral" in text) and not position_text):
return "standing oral pose"
if "chair oral" in position_text or (("chair oral position" in item_text or "chair oral" in text) and not position_text):
return "chair oral pose"
if "kneeling oral" in position_text or (("kneeling oral position" in item_text or "kneeling oral" in text) and not position_text):
return "kneeling oral pose"
if "straddled oral" in position_text or (("straddled oral position" in item_text or "straddled oral" in text) and not position_text):
return "straddled cunnilingus pose"
if "reclining cunnilingus" in position_text or (("reclining cunnilingus position" in item_text or "reclining cunnilingus" in text) and not position_text):
return "reclining cunnilingus pose"
if "spread-leg oral" in position_text or (("spread-leg oral position" in item_text or "spread-leg oral" in text) and not position_text):
return "spread-leg oral pose"
if "cunnilingus" in text or "pussy licking" in text or "mouth on her pussy" in text:
if "reclining" in text:
return "reclining cunnilingus pose"
@@ -598,7 +621,7 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
if "spread-leg oral position" in item_text:
return "spread-leg oral pose"
if "edge-of-bed oral position" in item_text:
return "edge-of-bed oral pose"
return "edge-supported oral pose"
if "standing oral position" in item_text:
return "standing oral pose"
if "chair oral position" in item_text:
@@ -610,7 +633,7 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
if "side-lying" in text:
return "side-lying oral pose"
if "edge-of-bed" in text or "bed-edge" in text:
return "edge-of-bed oral pose"
return "edge-supported oral pose"
if "spread-leg" in text:
return "spread-leg oral pose"
if "chair oral" in text:
@@ -660,6 +683,9 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, composition: str = "", axis_values: Any = None) -> str:
text = _position_context_text(anchor, f"{role_graph} {hard_item}", composition, axis_values)
position_text = ""
if isinstance(axis_values, dict):
position_text = _clean(axis_values.get("position", "")).lower()
if not text:
return ""
mixed_woman_man = "the woman" in text and "the man" in text
@@ -671,17 +697,21 @@ def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, com
def double_tail() -> str:
return "" if "toy" in text else ", with the second penetration point aligned"
if "sixty-nine" in text:
if "sixty-nine" in position_text or ("sixty-nine" in text and not position_text):
return cast_phrase(
"with the woman and man inverted head-to-hips so both mouths align with genitals",
"with both bodies inverted head-to-hips so both mouths align with genitals",
)
if "face-sitting" in text:
if "face-sitting" in position_text or ("face-sitting" in text and not position_text):
return cast_phrase(
"with the man lying back while the woman straddles his face",
"with one partner lying back while the other straddles the face",
)
if "reclining cunnilingus" in text or "spread-leg oral" in text:
if (
"reclining cunnilingus" in position_text
or "spread-leg oral" in position_text
or (("reclining cunnilingus" in text or "spread-leg oral" in text) and not position_text)
):
if "takes the man's penis" in text or "penis in her mouth" in text:
return cast_phrase(
"with the man seated with legs apart and the woman positioned at his hips",
@@ -691,22 +721,30 @@ def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, com
"with the woman lying back, thighs spread, and the man positioned between her legs",
"with the receiving partner lying back, thighs spread, and the giver positioned between the legs",
)
if "straddled cunnilingus" in text or "straddled oral" in text:
if (
"straddled oral" in position_text
or (("straddled cunnilingus" in text or "straddled oral" in text) and not position_text)
):
return cast_phrase(
"with the woman straddling above the man's mouth and her thighs framing his face",
"with the receiver straddling above the giver's mouth",
)
if "edge-of-bed oral" in text:
if (
"edge-of-bed oral" in position_text
or "edge-supported oral" in position_text
or ("edge-of-bed oral" in text and not position_text)
or ("edge-supported oral" in text and not position_text)
):
if "takes the man's penis" in text or "penis in her mouth" in text:
return cast_phrase(
"with the man at the bed edge and the woman kneeling at his hips",
"with the receiver at the bed edge and the giver positioned at hip height",
"with the man at a raised edge and the woman kneeling at his hips",
"with the receiver at a raised edge and the giver positioned at hip height",
)
return cast_phrase(
"with the woman lying at the bed edge and the man positioned between her open thighs",
"with the receiver lying at the bed edge and the giver positioned between open thighs",
"with the woman lying at a raised edge and the man positioned between her open thighs",
"with the receiver lying at a raised edge and the giver positioned between open thighs",
)
if "standing oral" in text:
if "standing oral" in position_text or ("standing oral" in text and not position_text):
if "takes the man's penis" in text or "penis in her mouth" in text:
return cast_phrase(
"with the man standing and the woman kneeling in front of his hips",
@@ -716,7 +754,7 @@ def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, com
"with the woman standing braced and the man kneeling between her thighs",
"with the receiver standing braced and the giver kneeling between the thighs",
)
if "chair oral" in text:
if "chair oral" in position_text or ("chair oral" in text and not position_text):
if "takes the man's penis" in text or "penis in her mouth" in text:
return cast_phrase(
"with the man seated in the chair and the woman kneeling between his legs at hip level",
@@ -726,9 +764,9 @@ def _hardcore_pose_arrangement(anchor: str, role_graph: str, hard_item: str, com
"with one partner seated in a chair and the other kneeling between the open thighs",
"with the receiver seated in a chair and the giver kneeling between the open thighs",
)
if "side-lying oral" in text:
if "side-lying oral" in position_text or ("side-lying oral" in text and not position_text):
return "with both bodies lying on their sides and mouth aligned to genitals"
if "kneeling oral" in text:
if "kneeling oral" in position_text or ("kneeling oral" in text and not position_text):
if "takes the man's penis" in text or "penis in her mouth" in text:
return cast_phrase(
"with the woman kneeling in front of the man's hips, her mouth at penis level",
@@ -917,7 +955,7 @@ def _hardcore_item_detail(hard_item: str) -> str:
r"missionary position|cowgirl position|reverse cowgirl position|doggy style position|"
r"standing sex position|spooning sex position|edge-of-bed position|kneeling straddle position|"
r"lotus sex position|bent-over position|kneeling oral position|face-sitting position|"
r"sixty-nine position|edge-of-bed oral position|standing oral position|reclining cunnilingus position|"
r"sixty-nine position|edge-of-bed oral position|edge-supported oral position|standing oral position|reclining cunnilingus position|"
r"straddled oral position|side-lying oral position|spread-leg oral position|chair oral position"
)
text = re.sub(
@@ -962,7 +1000,8 @@ def _dedupe_hardcore_detail(detail: str, anchor: str) -> str:
r"spread-leg oral position",
r"chair oral position",
),
"edge-of-bed oral": (r"edge-of-bed oral position",),
"edge-supported oral": (r"edge-of-bed oral position", r"edge-supported oral position"),
"edge-of-bed oral": (r"edge-of-bed oral position", r"edge-supported oral position"),
"standing oral": (r"standing oral position",),
"spread-leg oral": (r"spread-leg oral position",),
"chair oral": (r"chair oral position",),