mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-08 04:50:12 +02:00
126 lines
3.4 KiB
TypeScript
126 lines
3.4 KiB
TypeScript
import { ExternalSource, Server, ServerFolder } from '@prisma/client';
|
|
import { prisma } from '@lib/prisma';
|
|
import { NDSong } from './navidrome.types';
|
|
|
|
const insertSongGroup = async (
|
|
server: Server,
|
|
serverFolder: ServerFolder,
|
|
songs: NDSong[],
|
|
remoteAlbumId: string
|
|
) => {
|
|
const songsWithArtistIds = songs.filter((song) => song.artistId);
|
|
const artistId =
|
|
songsWithArtistIds.length > 0 ? songsWithArtistIds[0].artistId : undefined;
|
|
|
|
const albumArtist = artistId
|
|
? await prisma.albumArtist.findUnique({
|
|
where: {
|
|
uniqueAlbumArtistId: {
|
|
remoteId: artistId,
|
|
serverId: server.id,
|
|
},
|
|
},
|
|
})
|
|
: undefined;
|
|
|
|
const songsUpsert = songs.map((song) => {
|
|
const genresConnect = song.genres
|
|
? song.genres.map((genre) => ({ name: genre.name }))
|
|
: undefined;
|
|
|
|
const externalsConnect = song.mbzTrackId
|
|
? {
|
|
uniqueExternalId: {
|
|
source: ExternalSource.MUSICBRAINZ,
|
|
value: song.mbzTrackId,
|
|
},
|
|
}
|
|
: undefined;
|
|
|
|
const pathSplit = song.path.split('/');
|
|
const parentPath = pathSplit.slice(0, pathSplit.length - 1).join('/');
|
|
|
|
return {
|
|
create: {
|
|
albumArtistId: albumArtist?.id,
|
|
artistName: !song.artistId ? song.artist : undefined,
|
|
bitRate: song.bitRate,
|
|
container: song.suffix,
|
|
deleted: false,
|
|
discNumber: song.discNumber,
|
|
duration: song.duration,
|
|
externals: { connect: externalsConnect },
|
|
folders: {
|
|
connect: {
|
|
uniqueFolderId: { path: parentPath, serverId: server.id },
|
|
},
|
|
},
|
|
genres: { connect: genresConnect },
|
|
name: song.title,
|
|
releaseDate: song?.year
|
|
? new Date(song.year, 0).toISOString()
|
|
: undefined,
|
|
releaseYear: song?.year,
|
|
remoteCreatedAt: song.createdAt,
|
|
remoteId: song.id,
|
|
serverFolders: { connect: { id: serverFolder.id } },
|
|
serverId: server.id,
|
|
size: song.size,
|
|
sortName: song.title,
|
|
trackNumber: song.trackNumber,
|
|
},
|
|
update: {
|
|
albumArtistId: albumArtist?.id,
|
|
artistName: !song.artistId ? song.artist : undefined,
|
|
bitRate: song.bitRate,
|
|
container: song.suffix,
|
|
deleted: false,
|
|
discNumber: song.discNumber,
|
|
duration: song.duration,
|
|
externals: { connect: externalsConnect },
|
|
folders: {
|
|
connect: {
|
|
uniqueFolderId: { path: parentPath, serverId: server.id },
|
|
},
|
|
},
|
|
genres: { connect: genresConnect },
|
|
name: song.title,
|
|
releaseDate: song?.year
|
|
? new Date(song.year, 0).toISOString()
|
|
: undefined,
|
|
releaseYear: song?.year,
|
|
remoteCreatedAt: song.createdAt,
|
|
remoteId: song.id,
|
|
serverFolders: { connect: { id: serverFolder.id } },
|
|
serverId: server.id,
|
|
size: song.size,
|
|
sortName: song.title,
|
|
trackNumber: song.trackNumber,
|
|
},
|
|
where: {
|
|
uniqueSongId: {
|
|
remoteId: song.id,
|
|
serverId: server.id,
|
|
},
|
|
},
|
|
};
|
|
});
|
|
|
|
await prisma.album.update({
|
|
data: {
|
|
deleted: false,
|
|
songs: { upsert: songsUpsert },
|
|
},
|
|
where: {
|
|
uniqueAlbumId: {
|
|
remoteId: remoteAlbumId,
|
|
serverId: server.id,
|
|
},
|
|
},
|
|
});
|
|
};
|
|
|
|
export const navidromeUtils = {
|
|
insertSongGroup,
|
|
};
|