Add hardcore action family metadata

This commit is contained in:
2026-06-26 16:38:25 +02:00
parent 0e49aed8ac
commit 8668dfec9d
8 changed files with 237 additions and 60 deletions
+24 -45
View File
@@ -8,13 +8,19 @@ try:
from .krea_action_context import (
axis_values_text,
is_climax_text,
is_foreplay_text,
is_oral_text,
is_outercourse_text,
is_toy_assisted_double_text,
is_vaginal_penetration_text,
normalize_hardcore_detail_density,
)
from .hardcore_action_metadata import (
ACTION_CLIMAX,
ACTION_FOREPLAY,
ACTION_ORAL,
ACTION_OUTERCOURSE,
ACTION_PENETRATION,
ACTION_TOY_DOUBLE,
infer_hardcore_action_family,
normalize_hardcore_action_family,
)
from .krea_detail import limit_detail_for_density
from .krea_action_positions import hardcore_pose_anchor
from .krea_action_details import (
@@ -31,13 +37,19 @@ except ImportError: # Allows local smoke tests with `python -c`.
from krea_action_context import (
axis_values_text,
is_climax_text,
is_foreplay_text,
is_oral_text,
is_outercourse_text,
is_toy_assisted_double_text,
is_vaginal_penetration_text,
normalize_hardcore_detail_density,
)
from hardcore_action_metadata import (
ACTION_CLIMAX,
ACTION_FOREPLAY,
ACTION_ORAL,
ACTION_OUTERCOURSE,
ACTION_PENETRATION,
ACTION_TOY_DOUBLE,
infer_hardcore_action_family,
normalize_hardcore_action_family,
)
from krea_detail import limit_detail_for_density
from krea_action_positions import hardcore_pose_anchor
from krea_action_details import (
@@ -52,15 +64,6 @@ except ImportError: # Allows local smoke tests with `python -c`.
from krea_action_climax import climax_role_graph, dedupe_climax_detail
ACTION_CLIMAX = "climax"
ACTION_FOREPLAY = "foreplay"
ACTION_OUTERCOURSE = "outercourse"
ACTION_ORAL = "oral"
ACTION_PENETRATION = "penetration"
ACTION_TOY_DOUBLE = "toy_double"
ACTION_DEFAULT = "default"
@dataclass(frozen=True)
class HardcoreActionParts:
family: str
@@ -129,32 +132,6 @@ def normalize_toy_double_role_graph(role_graph: str) -> str:
)
def hardcore_action_family(
role_graph: str,
hard_item: str,
composition: str = "",
axis_values: Any = None,
*,
is_climax: bool | None = None,
) -> str:
axis_text = axis_values_text(axis_values)
if is_climax is None:
is_climax = is_climax_text(role_graph, hard_item, composition, axis_text)
if is_climax:
return ACTION_CLIMAX
if is_foreplay_text(role_graph, hard_item, composition, axis_text):
return ACTION_FOREPLAY
if is_outercourse_text(role_graph, hard_item, composition, axis_text):
return ACTION_OUTERCOURSE
if is_oral_text(role_graph, hard_item, composition, axis_text):
return ACTION_ORAL
if is_vaginal_penetration_text(role_graph, hard_item, composition, axis_text):
return ACTION_PENETRATION
if is_toy_assisted_double_text(role_graph, hard_item, composition, axis_text):
return ACTION_TOY_DOUBLE
return ACTION_DEFAULT
def action_detail_for_family(
family: str,
detail: str,
@@ -194,18 +171,20 @@ def resolve_hardcore_action_parts(
composition: str = "",
axis_values: Any = None,
detail_density: str = "balanced",
action_family: Any = "",
) -> HardcoreActionParts:
detail_density = normalize_hardcore_detail_density(detail_density)
role_graph = normalize_hardcore_role_graph(role_graph)
hard_item = _clean(hard_item).rstrip(".")
axis_text = axis_values_text(axis_values)
is_climax = is_climax_text(role_graph, hard_item, composition, axis_text)
forced_family = normalize_hardcore_action_family(action_family)
is_climax = forced_family == ACTION_CLIMAX or is_climax_text(role_graph, hard_item, composition, axis_text)
if is_climax:
role_graph = climax_role_graph(role_graph, hard_item, axis_values)
detail = hardcore_item_detail(hard_item)
anchor = hardcore_pose_anchor(role_graph, hard_item, composition, axis_values)
family = hardcore_action_family(role_graph, hard_item, composition, axis_values, is_climax=is_climax)
family = forced_family or infer_hardcore_action_family(role_graph, hard_item, composition, axis_values, is_climax=is_climax)
if is_toy_assisted_double_text(role_graph, hard_item, composition, axis_text):
role_graph = normalize_toy_double_role_graph(role_graph)