131 lines
3.2 KiB
TypeScript
131 lines
3.2 KiB
TypeScript
import type {
|
|
MbAlbumDetails,
|
|
MbImage,
|
|
MbLink,
|
|
} from '@server/api/musicbrainz/interfaces';
|
|
import type Media from '@server/entity/Media';
|
|
|
|
export interface MusicDetails {
|
|
id: string;
|
|
mbId: string;
|
|
title: string;
|
|
titleSlug?: string;
|
|
overview: string;
|
|
artistId: string;
|
|
type: string;
|
|
releaseDate: string;
|
|
disambiguation: string;
|
|
genres: string[];
|
|
secondaryTypes: string[];
|
|
releases: {
|
|
id: string;
|
|
title: string;
|
|
status: string;
|
|
releaseDate: string;
|
|
trackCount: number;
|
|
country: string[];
|
|
label: string[];
|
|
media: {
|
|
format: string;
|
|
name: string;
|
|
position: number;
|
|
}[];
|
|
tracks: {
|
|
id: string;
|
|
artistId: string;
|
|
trackName: string;
|
|
trackNumber: string;
|
|
trackPosition: number;
|
|
mediumNumber: number;
|
|
durationMs: number;
|
|
recordingId: string;
|
|
}[];
|
|
disambiguation: string;
|
|
}[];
|
|
artist: {
|
|
id: string;
|
|
artistName: string;
|
|
sortName: string;
|
|
type: 'Group' | 'Person';
|
|
disambiguation: string;
|
|
overview: string;
|
|
genres: string[];
|
|
status: string;
|
|
images: MbImage[];
|
|
links: MbLink[];
|
|
rating?: {
|
|
count: number;
|
|
value: number | null;
|
|
};
|
|
};
|
|
images: MbImage[];
|
|
links: MbLink[];
|
|
mediaInfo?: Media;
|
|
onUserWatchlist?: boolean;
|
|
}
|
|
|
|
export const mapMusicDetails = (
|
|
album: MbAlbumDetails,
|
|
media?: Media,
|
|
userWatchlist?: boolean
|
|
): MusicDetails => ({
|
|
id: album.id,
|
|
mbId: album.id,
|
|
title: album.title,
|
|
titleSlug: album.title.toLowerCase().replace(/[^a-z0-9]+/g, '-'),
|
|
overview: album.overview,
|
|
artistId: album.artistid,
|
|
type: album.type,
|
|
releaseDate: album.releasedate,
|
|
disambiguation: album.disambiguation,
|
|
genres: album.genres,
|
|
secondaryTypes: album.secondaryTypes ?? [],
|
|
releases: album.releases.map((release) => ({
|
|
id: release.id,
|
|
title: release.title,
|
|
status: release.status,
|
|
releaseDate: release.releasedate,
|
|
trackCount: release.track_count,
|
|
country: release.country,
|
|
label: release.label,
|
|
media: release.media.map((medium) => ({
|
|
format: medium.Format,
|
|
name: medium.Name,
|
|
position: medium.Position,
|
|
})),
|
|
tracks: release.tracks.map((track) => ({
|
|
id: track.id,
|
|
artistId: track.artistid,
|
|
trackName: track.trackname,
|
|
trackNumber: track.tracknumber,
|
|
trackPosition: track.trackposition,
|
|
mediumNumber: track.mediumnumber,
|
|
durationMs: track.durationms,
|
|
recordingId: track.recordingid,
|
|
})),
|
|
disambiguation: release.disambiguation,
|
|
})),
|
|
artist: {
|
|
id: album.artists[0].id,
|
|
artistName: album.artists[0].artistname,
|
|
sortName: album.artists[0].sortname,
|
|
type: album.artists[0].type,
|
|
disambiguation: album.artists[0].disambiguation,
|
|
overview: album.artists[0].overview,
|
|
genres: album.artists[0].genres,
|
|
status: album.artists[0].status,
|
|
images: album.artists[0].images,
|
|
links: album.artists[0].links,
|
|
rating: album.artists[0].rating
|
|
? {
|
|
count: album.artists[0].rating.Count,
|
|
value: album.artists[0].rating.Value,
|
|
}
|
|
: undefined,
|
|
},
|
|
images: album.images,
|
|
links: album.artists[0].links,
|
|
mediaInfo: media,
|
|
onUserWatchlist: userWatchlist,
|
|
});
|