better album dates
This commit is contained in:
parent
8c929d0dc3
commit
9923c021fa
7 changed files with 52 additions and 13 deletions
|
@ -290,7 +290,8 @@
|
||||||
},
|
},
|
||||||
"albumDetail": {
|
"albumDetail": {
|
||||||
"moreFromArtist": "more from this $t(entity.artist_one)",
|
"moreFromArtist": "more from this $t(entity.artist_one)",
|
||||||
"moreFromGeneric": "more from {{item}}"
|
"moreFromGeneric": "more from {{item}}",
|
||||||
|
"released": "released"
|
||||||
},
|
},
|
||||||
"albumList": {
|
"albumList": {
|
||||||
"artistAlbums": "albums by {{artist}}",
|
"artistAlbums": "albums by {{artist}}",
|
||||||
|
|
|
@ -175,8 +175,11 @@ const normalizeSong = (
|
||||||
peak: null,
|
peak: null,
|
||||||
playCount: (item.UserData && item.UserData.PlayCount) || 0,
|
playCount: (item.UserData && item.UserData.PlayCount) || 0,
|
||||||
playlistItemId: item.PlaylistItemId,
|
playlistItemId: item.PlaylistItemId,
|
||||||
// releaseDate: (item.ProductionYear && new Date(item.ProductionYear, 0, 1).toISOString()) || null,
|
releaseDate: item.PremiereDate
|
||||||
releaseDate: null,
|
? new Date(item.PremiereDate).toISOString()
|
||||||
|
: item.ProductionYear
|
||||||
|
? new Date(item.ProductionYear, 0, 1).toISOString()
|
||||||
|
: null,
|
||||||
releaseYear: item.ProductionYear ? String(item.ProductionYear) : null,
|
releaseYear: item.ProductionYear ? String(item.ProductionYear) : null,
|
||||||
serverId: server?.id || '',
|
serverId: server?.id || '',
|
||||||
serverType: ServerType.JELLYFIN,
|
serverType: ServerType.JELLYFIN,
|
||||||
|
@ -237,6 +240,7 @@ const normalizeAlbum = (
|
||||||
lastPlayedAt: null,
|
lastPlayedAt: null,
|
||||||
mbzId: item.ProviderIds?.MusicBrainzAlbum || null,
|
mbzId: item.ProviderIds?.MusicBrainzAlbum || null,
|
||||||
name: item.Name,
|
name: item.Name,
|
||||||
|
originalDate: null,
|
||||||
playCount: item.UserData?.PlayCount || 0,
|
playCount: item.UserData?.PlayCount || 0,
|
||||||
releaseDate: item.PremiereDate?.split('T')[0] || null,
|
releaseDate: item.PremiereDate?.split('T')[0] || null,
|
||||||
releaseYear: item.ProductionYear || null,
|
releaseYear: item.ProductionYear || null,
|
||||||
|
|
|
@ -119,7 +119,10 @@ const normalizeSong = (
|
||||||
: null,
|
: null,
|
||||||
playCount: item.playCount,
|
playCount: item.playCount,
|
||||||
playlistItemId,
|
playlistItemId,
|
||||||
releaseDate: new Date(item.year, 0, 1).toISOString(),
|
releaseDate: (item.releaseDate
|
||||||
|
? new Date(item.releaseDate)
|
||||||
|
: new Date(item.year, 0, 1)
|
||||||
|
).toISOString(),
|
||||||
releaseYear: String(item.year),
|
releaseYear: String(item.year),
|
||||||
serverId: server?.id || 'unknown',
|
serverId: server?.id || 'unknown',
|
||||||
serverType: ServerType.NAVIDROME,
|
serverType: ServerType.NAVIDROME,
|
||||||
|
@ -173,8 +176,16 @@ const normalizeAlbum = (
|
||||||
lastPlayedAt: normalizePlayDate(item),
|
lastPlayedAt: normalizePlayDate(item),
|
||||||
mbzId: item.mbzAlbumId || null,
|
mbzId: item.mbzAlbumId || null,
|
||||||
name: item.name,
|
name: item.name,
|
||||||
|
originalDate: item.originalDate
|
||||||
|
? new Date(item.originalDate).toISOString()
|
||||||
|
: item.originalYear
|
||||||
|
? new Date(item.originalYear, 0, 1).toISOString()
|
||||||
|
: null,
|
||||||
playCount: item.playCount,
|
playCount: item.playCount,
|
||||||
releaseDate: new Date(item.minYear, 0, 1).toISOString(),
|
releaseDate: (item.releaseDate
|
||||||
|
? new Date(item.releaseDate)
|
||||||
|
: new Date(item.minYear, 0, 1)
|
||||||
|
).toISOString(),
|
||||||
releaseYear: item.minYear,
|
releaseYear: item.minYear,
|
||||||
serverId: server?.id || 'unknown',
|
serverId: server?.id || 'unknown',
|
||||||
serverType: ServerType.NAVIDROME,
|
serverType: ServerType.NAVIDROME,
|
||||||
|
|
|
@ -128,9 +128,12 @@ const album = z.object({
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
orderAlbumArtistName: z.string(),
|
orderAlbumArtistName: z.string(),
|
||||||
orderAlbumName: z.string(),
|
orderAlbumName: z.string(),
|
||||||
|
originalDate: z.string().optional(),
|
||||||
|
originalYear: z.number().optional(),
|
||||||
playCount: z.number(),
|
playCount: z.number(),
|
||||||
playDate: z.string().optional(),
|
playDate: z.string().optional(),
|
||||||
rating: z.number().optional(),
|
rating: z.number().optional(),
|
||||||
|
releaseDate: z.string().optional(),
|
||||||
size: z.number(),
|
size: z.number(),
|
||||||
songCount: z.number(),
|
songCount: z.number(),
|
||||||
sortAlbumArtistName: z.string(),
|
sortAlbumArtistName: z.string(),
|
||||||
|
@ -214,6 +217,7 @@ const song = z.object({
|
||||||
playCount: z.number(),
|
playCount: z.number(),
|
||||||
playDate: z.string().optional(),
|
playDate: z.string().optional(),
|
||||||
rating: z.number().optional(),
|
rating: z.number().optional(),
|
||||||
|
releaseDate: z.string().optional(),
|
||||||
rgAlbumGain: z.number().optional(),
|
rgAlbumGain: z.number().optional(),
|
||||||
rgAlbumPeak: z.number().optional(),
|
rgAlbumPeak: z.number().optional(),
|
||||||
rgTrackGain: z.number().optional(),
|
rgTrackGain: z.number().optional(),
|
||||||
|
|
|
@ -196,6 +196,7 @@ const normalizeAlbum = (
|
||||||
lastPlayedAt: null,
|
lastPlayedAt: null,
|
||||||
mbzId: null,
|
mbzId: null,
|
||||||
name: item.name,
|
name: item.name,
|
||||||
|
originalDate: null,
|
||||||
playCount: null,
|
playCount: null,
|
||||||
releaseDate: item.year ? new Date(item.year, 0, 1).toISOString() : null,
|
releaseDate: item.year ? new Date(item.year, 0, 1).toISOString() : null,
|
||||||
releaseYear: item.year ? Number(item.year) : null,
|
releaseYear: item.year ? Number(item.year) : null,
|
||||||
|
|
|
@ -164,6 +164,7 @@ export type Album = {
|
||||||
lastPlayedAt: string | null;
|
lastPlayedAt: string | null;
|
||||||
mbzId: string | null;
|
mbzId: string | null;
|
||||||
name: string;
|
name: string;
|
||||||
|
originalDate: string | null;
|
||||||
playCount: number | null;
|
playCount: number | null;
|
||||||
releaseDate: string | null;
|
releaseDate: string | null;
|
||||||
releaseYear: number | null;
|
releaseYear: number | null;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import { Group, Stack } from '@mantine/core';
|
|
||||||
import { forwardRef, Fragment, Ref } from 'react';
|
import { forwardRef, Fragment, Ref } from 'react';
|
||||||
|
import { Group, Stack } from '@mantine/core';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
import { generatePath, useParams } from 'react-router';
|
import { generatePath, useParams } from 'react-router';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { LibraryItem, ServerType } from '/@/renderer/api/types';
|
import { LibraryItem, ServerType } from '/@/renderer/api/types';
|
||||||
|
@ -9,7 +10,7 @@ import { LibraryHeader, useSetRating } from '/@/renderer/features/shared';
|
||||||
import { useContainerQuery } from '/@/renderer/hooks';
|
import { useContainerQuery } from '/@/renderer/hooks';
|
||||||
import { AppRoute } from '/@/renderer/router/routes';
|
import { AppRoute } from '/@/renderer/router/routes';
|
||||||
import { useCurrentServer } from '/@/renderer/store';
|
import { useCurrentServer } from '/@/renderer/store';
|
||||||
import { formatDurationString } from '/@/renderer/utils';
|
import { formatDateAbsolute, formatDurationString } from '/@/renderer/utils';
|
||||||
|
|
||||||
interface AlbumDetailHeaderProps {
|
interface AlbumDetailHeaderProps {
|
||||||
background: string;
|
background: string;
|
||||||
|
@ -21,26 +22,42 @@ export const AlbumDetailHeader = forwardRef(
|
||||||
const server = useCurrentServer();
|
const server = useCurrentServer();
|
||||||
const detailQuery = useAlbumDetail({ query: { id: albumId }, serverId: server?.id });
|
const detailQuery = useAlbumDetail({ query: { id: albumId }, serverId: server?.id });
|
||||||
const cq = useContainerQuery();
|
const cq = useContainerQuery();
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const originalDifferentFromRelease =
|
||||||
|
detailQuery.data?.originalDate &&
|
||||||
|
detailQuery.data.originalDate !== detailQuery.data.releaseDate;
|
||||||
|
|
||||||
|
const releasePrefix = originalDifferentFromRelease
|
||||||
|
? t('page.albumDetail.released', { postProcess: 'sentenceCase' })
|
||||||
|
: '♫';
|
||||||
|
|
||||||
const metadataItems = [
|
const metadataItems = [
|
||||||
{
|
{
|
||||||
id: 'releaseYear',
|
id: 'releaseDate',
|
||||||
secondary: false,
|
value:
|
||||||
value: detailQuery?.data?.releaseYear,
|
detailQuery?.data?.releaseDate &&
|
||||||
|
`${releasePrefix} ${formatDateAbsolute(detailQuery?.data?.releaseDate)}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'songCount',
|
id: 'songCount',
|
||||||
secondary: false,
|
|
||||||
value: `${detailQuery?.data?.songCount} songs`,
|
value: `${detailQuery?.data?.songCount} songs`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'duration',
|
id: 'duration',
|
||||||
secondary: false,
|
|
||||||
value:
|
value:
|
||||||
detailQuery?.data?.duration && formatDurationString(detailQuery.data.duration),
|
detailQuery?.data?.duration && formatDurationString(detailQuery.data.duration),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if (originalDifferentFromRelease) {
|
||||||
|
const formatted = `♫ ${formatDateAbsolute(detailQuery!.data!.originalDate)}`;
|
||||||
|
metadataItems.splice(0, 0, {
|
||||||
|
id: 'originalDate',
|
||||||
|
value: formatted,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const updateRatingMutation = useSetRating({});
|
const updateRatingMutation = useSetRating({});
|
||||||
|
|
||||||
const handleUpdateRating = (rating: number) => {
|
const handleUpdateRating = (rating: number) => {
|
||||||
|
@ -71,7 +88,7 @@ export const AlbumDetailHeader = forwardRef(
|
||||||
{metadataItems.map((item, index) => (
|
{metadataItems.map((item, index) => (
|
||||||
<Fragment key={`item-${item.id}-${index}`}>
|
<Fragment key={`item-${item.id}-${index}`}>
|
||||||
{index > 0 && <Text $noSelect>•</Text>}
|
{index > 0 && <Text $noSelect>•</Text>}
|
||||||
<Text $secondary={item.secondary}>{item.value}</Text>
|
<Text>{item.value}</Text>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
))}
|
))}
|
||||||
{showRating && (
|
{showRating && (
|
||||||
|
|
Reference in a new issue