From 966b318d9e2a3d18ebee1c01d7ac3fcd1cdf727f Mon Sep 17 00:00:00 2001 From: Honey Date: Sun, 26 Jul 2026 23:15:41 +0200 Subject: [PATCH] fix(backend): back-fill the release year from iTunes on single-track downloads MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit embedMetadata already writes date/track/totaltracks/disc, but the single-track path's "album already known" branch back-filled genre/total/disc/duration/track# from iTunes and omitted the year — so a source track without a year got no `date` tag written. Add !meta.year to the fetch trigger and merge genreMeta.year, so the release year is set at download time like the other fields. Co-Authored-By: Claude Opus 4.8 --- backend/novasonic-server.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/novasonic-server.js b/backend/novasonic-server.js index 925ea2d..bec6f82 100644 --- a/backend/novasonic-server.js +++ b/backend/novasonic-server.js @@ -587,12 +587,13 @@ app.post('/api/download', async (req, res) => { log(jobId, `📋 Album: "${meta.album}"`); // Always fetch iTunes when any field is missing — durationMs is required for the yt-dlp // duration filter; without it any unrelated video that matches the title text gets downloaded. - if (!meta.genre || !meta.totalTracks || !meta.durationMs || !meta.trackNum) { + if (!meta.genre || !meta.totalTracks || !meta.durationMs || !meta.trackNum || !meta.year) { // Strip release-type suffixes before iTunes lookup so "recognize - Single" → "recognize" 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 itunesTitle = title.replace(RELEASE_SUFFIX_RE, '').trim() || title; const genreMeta = await lookupItunesTrackMeta(searchArtist, itunesTitle).catch(() => ({})); if (!meta.genre && genreMeta.genre) { meta.genre = genreMeta.genre; log(jobId, `📋 Genre: "${genreMeta.genre}"`); } + if (!meta.year && genreMeta.year) { meta.year = genreMeta.year; log(jobId, `📋 Jahr: ${genreMeta.year}`); } if (!meta.totalTracks && genreMeta.totalTracks) { meta.totalTracks = genreMeta.totalTracks; } if (!meta.discNum && genreMeta.discNum) { meta.discNum = genreMeta.discNum; } if (!meta.discTotal && genreMeta.discTotal) { meta.discTotal = genreMeta.discTotal; }