add fallback to year for navidrome release display (#1498)

This commit is contained in:
jeffvli
2026-01-04 15:22:37 -08:00
parent 83b20d9086
commit 5ec8f1a904
2 changed files with 106 additions and 27 deletions
@@ -100,27 +100,55 @@ export const AlbumDetailHeader = forwardRef<HTMLDivElement>((_props, ref) => {
const originalDifferentFromRelease = const originalDifferentFromRelease =
album?.originalDate && album?.originalDate !== album?.releaseDate; album?.originalDate && album?.originalDate !== album?.releaseDate;
const originalYearDifferentFromRelease = album?.originalYear !== album?.releaseYear;
const playCount = album?.playCount; const playCount = album?.playCount;
const releasePrefix = originalDifferentFromRelease const releasePrefix = originalDifferentFromRelease
? t('page.albumDetail.released', { postProcess: 'sentenceCase' }) ? t('page.albumDetail.released', { postProcess: 'sentenceCase' })
: '♫'; : '♫';
if (originalDifferentFromRelease && album.originalDate) { const releaseYearPrefix = originalYearDifferentFromRelease
? t('page.albumDetail.released', { postProcess: 'sentenceCase' })
: '♫';
if (album.originalDate) {
if (originalDifferentFromRelease) {
items.push({ items.push({
id: 'originalDate', id: 'originalDate',
value: `${formatDateAbsoluteUTC(album.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( items.push(
...[ ...[
{
id: 'releaseDate',
value: releaseDate
? `${releasePrefix} ${formatDateAbsoluteUTC(releaseDate)}`
: releaseYear,
},
{ {
id: 'songCount', id: 'songCount',
value: t('entity.trackWithCount', { count: detailQuery?.data?.songCount || 0 }), value: t('entity.trackWithCount', { count: detailQuery?.data?.songCount || 0 }),
+67 -16
View File
@@ -37,36 +37,89 @@ const matchesFullDate = (date: string) => {
return Boolean(date.match(/^\d{4}-\d{2}-\d{2}$/)); 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)) { 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)) { 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: { const normalizeOriginalDate = (item: {
date?: string; date?: string;
originalDate?: string; originalDate?: string;
releaseDate?: string; releaseDate?: string;
}) => { }): { date: null | string; year: null | number } => {
if (item.originalDate && matchesFullDate(item.originalDate)) { 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)) { 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)) { 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 = ( const getArtists = (
@@ -240,7 +293,7 @@ const normalizeSong = (
: null, : null,
playCount: item.playCount || 0, playCount: item.playCount || 0,
playlistItemId, playlistItemId,
releaseDate: normalizeReleaseDate(item), releaseDate: normalizeReleaseDate(item).date,
releaseYear: item.year || null, releaseYear: item.year || null,
sampleRate: item.sampleRate || null, sampleRate: item.sampleRate || null,
size: item.size, size: item.size,
@@ -303,9 +356,7 @@ const normalizeAlbum = (
pathReplaceWith?: string, pathReplaceWith?: string,
): Album => { ): Album => {
const releaseDate = normalizeReleaseDate(item); const releaseDate = normalizeReleaseDate(item);
const releaseYear = releaseDate ? parseInt(releaseDate.split('-')[0]) : null;
const originalDate = normalizeOriginalDate(item); const originalDate = normalizeOriginalDate(item);
const originalYear = originalDate ? parseInt(originalDate.split('-')[0]) : null;
return { return {
...parseAlbumTags(item), ...parseAlbumTags(item),
@@ -341,12 +392,12 @@ const normalizeAlbum = (
lastPlayedAt: normalizePlayDate(item), lastPlayedAt: normalizePlayDate(item),
mbzId: item.mbzAlbumId || null, mbzId: item.mbzAlbumId || null,
name: item.name, name: item.name,
originalDate, originalDate: originalDate.date,
originalYear, originalYear: originalDate.year,
playCount: item.playCount || 0, playCount: item.playCount || 0,
releaseDate, releaseDate: releaseDate.date,
releaseType: item.mbzAlbumType || null, releaseType: item.mbzAlbumType || null,
releaseYear, releaseYear: releaseDate.year,
size: item.size, size: item.size,
songCount: item.songCount, songCount: item.songCount,
songs: item.songs songs: item.songs