Helper V2 complete + enrichment worker fixes
Helper system phases 2-7: - Setup Progress: onboarding checklist with progress ring, auto-detection via /status, /api/settings, /api/library, /api/watchlist, /api/automations - Quick Actions: accent pill buttons in popovers (service cards get "Open Settings" and "View Docs" actions) - Keyboard Shortcuts: full-screen overlay with key cap styling, grouped by scope (Global, Player, Helper, Forms) - Search: fuzzy search across 200+ help entries, 11 tours, and shortcuts with cross-page navigation via _guessPageFromSelector() - What's New: version-tagged highlights with "Show me" navigation, red badge on ? button for unseen versions, older version cycling - Troubleshoot: scans dashboard service cards for disconnected/error states, shows fix steps with action buttons, "All Clear" when healthy - Contextual menu: page-aware tour suggestion at top of menu - Ctrl+K / Cmd+K opens helper search globally - First-launch welcome tooltip with pulsing ? button - Redesigned floating button (48px, accent gradient, glass effect) - Redesigned menu (unified card panel, accent left-stripe on contextual) Enrichment worker fixes: - AcoustID: individual recording matches downgraded INFO→DEBUG to reduce log noise (14 lines for one track → 1 summary line) - Name normalization: strip " - Suffix" dash format (Spotify) same as "(Suffix)" parens format across all 8 workers. Fixes false mismatch on tracks like "Electric Eyes (Studio Brussels Remix)" vs "Electric Eyes - Studio Brussels Remix" (was 0.54, now matches)
This commit is contained in:
parent
019d485e2a
commit
c1287f0ec0
11 changed files with 2017 additions and 30 deletions
|
|
@ -422,7 +422,7 @@ class AcoustIDClient:
|
|||
'artist': artist,
|
||||
'score': score,
|
||||
})
|
||||
logger.info(f"Found match: {title} by {artist} (MBID: {recording_id}, score: {score})")
|
||||
logger.debug(f"Found match: {title} by {artist} (MBID: {recording_id}, score: {score})")
|
||||
|
||||
if not recordings:
|
||||
logger.info(f"No AcoustID matches found for: {audio_file}")
|
||||
|
|
|
|||
|
|
@ -248,6 +248,7 @@ class AudioDBWorker:
|
|||
def _normalize_name(self, name: str) -> str:
|
||||
"""Normalize artist name for comparison"""
|
||||
name = name.lower().strip()
|
||||
name = re.sub(r'\s+[-–—]\s+.*$', '', name)
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name)
|
||||
name = re.sub(r'[^\w\s]', '', name)
|
||||
name = re.sub(r'\s+', ' ', name).strip()
|
||||
|
|
|
|||
|
|
@ -248,6 +248,7 @@ class DeezerWorker:
|
|||
def _normalize_name(self, name: str) -> str:
|
||||
"""Normalize name for comparison"""
|
||||
name = name.lower().strip()
|
||||
name = re.sub(r'\s+[-–—]\s+.*$', '', name)
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name)
|
||||
name = re.sub(r'[^\w\s]', '', name)
|
||||
name = re.sub(r'\s+', ' ', name).strip()
|
||||
|
|
|
|||
|
|
@ -238,6 +238,7 @@ class GeniusWorker:
|
|||
def _normalize_name(self, name: str) -> str:
|
||||
"""Normalize name for comparison"""
|
||||
name = name.lower().strip()
|
||||
name = re.sub(r'\s+[-–—]\s+.*$', '', name)
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name)
|
||||
name = re.sub(r'\s*\[.*?\]\s*', ' ', name) # Also strip brackets (Genius uses these)
|
||||
name = re.sub(r'\s*feat\.?\s+.*$', '', name) # Strip featuring
|
||||
|
|
|
|||
|
|
@ -902,6 +902,7 @@ class iTunesWorker:
|
|||
|
||||
def _normalize_name(self, name: str) -> str:
|
||||
name = name.lower().strip()
|
||||
name = re.sub(r'\s+[-–—]\s+.*$', '', name)
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name)
|
||||
name = re.sub(r'[^\w\s]', '', name)
|
||||
name = re.sub(r'\s+', ' ', name).strip()
|
||||
|
|
|
|||
|
|
@ -264,6 +264,7 @@ class LastFMWorker:
|
|||
def _normalize_name(self, name: str) -> str:
|
||||
"""Normalize name for comparison"""
|
||||
name = name.lower().strip()
|
||||
name = re.sub(r'\s+[-–—]\s+.*$', '', name)
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name)
|
||||
name = re.sub(r'[^\w\s]', '', name)
|
||||
name = re.sub(r'\s+', ' ', name).strip()
|
||||
|
|
|
|||
|
|
@ -271,6 +271,7 @@ class QobuzWorker:
|
|||
def _normalize_name(self, name: str) -> str:
|
||||
"""Normalize name for comparison"""
|
||||
name = name.lower().strip()
|
||||
name = re.sub(r'\s+[-–—]\s+.*$', '', name)
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name)
|
||||
name = re.sub(r'[^\w\s]', '', name)
|
||||
name = re.sub(r'\s+', ' ', name).strip()
|
||||
|
|
|
|||
|
|
@ -945,7 +945,8 @@ class SpotifyWorker:
|
|||
|
||||
def _normalize_name(self, name: str) -> str:
|
||||
name = name.lower().strip()
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name)
|
||||
name = re.sub(r'\s+[-–—]\s+.*$', '', name) # Strip " - Remix/Edit/etc" suffixes (Spotify format)
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name) # Strip "(Remix/Edit/etc)" parentheticals
|
||||
name = re.sub(r'[^\w\s]', '', name)
|
||||
name = re.sub(r'\s+', ' ', name).strip()
|
||||
return name
|
||||
|
|
|
|||
|
|
@ -283,6 +283,7 @@ class TidalWorker:
|
|||
def _normalize_name(self, name: str) -> str:
|
||||
"""Normalize name for comparison"""
|
||||
name = name.lower().strip()
|
||||
name = re.sub(r'\s+[-–—]\s+.*$', '', name)
|
||||
name = re.sub(r'\s*\(.*?\)\s*', ' ', name)
|
||||
name = re.sub(r'[^\w\s]', '', name)
|
||||
name = re.sub(r'\s+', ' ', name).strip()
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue