Files
channels-seerr/server/models/Music.ts
2025-12-15 09:26:35 +10:00

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,
});