Added scene media detach.
This commit is contained in:
13
src/app.js
13
src/app.js
@@ -24,7 +24,7 @@ const { updateSceneSearch, updateMovieSearch } = require('./update-search');
|
|||||||
const { scrapeActors, deleteActors, flushActors, flushProfiles, interpolateProfiles } = require('./actors');
|
const { scrapeActors, deleteActors, flushActors, flushProfiles, interpolateProfiles } = require('./actors');
|
||||||
const { flushEntities } = require('./entities');
|
const { flushEntities } = require('./entities');
|
||||||
const { deleteScenes, deleteMovies, flushScenes, flushMovies, flushBatches } = require('./releases');
|
const { deleteScenes, deleteMovies, flushScenes, flushMovies, flushBatches } = require('./releases');
|
||||||
const { flushOrphanedMedia } = require('./media');
|
const { flushOrphanedMedia, detachReleaseMedia, detachEntityReleaseMedia } = require('./media');
|
||||||
const { reassociateEntityReleaseTags, reassociateReleaseTags, reassociateOriginalTags } = require('./tags');
|
const { reassociateEntityReleaseTags, reassociateReleaseTags, reassociateOriginalTags } = require('./tags');
|
||||||
const getFileEntries = require('./utils/file-entries');
|
const getFileEntries = require('./utils/file-entries');
|
||||||
|
|
||||||
@@ -160,7 +160,8 @@ async function init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (argv.flushNetworks || argv.flushChannels) {
|
if (argv.flushNetworks || argv.flushChannels) {
|
||||||
await flushEntities(argv.flushNetworks, argv.flushChannels);
|
// inject flushOrphanedMedia to prevent circular dependency with entity media flush
|
||||||
|
await flushEntities(argv.flushNetworks, argv.flushChannels, flushOrphanedMedia);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argv.flushBatches) {
|
if (argv.flushBatches) {
|
||||||
@@ -203,6 +204,14 @@ async function init() {
|
|||||||
await flushOrphanedMedia();
|
await flushOrphanedMedia();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (argv.detachReleaseMedia) {
|
||||||
|
await detachReleaseMedia(argv.detachReleaseMedia);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argv.detachNetworkMedia || argv.detachChannelMedia) {
|
||||||
|
await detachEntityReleaseMedia(argv.detachNetworkMedia, argv.detachChannelMedia);
|
||||||
|
}
|
||||||
|
|
||||||
if (argv.request) {
|
if (argv.request) {
|
||||||
const res = await http[argv.requestMethod](argv.request);
|
const res = await http[argv.requestMethod](argv.request);
|
||||||
|
|
||||||
|
|||||||
27
src/argv.js
27
src/argv.js
@@ -349,7 +349,32 @@ const { argv } = yargs
|
|||||||
describe: 'Remove files from storage when flushing media.',
|
describe: 'Remove files from storage when flushing media.',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
alias: 'flush-files',
|
alias: 'flush-files',
|
||||||
default: true,
|
})
|
||||||
|
.option('detach-channel-media', {
|
||||||
|
describe: 'Remove media files from channel scenes.',
|
||||||
|
type: 'array',
|
||||||
|
})
|
||||||
|
.option('detach-network-media', {
|
||||||
|
describe: 'Remove media files from network scenes.',
|
||||||
|
type: 'array',
|
||||||
|
})
|
||||||
|
.option('detach-release-media', {
|
||||||
|
describe: 'Remove media files from network scenes.',
|
||||||
|
type: 'array',
|
||||||
|
alias: ['detach-scene-media'],
|
||||||
|
})
|
||||||
|
.option('detach-media-domains', {
|
||||||
|
describe: 'Only detach these types of media.',
|
||||||
|
type: 'array',
|
||||||
|
default: [
|
||||||
|
'posters',
|
||||||
|
'photos',
|
||||||
|
'caps',
|
||||||
|
'trailers',
|
||||||
|
'teasers',
|
||||||
|
'covers',
|
||||||
|
],
|
||||||
|
alias: ['detach-media'],
|
||||||
})
|
})
|
||||||
.option('flush-channels', {
|
.option('flush-channels', {
|
||||||
describe: 'Delete all scenes and movies from channels.',
|
describe: 'Delete all scenes and movies from channels.',
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ const logger = require('./logger')(__filename);
|
|||||||
const argv = require('./argv');
|
const argv = require('./argv');
|
||||||
const knex = require('./knex');
|
const knex = require('./knex');
|
||||||
const { deleteScenes, deleteMovies, deleteSeries } = require('./releases');
|
const { deleteScenes, deleteMovies, deleteSeries } = require('./releases');
|
||||||
const { flushOrphanedMedia } = require('./media');
|
|
||||||
const { resolveScraper, resolveLayoutScraper } = require('./scrapers/resolve');
|
const { resolveScraper, resolveLayoutScraper } = require('./scrapers/resolve');
|
||||||
const getRecursiveParameters = require('./utils/get-recursive-parameters');
|
const getRecursiveParameters = require('./utils/get-recursive-parameters');
|
||||||
|
|
||||||
@@ -454,7 +453,7 @@ async function fetchEntityReleaseIds(networkSlugs = [], channelSlugs = []) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async function flushEntities(networkSlugs = [], channelSlugs = []) {
|
async function flushEntities(networkSlugs = [], channelSlugs = [], flushOrphanedMedia) {
|
||||||
const { sceneIds, movieIds, serieIds } = await fetchEntityReleaseIds(networkSlugs, channelSlugs);
|
const { sceneIds, movieIds, serieIds } = await fetchEntityReleaseIds(networkSlugs, channelSlugs);
|
||||||
const entitySlugs = networkSlugs.concat(channelSlugs).join(', ');
|
const entitySlugs = networkSlugs.concat(channelSlugs).join(', ');
|
||||||
|
|
||||||
|
|||||||
29
src/media.js
29
src/media.js
@@ -26,6 +26,7 @@ const http = require('./utils/http');
|
|||||||
const bulkInsert = require('./utils/bulk-insert');
|
const bulkInsert = require('./utils/bulk-insert');
|
||||||
const chunk = require('./utils/chunk');
|
const chunk = require('./utils/chunk');
|
||||||
const { get } = require('./utils/qu');
|
const { get } = require('./utils/qu');
|
||||||
|
const { fetchEntityReleaseIds } = require('./entities');
|
||||||
|
|
||||||
// const pipeline = util.promisify(stream.pipeline);
|
// const pipeline = util.promisify(stream.pipeline);
|
||||||
const streamQueue = taskQueue();
|
const streamQueue = taskQueue();
|
||||||
@@ -1159,8 +1160,36 @@ async function flushOrphanedMedia(stage = 1) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function detachReleaseMedia(rawSceneIds) {
|
||||||
|
const sceneIds = rawSceneIds.map((sceneId) => Number(sceneId)).filter(Boolean);
|
||||||
|
|
||||||
|
await argv.detachMediaDomains.reduce(async (chain, domain) => {
|
||||||
|
await chain;
|
||||||
|
|
||||||
|
const mediaEntries = await knex(`releases_${domain}`).whereIn('release_id', sceneIds);
|
||||||
|
|
||||||
|
await knex(`releases_${domain}`)
|
||||||
|
.whereIn('release_id', sceneIds)
|
||||||
|
.delete();
|
||||||
|
|
||||||
|
logger.info(`Removed ${mediaEntries.length} ${domain} from ${new Set(mediaEntries.map((mediaEntry) => mediaEntry.release_id)).size} scenes`);
|
||||||
|
}, Promise.resolve());
|
||||||
|
|
||||||
|
if (argv.flushOrphanedMedia !== false) {
|
||||||
|
await flushOrphanedMedia();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function detachEntityReleaseMedia(networkSlugs = [], channelSlugs = []) {
|
||||||
|
const { sceneIds } = await fetchEntityReleaseIds(networkSlugs, channelSlugs);
|
||||||
|
|
||||||
|
await detachReleaseMedia(sceneIds);
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
associateAvatars,
|
associateAvatars,
|
||||||
associateReleaseMedia,
|
associateReleaseMedia,
|
||||||
flushOrphanedMedia,
|
flushOrphanedMedia,
|
||||||
|
detachReleaseMedia,
|
||||||
|
detachEntityReleaseMedia,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user