Improve POV outercourse positioning

This commit is contained in:
2026-06-25 16:17:19 +02:00
parent 186f225778
commit cd076b3c02
3 changed files with 84 additions and 32 deletions
+30 -15
View File
@@ -468,29 +468,37 @@ def _pov_hardcore_pose_sentence(
details = _pov_clean_detail(action_text.split(";", 1)[1], f"{context} {base}", detail_density)
return f"{base}; {details}" if details else base
def outercourse_sentence(base: str) -> str:
return _clean(base).rstrip(".")
if _is_outercourse_text(context, action_lower):
if any(term in context for term in ("boobjob", "titjob", "breast sex", "breast-sex")):
return sentence(
"POV breast-sex position: the viewer reclines with his hips in the foreground while the woman kneels between his thighs; "
"her hands press both breasts around the viewer's penis with the glans near her mouth"
return outercourse_sentence(
"The woman kneels low between the viewer's thighs, chest directly over his pelvis; "
"both hands press her breasts tightly around the viewer's penis, with the shaft vertical in the lower foreground and the glans just below her lips"
)
if any(term in context for term in ("testicle", "balls licking", "balls-licking", "balls and mouth")):
return sentence(
"POV testicle-sucking position: the viewer reclines with thighs open while the woman kneels low between his legs; "
"her mouth and tongue stay at the viewer's balls with his penis visible above her face"
return outercourse_sentence(
"The woman kneels very low between the viewer's thighs, face below the shaft at testicle height; "
"her mouth and tongue contact the viewer's balls while his penis points upward above her forehead in the lower foreground"
)
if any(term in context for term in ("penis licking", "penis-licking", "tongue along", "tongue licking")):
return sentence(
"POV penis-licking position: the viewer's hips and penis are in the foreground while the woman kneels close; "
"her tongue moves along the shaft and glans with her hands steadying the base"
return outercourse_sentence(
"The woman kneels close at the viewer's pelvis, face just above his hips; "
"her tongue runs along the underside of the penis from shaft to glans while one hand steadies the base in the lower foreground"
)
if any(term in context for term in ("handjob", "hand job", "hand wrapped", "hand stroking", "manual stimulation")):
return outercourse_sentence(
"The woman kneels close at the viewer's pelvis with her face behind the shaft; "
"one hand wraps around the penis and the other steadies the base as she strokes toward the glans in the lower foreground"
)
if any(term in context for term in ("footjob", "soles", "toes curled", "feet stroking")):
return sentence(
"POV footjob position: the viewer reclines with his penis in the foreground while the woman faces him; "
"her soles wrap around the shaft and stroke it with the contact point centered"
return outercourse_sentence(
"The woman faces the viewer with both legs raised toward the camera; "
"her soles wrap around the penis in the lower foreground, toes curled around the shaft with her face visible beyond the contact"
)
return sentence(
"POV non-penetrative outercourse position: the viewer's hips stay in the foreground while the woman keeps the visible contact point centered"
return outercourse_sentence(
"The woman stays close to the viewer's pelvis, keeping the non-penetrative contact centered in the lower foreground with her face visible behind the contact"
)
penetrative_tokens = (
"penetrat",
@@ -687,7 +695,7 @@ def _clothing_access_phrase(action_text: Any) -> str:
text = _clean(action_text).lower()
if any(term in text for term in ("cumshot", "ejaculat", "semen", "cum on", "cum across", "post-orgasm", "aftermath")):
return "leaving the body exposed for visible semen and aftermath"
if any(term in text for term in ("boobjob", "titjob", "breast sex", "footjob", "testicle", "balls", "penis licking", "non-penetrative")):
if any(term in text for term in ("boobjob", "titjob", "breast sex", "handjob", "hand job", "footjob", "testicle", "balls", "penis licking", "non-penetrative")):
return "leaving the contact point unobstructed"
if any(term in text for term in ("oral", "blowjob", "fellatio", "mouth", "tongue")):
return "leaving the oral contact unobstructed"
@@ -791,6 +799,11 @@ def _is_outercourse_text(*parts: Any) -> bool:
"penis licking",
"penis-licking",
"tongue along",
"handjob",
"hand job",
"hand wrapped",
"hand stroking",
"manual stimulation",
"footjob",
"soles",
"toes curled",
@@ -849,6 +862,8 @@ def _hardcore_pose_anchor(role_graph: str, hard_item: str, composition: str = ""
return "testicle-sucking outercourse pose"
if any(term in text for term in ("penis licking", "penis-licking", "tongue along", "tongue licking")):
return "penis-licking outercourse pose"
if any(term in text for term in ("handjob", "hand job", "hand wrapped", "hand stroking", "manual stimulation")):
return "handjob outercourse pose"
if any(term in text for term in ("footjob", "soles", "toes curled", "feet stroking")):
return "footjob outercourse pose"
return "non-penetrative outercourse pose"