diff --git a/backend/lib/ytdlp.js b/backend/lib/ytdlp.js index ffafee1..c58a1cb 100644 --- a/backend/lib/ytdlp.js +++ b/backend/lib/ytdlp.js @@ -110,9 +110,11 @@ async function downloadTrack({ jobId, artist, rawArtist, albumArtist, title, alb const escRe = s => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - // Strip release-type suffixes Spotify sometimes appends to track/album names - // e.g. "recognize - Single" → "recognize", "Blue Moon - EP" → "Blue Moon" - const searchTitle = title.replace(/\s*[-–]\s*(single|ep|album|remaster(?:ed)?|deluxe(?:\s+edition)?|bonus\s+track)s?\s*$/i, '').trim() || title; + // Strip release-type suffixes Spotify appends to track names (e.g. "recognize - Single" → "recognize"). + // Only strip trailing "- word(s)" when those words are release-type qualifiers or bare years, not + // real sub-titles (which tend to be longer phrases or start with "feat"/"ft"). + const RELEASE_SUFFIX_RE = /\s*[-–]\s*(?:(?:official\s+)?(?:music\s+)?(?:single|ep|lp|album|ost|soundtrack|remaster(?:ed)?|deluxe(?:\s+edition)?|bonus\s+tracks?|b-?sides?|version|edit)\b.*|(?:20|19)\d{2})\s*$/i; + const searchTitle = title.replace(RELEASE_SUFFIX_RE, '').trim() || title; const variantFilter = buildVariantFilter(searchTitle); const titleKws = buildTitleKeywords(searchTitle);