diff --git a/dumas_h3_longvideos.py b/dumas_h3_longvideos.py index 9e1e54f..5cc4d23 100644 --- a/dumas_h3_longvideos.py +++ b/dumas_h3_longvideos.py @@ -4462,25 +4462,46 @@ def _slot_refs_for_text(text, ref_slots): return refs -def _named_character_refs_for_text(text, ref_slots): - haystack = str(text or "") - matched = [] - for slot_number, raw in enumerate(ref_slots or [], 1): - ref = _reference_slot(raw, slot_number) +def _named_character_refs_for_text(text, ref_slots): + haystack = str(text or "") + matched = [] + for slot_number, raw in enumerate(ref_slots or [], 1): + ref = _reference_slot(raw, slot_number) if ref.get("kind") != "character" or _reference_image(ref) is None: continue for name in _reference_name_keys(ref): if re.search(r"\b" + re.escape(name) + r"\b", haystack, re.I): - matched.append((slot_number, ref)) - break - return matched - - -def _matched_reference_slots(text, ref_slots): - matched = [] - seen = set() - for slot_number, ref in _slot_refs_for_text(text, ref_slots) + _named_character_refs_for_text(text, ref_slots): - if slot_number in seen: + matched.append((slot_number, ref)) + break + return matched + + +def _named_refs_for_text(text, ref_slots, kinds=None): + haystack = str(text or "") + matched = [] + wanted = {str(k).strip().lower() for k in (kinds or ()) if str(k).strip()} + by_name = {} + for slot_number, ref in enumerate(ref_slots or [], 1): + if ref is None or _reference_image(ref) is None: + continue + if wanted and str(ref.get("kind") or "").strip().lower() not in wanted: + continue + for name in _reference_name_keys(ref): + by_name.setdefault(name.lower(), []).append((slot_number, ref, name)) + for entries in by_name.values(): + if len(entries) != 1: + continue + slot_number, ref, name = entries[0] + if re.search(r"\b" + re.escape(name) + r"\b", haystack, re.I): + matched.append((slot_number, ref)) + return matched + + +def _matched_reference_slots(text, ref_slots): + matched = [] + seen = set() + for slot_number, ref in _slot_refs_for_text(text, ref_slots) + _named_character_refs_for_text(text, ref_slots): + if slot_number in seen: continue seen.add(slot_number) matched.append((slot_number, ref))