diff --git a/core/acoustid_verification.py b/core/acoustid_verification.py index 77a7311e..f3f9d270 100644 --- a/core/acoustid_verification.py +++ b/core/acoustid_verification.py @@ -330,8 +330,22 @@ class AcoustIDVerification: logger.info(f"AcoustID verification PASSED (scan match) - {msg}") return VerificationResult.PASS, msg - # No match found — this file is likely wrong - # Report what AcoustID thinks the file actually is (top result by score) + # No match found — but if fingerprint score is very high (≥0.95), + # the audio IS correct and the title mismatch is likely a language + # difference (e.g. Japanese kanji vs English title for the same song). + # Skip rather than quarantine a correct file. + if best_score >= 0.95: + top = recordings[0] + msg = ( + f"Title/artist mismatch but fingerprint confidence very high ({best_score:.2f}): " + f"AcoustID='{top.get('title', '?')}' by '{top.get('artist', '?')}', " + f"expected '{expected_track_name}' by '{expected_artist_name}' — " + f"likely same song in different language/script" + ) + logger.info(f"AcoustID verification SKIPPED (high confidence) - {msg}") + return VerificationResult.SKIP, msg + + # Low fingerprint score + no metadata match — file is likely wrong top = recordings[0] top_title = top.get('title', '?') top_artist = top.get('artist', '?') diff --git a/web_server.py b/web_server.py index 65a5bae7..630cda85 100644 --- a/web_server.py +++ b/web_server.py @@ -19009,6 +19009,15 @@ def get_version_info(): "title": "What's New in SoulSync", "subtitle": f"Version {SOULSYNC_VERSION} — Latest Changes", "sections": [ + { + "title": "🔧 Fix AcoustID False Positives for Non-English Tracks", + "description": "AcoustID no longer quarantines correct files when titles are in different languages", + "features": [ + "• High-confidence fingerprint matches (95%+) now SKIP instead of FAIL when title/artist don't match", + "• Prevents Japanese, Chinese, Korean, and other non-Latin tracks from being falsely quarantined", + "• Audio fingerprint confirms the recording is correct — metadata mismatch is just a language difference" + ] + }, { "title": "🔧 Fix Soulseek Junk Tags Surviving Post-Processing", "description": "Tags from Soulseek source files are now wiped to disk immediately, before metadata enhancement", diff --git a/webui/static/helper.js b/webui/static/helper.js index f6bd6e3b..ea4b5f44 100644 --- a/webui/static/helper.js +++ b/webui/static/helper.js @@ -3403,6 +3403,7 @@ function closeHelperSearch() { const WHATS_NEW = { '2.1': [ // Newest features first + { title: 'Fix AcoustID False Positives', desc: 'High-confidence fingerprints no longer quarantine correct files when titles are in different languages' }, { title: 'Fix Junk Tags Surviving', desc: 'Soulseek source tags are now wiped to disk immediately — no more album fragmentation from partial metadata' }, { title: 'Watch All Preview Modal', desc: 'Watch All Unwatched now opens a modal showing which artists will be added before confirming', page: 'library', selector: '#library-watchlist-all-btn' }, { title: 'Fix Watch All Unwatched', desc: 'Watch All Unwatched now works for Deezer users — was silently skipping artists with only Deezer IDs' },