44
55import sys
66import os
7+ import re
78import webbrowser
89import threading
910import time
@@ -60,6 +61,21 @@ def normalize_query(query: str) -> List[str]:
6061 List of query variations to try
6162 """
6263 variations = [query ]
64+
65+ # For RPM/DEB filenames: strip extension and version/arch to get base name
66+ # Example: gimp-3.0.4-8.fc43.x86_64.rpm -> gimp
67+ stripped_ext = re .sub (r"\.(rpm|deb)$" , "" , query )
68+ if stripped_ext != query :
69+ variations .append (stripped_ext )
70+ logger .debug (f"Added no-extension variation: '{ stripped_ext } '" )
71+
72+ # If pattern looks like name-version-arch, strip version/arch segment
73+ match_name_only = re .match (r"^([A-Za-z0-9+_.-]+?)-\d" , stripped_ext )
74+ if match_name_only :
75+ base_name = match_name_only .group (1 )
76+ if base_name not in variations :
77+ variations .append (base_name )
78+ logger .debug (f"Added base-name variation: '{ base_name } '" )
6379
6480 # Add hyphenated version: "jellyfin media player" -> "jellyfin-media-player"
6581 if ' ' in query :
@@ -905,6 +921,9 @@ def search(
905921 query_variations = normalize_query (query_str )
906922 logger .info (f"Searching with { len (query_variations )} query variations: { query_variations } " )
907923
924+ # Use the shortest variation for external sources (pkgs.org) to improve hit rate
925+ pkgs_org_query = min (query_variations , key = len )
926+
908927 results = []
909928 search_errors = []
910929 use_cache = not no_cache
@@ -917,7 +936,7 @@ def async_pkgs_org_search():
917936 nonlocal pkgs_org_results
918937 try :
919938 logger .debug ("Background pkgs.org search started" )
920- pkgs_org_results = search_pkgs_org (query_str , detected , limit = 10 )
939+ pkgs_org_results = search_pkgs_org (pkgs_org_query , detected , limit = 10 )
921940 logger .debug (f"Background pkgs.org search completed: { len (pkgs_org_results )} results" )
922941 except Exception as e :
923942 logger .debug (f"Background pkgs.org search failed: { e } " )
0 commit comments