Update scanner (server)

This commit is contained in:
jeffvli
2022-10-29 19:12:02 -07:00
parent ff6882a6cd
commit 0200b92860
21 changed files with 777 additions and 177 deletions
@@ -478,6 +478,11 @@ const scanAll = async (
await scanAlbums(server, serverFolder, task);
await scanSongs(server, serverFolder, task);
await checkDeleted(server, serverFolder, task);
await prisma.serverFolder.update({
data: { lastScannedAt: new Date() },
where: { id: serverFolder.id },
});
}
return { task };
+8 -4
View File
@@ -30,10 +30,11 @@ const authenticate = async (options: {
};
const getGenres = async (server: Server, params?: NDGenreListParams) => {
const [ndToken] = server.token.split('||');
const { data } = await api.get<NDGenreListResponse>(
`${server.url}/api/genre`,
{
headers: { 'x-nd-authorization': `Bearer ${server.token}` },
headers: { 'x-nd-authorization': `Bearer ${ndToken}` },
params,
}
);
@@ -42,10 +43,11 @@ const getGenres = async (server: Server, params?: NDGenreListParams) => {
};
const getArtists = async (server: Server, params?: NDGenreListParams) => {
const [ndToken] = server.token.split('||');
const { data } = await api.get<NDArtistListResponse>(
`${server.url}/api/artist`,
{
headers: { 'x-nd-authorization': `Bearer ${server.token}` },
headers: { 'x-nd-authorization': `Bearer ${ndToken}` },
params,
}
);
@@ -54,10 +56,11 @@ const getArtists = async (server: Server, params?: NDGenreListParams) => {
};
const getAlbums = async (server: Server, params?: NDAlbumListParams) => {
const [ndToken] = server.token.split('||');
const { data } = await api.get<NDAlbumListResponse>(
`${server.url}/api/album`,
{
headers: { 'x-nd-authorization': `Bearer ${server.token}` },
headers: { 'x-nd-authorization': `Bearer ${ndToken}` },
params,
}
);
@@ -66,8 +69,9 @@ const getAlbums = async (server: Server, params?: NDAlbumListParams) => {
};
const getSongs = async (server: Server, params?: NDSongListParams) => {
const [ndToken] = server.token.split('||');
const { data } = await api.get<NDSongListResponse>(`${server.url}/api/song`, {
headers: { 'x-nd-authorization': `Bearer ${server.token}` },
headers: { 'x-nd-authorization': `Bearer ${ndToken}` },
params,
});
+57 -19
View File
@@ -37,8 +37,14 @@ export const scanGenres = async (server: Server, task: Task) => {
export const scanAlbumArtists = async (
server: Server,
serverFolder: ServerFolder
serverFolder: ServerFolder,
task: Task
) => {
await prisma.task.update({
data: { message: 'Scanning artists' },
where: { id: task.id },
});
const artists = await navidromeApi.getArtists(server);
const externalsCreateMany = artists
@@ -101,8 +107,14 @@ export const scanAlbumArtists = async (
export const scanAlbums = async (
server: Server,
serverFolder: ServerFolder
serverFolder: ServerFolder,
task: Task
) => {
await prisma.task.update({
data: { message: 'Scanning artists' },
where: { id: task.id },
});
let start = 0;
let count = 5000;
do {
@@ -153,26 +165,38 @@ export const scanAlbums = async (
}
}
const artistsConnect = validArtistIds.map((id) => ({
uniqueArtistId: {
remoteId: id,
serverId: server.id,
},
}));
// const artistsConnect = validArtistIds.map((id) => ({
// uniqueArtistId: {
// remoteId: id,
// serverId: server.id,
// },
// }));
const albumArtistConnect = album.artistId
const aaConnect = [];
const albumArtistConnect = album.albumArtistId
? {
uniqueAlbumArtistId: {
remoteId: album.artistId,
remoteId: album.albumArtistId,
serverId: server.id,
},
}
: undefined;
aaConnect.push(
...validArtistIds.map((id) => ({
uniqueAlbumArtistId: {
remoteId: id,
serverId: server.id,
},
}))
);
albumArtistConnect && aaConnect.push(albumArtistConnect);
await prisma.album.upsert({
create: {
albumArtists: { connect: albumArtistConnect },
artists: { connect: artistsConnect },
albumArtists: { connect: aaConnect },
// artists: { connect: artistsConnect },
deleted: false,
genres: { connect: genresConnect },
images: { connect: imagesConnect },
@@ -188,8 +212,8 @@ export const scanAlbums = async (
sortName: album.name,
},
update: {
albumArtists: { connect: albumArtistConnect },
artists: { connect: artistsConnect },
albumArtists: { connect: aaConnect },
// artists: { connect: artistsConnect },
deleted: false,
genres: { connect: genresConnect },
images: { connect: imagesConnect },
@@ -218,7 +242,16 @@ export const scanAlbums = async (
} while (count === CHUNK_SIZE);
};
const scanSongs = async (server: Server, serverFolder: ServerFolder) => {
const scanSongs = async (
server: Server,
serverFolder: ServerFolder,
task: Task
) => {
await prisma.task.update({
data: { message: 'Scanning artists' },
where: { id: task.id },
});
let start = 0;
let count = 5000;
do {
@@ -313,7 +346,7 @@ const scanSongs = async (server: Server, serverFolder: ServerFolder) => {
}
for (const folder of createdFolders) {
if (folder.parentId) break;
if (folder?.parentId || !folder) break;
const pathSplit = folder.path.split('/');
const parentPath = pathSplit.slice(0, pathSplit.length - 1).join('/');
@@ -359,9 +392,14 @@ const scanAll = async (
for (const serverFolder of serverFolders) {
await scanGenres(server, task);
await scanAlbumArtists(server, serverFolder);
await scanAlbums(server, serverFolder);
await scanSongs(server, serverFolder);
await scanAlbumArtists(server, serverFolder, task);
await scanAlbums(server, serverFolder, task);
await scanSongs(server, serverFolder, task);
await prisma.serverFolder.update({
data: { lastScannedAt: new Date() },
where: { id: serverFolder.id },
});
}
return { task };
+5 -11
View File
@@ -8,7 +8,7 @@ interface QueueTask {
task: Task;
}
export const scannerQueue: Queue = new Queue(
export const scannerQueue: Queue | any = new Queue(
async (task: QueueTask, cb: any) => {
const result = await task.fn();
return cb(null, result);
@@ -18,26 +18,20 @@ export const scannerQueue: Queue = new Queue(
cancelIfRunning: true,
concurrent: 1,
filo: false,
maxRetries: 5,
maxTimeout: 600000,
retryDelay: 2000,
}
);
scannerQueue.on('task_finish', async (taskId) => {
scannerQueue.on('task_finish', async (taskId: string) => {
await prisma.task.update({
data: {
completed: true,
isError: false,
progress: null,
},
where: { id: taskId },
});
});
scannerQueue.on('task_failed', async (taskId, errorMessage) => {
const dbTaskId = taskId.split('(')[1].split(')')[0];
scannerQueue.on('task_failed', async (taskId: string, errorMessage: string) => {
console.log('errorMessage', errorMessage);
await prisma.task.update({
data: {
@@ -45,13 +39,13 @@ scannerQueue.on('task_failed', async (taskId, errorMessage) => {
isError: true,
message: errorMessage,
},
where: { id: dbTaskId },
where: { id: taskId },
});
});
scannerQueue.on('drain', async () => {
await prisma.task.updateMany({
data: { completed: true, progress: null },
data: { completed: true },
where: { completed: false },
});
});
+29 -6
View File
@@ -26,8 +26,14 @@ export const scanGenres = async (server: Server, task: Task) => {
export const scanAlbumArtists = async (
server: Server,
serverFolder: ServerFolder
serverFolder: ServerFolder,
task: Task
) => {
await prisma.task.update({
data: { message: 'Scanning artists' },
where: { id: task.id },
});
const artists = await subsonicApi.getArtists(server, serverFolder.remoteId);
for (const artist of artists) {
@@ -58,8 +64,14 @@ export const scanAlbumArtists = async (
export const scanAlbums = async (
server: Server,
serverFolder: ServerFolder
serverFolder: ServerFolder,
task: Task
) => {
await prisma.task.update({
data: { message: 'Scanning albums' },
where: { id: task.id },
});
const albums = await subsonicApi.getAlbums(server, {
musicFolderId: serverFolder.id,
offset: 0,
@@ -241,8 +253,14 @@ const throttledAlbumFetch = throttle(
export const scanAlbumDetail = async (
server: Server,
serverFolder: ServerFolder
serverFolder: ServerFolder,
task: Task
) => {
await prisma.task.update({
data: { message: 'Scanning songs' },
where: { id: task.id },
});
const promises = [];
const dbAlbums = await prisma.album.findMany({
where: {
@@ -271,9 +289,14 @@ const scanAll = async (
for (const serverFolder of serverFolders) {
await scanGenres(server, task);
await scanAlbumArtists(server, serverFolder);
await scanAlbums(server, serverFolder);
await scanAlbumDetail(server, serverFolder);
await scanAlbumArtists(server, serverFolder, task);
await scanAlbums(server, serverFolder, task);
await scanAlbumDetail(server, serverFolder, task);
await prisma.serverFolder.update({
data: { lastScannedAt: new Date() },
where: { id: serverFolder.id },
});
}
return { task };