diff --git a/server.py b/server.py index f2ec2ce..cc21fdc 100644 --- a/server.py +++ b/server.py @@ -228,10 +228,20 @@ def parse_stash_scene_data(scene, match_strategy='exact_path'): 'matchStrategy': match_strategy } +def clean_torrent_title_for_stash(raw_title): + t = re.sub(r'\.(mp4|mkv|avi|mov|wmv|ts|flv)$', '', raw_title or '', flags=re.IGNORECASE) + t = re.sub(r'\[.*?\]|\(.*?\)', ' ', t) + t = re.sub(r'\b(1080p|720p|2160p|4k|hd|hevc|x265|x264|rarbg|yify|vixen|brazzers|puretaboo|brattysis|team.skeet)\b', ' ', t, flags=re.IGNORECASE) + t = re.sub(r'[\.\-_]+', ' ', t) + return ' '.join(t.split()) + def query_stash_single(file_name, file_path=None, item_type='smb', stash_url=None): - basename = os.path.basename(file_path or file_name) + raw_name = file_name or os.path.basename(file_path or '') + basename = os.path.basename(file_path or file_name or '') + stash_paths = [ f'/data/videodownloader/{basename}', + f'/data/downloads/{basename}', f'/data/{basename}' ] @@ -244,8 +254,10 @@ def query_stash_single(file_name, file_path=None, item_type='smb', stash_url=Non id title performers {{ + id name gender + image_path }} studio {{ name @@ -264,39 +276,45 @@ def query_stash_single(file_name, file_path=None, item_type='smb', stash_url=Non except Exception: pass - # 2. Basename search in Stash - stem = os.path.splitext(basename)[0] - q = f''' - {{ - findScenes(filter: {{q: {json.dumps(stem[:35])}, per_page: 3}}) {{ - scenes {{ - id - title - files {{ - basename - }} - performers {{ - name - gender - }} - studio {{ - name + # 2. Cleaned Title / Keyword search in Stash (especially effective for torrent names) + cleaned_title = clean_torrent_title_for_stash(raw_name) + search_queries = [cleaned_title[:40], os.path.splitext(basename)[0][:35]] + for sq in search_queries: + if not sq or len(sq) < 3: + continue + q = f''' + {{ + findScenes(filter: {{q: {json.dumps(sq)}, per_page: 3}}) {{ + scenes {{ + id + title + files {{ + basename + }} + performers {{ + id + name + gender + image_path + }} + studio {{ + name + }} + }} }} }} - }} - }} - ''' - try: - res = execute_stash_graphql(q, stash_url, timeout=3) - scenes = res.get('data', {}).get('findScenes', {}).get('scenes', []) - if scenes: - for s in scenes: - if s.get('performers'): - parsed = parse_stash_scene_data(s, 'fuzzy_match') - if parsed: - return parsed - except Exception: - pass + ''' + try: + res = execute_stash_graphql(q, stash_url, timeout=3) + scenes = res.get('data', {}).get('findScenes', {}).get('scenes', []) + if scenes: + for s in scenes: + if s.get('performers'): + parsed = parse_stash_scene_data(s, 'title_match') + if parsed: + return parsed + except Exception: + pass return None