forked from DebaucheryLibrarian/traxxx
Staging release media store by role.
This commit is contained in:
60
src/media.js
60
src/media.js
@@ -522,9 +522,6 @@ async function associateReleaseMedia(releases) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: catch errors
|
||||
// TODO: stage by role
|
||||
|
||||
const baseMediasByReleaseId = releases.reduce((acc, release) => ({
|
||||
...acc,
|
||||
[release.id]: [
|
||||
@@ -535,32 +532,49 @@ async function associateReleaseMedia(releases) {
|
||||
],
|
||||
}), {});
|
||||
|
||||
const baseMedias = Object.values(baseMediasByReleaseId)
|
||||
.map(releaseMedia => Object.values(releaseMedia))
|
||||
.flat(2)
|
||||
.filter(Boolean);
|
||||
const baseMediasByRole = Object.values(baseMediasByReleaseId)
|
||||
.flat()
|
||||
.filter(Boolean)
|
||||
.reduce((acc, baseMedia) => {
|
||||
if (!acc[baseMedia.role]) acc[baseMedia.role] = [];
|
||||
acc[baseMedia.role].push(baseMedia);
|
||||
|
||||
const storedMedias = await storeMedias(baseMedias);
|
||||
const storedMediasById = itemsByKey(storedMedias, 'id');
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
const associationsByRole = Object.entries(baseMediasByReleaseId).reduce((acc, [releaseId, releaseBaseMedias]) => {
|
||||
releaseBaseMedias.forEach((baseMedia) => {
|
||||
const media = storedMediasById[baseMedia.id];
|
||||
await Promise.reduce(['posters', 'covers', 'photos', 'teasers', 'trailers'], async (chain, role) => {
|
||||
// stage by role so posters are prioritized over photos and videos
|
||||
await chain;
|
||||
|
||||
if (!media) return;
|
||||
if (!acc[media.role]) acc[media.role] = [];
|
||||
const baseMedias = baseMediasByRole[role];
|
||||
|
||||
acc[media.role].push({
|
||||
release_id: releaseId,
|
||||
media_id: media.use || media.entry.id,
|
||||
});
|
||||
});
|
||||
if (!baseMedias) {
|
||||
return;
|
||||
}
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
const storedMedias = await storeMedias(baseMedias);
|
||||
const storedMediasById = itemsByKey(storedMedias, 'id');
|
||||
|
||||
await Promise.all(Object.entries(associationsByRole)
|
||||
.map(async ([role, associations]) => knex.raw(`${knex(`releases_${role}`).insert(associations)} ON CONFLICT DO NOTHING`)));
|
||||
const associations = Object
|
||||
.entries(baseMediasByReleaseId)
|
||||
.reduce((acc, [releaseId, releaseBaseMedias]) => {
|
||||
releaseBaseMedias.forEach((baseMedia) => {
|
||||
const media = storedMediasById[baseMedia.id];
|
||||
|
||||
if (media) {
|
||||
acc.push({
|
||||
release_id: releaseId,
|
||||
media_id: media.use || media.entry.id,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return acc;
|
||||
}, [])
|
||||
.filter(Boolean);
|
||||
|
||||
await knex.raw(`${knex(`releases_${role}`).insert(associations)} ON CONFLICT DO NOTHING`);
|
||||
}, Promise.resolve());
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
||||
Reference in New Issue
Block a user