mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 12:30:12 +02:00
Update scanner (server)
This commit is contained in:
@@ -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 };
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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 },
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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 };
|
||||
|
||||
Reference in New Issue
Block a user