Filter out male performers across Stash matching, AI prompts, candidate buttons and Intellisense

This commit is contained in:
david
2026-08-17 09:42:59 -04:00
parent 94872f5ae8
commit d51cfe12d8
2 changed files with 55 additions and 40 deletions
+35 -22
View File
@@ -180,22 +180,26 @@ def parse_stash_scene_data(scene, match_strategy='exact_path'):
if not performers:
return None
females = [p['name'] for p in performers if p.get('gender') == 'FEMALE']
males = [p['name'] for p in performers if p.get('gender') == 'MALE']
others = [p['name'] for p in performers if p.get('gender') not in ('FEMALE', 'MALE')]
females = [p for p in performers if p.get('gender') == 'FEMALE']
non_males = [p for p in performers if p.get('gender') not in ('FEMALE', 'MALE')]
# Priority: Females first as primary, then others, then males
ordered_names = females + others + males
if not ordered_names:
ordered_names = [p['name'] for p in performers]
# Priority: NEVER include male performers if any female or non-male performers are present
eligible_performers = females if females else (non_males if non_males else performers)
formatted_candidates = []
seen = set()
for name in ordered_names:
for p in eligible_performers:
name = p.get('name', '')
fmt = format_performer_slug(name)
if fmt and fmt not in seen:
seen.add(fmt)
formatted_candidates.append({'raw': name, 'formatted': fmt})
formatted_candidates.append({
'raw': name,
'formatted': fmt,
'id': p.get('id'),
'gender': p.get('gender'),
'image': p.get('image_path')
})
if not formatted_candidates:
return None
@@ -217,8 +221,8 @@ def parse_stash_scene_data(scene, match_strategy='exact_path'):
'studio': studio_name,
'primaryPerformer': primary_formatted,
'allPerformers': formatted_candidates,
'femalePerformers': [format_performer_slug(n) for n in females],
'malePerformers': [format_performer_slug(n) for n in males],
'femalePerformers': [p['formatted'] for p in formatted_candidates if p.get('gender') == 'FEMALE'],
'malePerformers': [],
'confidence': 'verified',
'reasoning': reasoning,
'matchStrategy': match_strategy
@@ -781,11 +785,11 @@ class RobustProxyHandler(http.server.SimpleHTTPRequestHandler):
except Exception as e:
print(f"Error merging performers from DB: {e}")
# Also merge performers from Stash database if online
# Also merge female performers from Stash database if online
try:
stash_q = '{ allPerformers { name } }'
res = execute_stash_graphql(stash_q, timeout=2)
for p in res.get('data', {}).get('allPerformers', []):
stash_q = '{ findPerformers(performer_filter: { gender: { value: FEMALE, modifier: EQUALS } }, filter: { per_page: -1 }) { performers { name } } }'
res = execute_stash_graphql(stash_q, timeout=3)
for p in res.get('data', {}).get('findPerformers', {}).get('performers', []):
slug = format_performer_slug(p.get('name'))
if slug:
performers_set.add(slug)
@@ -807,13 +811,22 @@ class RobustProxyHandler(http.server.SimpleHTTPRequestHandler):
p_id = params.get('id', [''])[0]
stash_url = params.get('url', [''])[0]
content_type, img_bytes = fetch_performer_image_data(name, p_id, stash_url)
self.send_response(200)
self.send_header('Content-Type', content_type)
self.send_header('Cache-Control', 'public, max-age=86400')
self.send_cors_headers()
self.end_headers()
self.wfile.write(img_bytes)
try:
content_type, img_bytes = fetch_performer_image_data(name, p_id, stash_url)
self.send_response(200)
self.send_header('Content-Type', content_type)
self.send_header('Cache-Control', 'public, max-age=86400')
self.send_cors_headers()
self.end_headers()
self.wfile.write(img_bytes)
except (BrokenPipeError, ConnectionResetError):
pass
except Exception as e:
try:
self.send_response(500)
self.end_headers()
except Exception:
pass
# ==================== Stash Server API Handlers ====================
def handle_stash_status(self):