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 =
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 }),
+67 -16
View File
@@ -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