diff --git a/src/renderer/features/albums/components/album-detail-header.tsx b/src/renderer/features/albums/components/album-detail-header.tsx index e2dae4212..a61da54eb 100644 --- a/src/renderer/features/albums/components/album-detail-header.tsx +++ b/src/renderer/features/albums/components/album-detail-header.tsx @@ -100,27 +100,55 @@ export const AlbumDetailHeader = forwardRef((_props, ref) => { const originalDifferentFromRelease = album?.originalDate && album?.originalDate !== album?.releaseDate; + const originalYearDifferentFromRelease = album?.originalYear !== album?.releaseYear; + const playCount = album?.playCount; const releasePrefix = originalDifferentFromRelease ? t('page.albumDetail.released', { postProcess: 'sentenceCase' }) : '♫'; - if (originalDifferentFromRelease && album.originalDate) { - items.push({ - id: 'originalDate', - value: `♫ ${formatDateAbsoluteUTC(album.originalDate)}`, - }); + const releaseYearPrefix = originalYearDifferentFromRelease + ? t('page.albumDetail.released', { postProcess: 'sentenceCase' }) + : '♫'; + + if (album.originalDate) { + if (originalDifferentFromRelease) { + items.push({ + id: 'originalDate', + value: `♫ ${formatDateAbsoluteUTC(album.originalDate)}`, + }); + } + + if (releaseDate) { + items.push({ + id: 'releaseDate', + value: `${releasePrefix} ${formatDateAbsoluteUTC(releaseDate)}`, + }); + } + } else if (album.originalYear) { + if (originalYearDifferentFromRelease) { + items.push({ + id: 'originalYear', + value: `♫ ${album.originalYear}`, + }); + } + + if (releaseDate) { + items.push({ + id: 'releaseDate', + value: `${releaseYearPrefix} ${formatDateAbsoluteUTC(releaseDate)}`, + }); + } else if (releaseYear) { + items.push({ + id: 'releaseYear', + value: `${releaseYearPrefix} ${releaseYear}`, + }); + } } items.push( ...[ - { - id: 'releaseDate', - value: releaseDate - ? `${releasePrefix} ${formatDateAbsoluteUTC(releaseDate)}` - : releaseYear, - }, { id: 'songCount', value: t('entity.trackWithCount', { count: detailQuery?.data?.songCount || 0 }), diff --git a/src/shared/api/navidrome/navidrome-normalize.ts b/src/shared/api/navidrome/navidrome-normalize.ts index c52891a85..45fb9169f 100644 --- a/src/shared/api/navidrome/navidrome-normalize.ts +++ b/src/shared/api/navidrome/navidrome-normalize.ts @@ -37,36 +37,89 @@ const matchesFullDate = (date: string) => { return Boolean(date.match(/^\d{4}-\d{2}-\d{2}$/)); }; -const normalizeReleaseDate = (item: { date?: string; releaseDate?: string }) => { +const matchesYearOnly = (date: string) => { + return Boolean(date.match(/^\d{4}$/)); +}; + +const normalizeReleaseDate = (item: { + date?: string; + releaseDate?: string; +}): { date: null | string; year: null | number } => { if (item.releaseDate && matchesFullDate(item.releaseDate)) { - return item.releaseDate; + return { + date: item.releaseDate, + year: parseInt(item.releaseDate.split('-')[0]), + }; + } else if (item.releaseDate && matchesYearOnly(item.releaseDate)) { + return { + date: null, + year: parseInt(item.releaseDate), + }; } if (item.date && matchesFullDate(item.date)) { - return item.date; + return { + date: item.date, + year: parseInt(item.date.split('-')[0]), + }; + } else if (item.date && matchesYearOnly(item.date)) { + return { + date: null, + year: parseInt(item.date), + }; } - return null; + return { + date: null, + year: null, + }; }; const normalizeOriginalDate = (item: { date?: string; originalDate?: string; releaseDate?: string; -}) => { +}): { date: null | string; year: null | number } => { if (item.originalDate && matchesFullDate(item.originalDate)) { - return item.originalDate; + return { + date: item.originalDate, + year: parseInt(item.originalDate.split('-')[0]), + }; + } else if (item.originalDate && matchesYearOnly(item.originalDate)) { + return { + date: null, + year: parseInt(item.originalDate), + }; } if (item.releaseDate && matchesFullDate(item.releaseDate)) { - return item.releaseDate; + return { + date: item.releaseDate, + year: parseInt(item.releaseDate.split('-')[0]), + }; + } else if (item.releaseDate && matchesYearOnly(item.releaseDate)) { + return { + date: null, + year: parseInt(item.releaseDate), + }; } if (item.date && matchesFullDate(item.date)) { - return item.date; + return { + date: item.date, + year: parseInt(item.date.split('-')[0]), + }; + } else if (item.date && matchesYearOnly(item.date)) { + return { + date: null, + year: parseInt(item.date), + }; } - return null; + return { + date: null, + year: null, + }; }; const getArtists = ( @@ -240,7 +293,7 @@ const normalizeSong = ( : null, playCount: item.playCount || 0, playlistItemId, - releaseDate: normalizeReleaseDate(item), + releaseDate: normalizeReleaseDate(item).date, releaseYear: item.year || null, sampleRate: item.sampleRate || null, size: item.size, @@ -303,9 +356,7 @@ const normalizeAlbum = ( pathReplaceWith?: string, ): Album => { const releaseDate = normalizeReleaseDate(item); - const releaseYear = releaseDate ? parseInt(releaseDate.split('-')[0]) : null; const originalDate = normalizeOriginalDate(item); - const originalYear = originalDate ? parseInt(originalDate.split('-')[0]) : null; return { ...parseAlbumTags(item), @@ -341,12 +392,12 @@ const normalizeAlbum = ( lastPlayedAt: normalizePlayDate(item), mbzId: item.mbzAlbumId || null, name: item.name, - originalDate, - originalYear, + originalDate: originalDate.date, + originalYear: originalDate.year, playCount: item.playCount || 0, - releaseDate, + releaseDate: releaseDate.date, releaseType: item.mbzAlbumType || null, - releaseYear, + releaseYear: releaseDate.year, size: item.size, songCount: item.songCount, songs: item.songs