Added rudimentary scene and entity scene remove.

This commit is contained in:
DebaucheryLibrarian
2020-10-19 02:02:21 +02:00
parent 2536405dba
commit 593ce27312
12 changed files with 350 additions and 115 deletions

View File

@@ -10,6 +10,8 @@ const fetchUpdates = require('./updates');
const { fetchScenes, fetchMovies } = require('./deep');
const { storeScenes, storeMovies, updateReleasesSearch } = require('./store-releases');
const { scrapeActors } = require('./actors');
const { flushEntities } = require('./entities');
const { deleteScenes } = require('./releases');
const getFileEntries = require('./utils/file-entries');
async function init() {
@@ -22,6 +24,14 @@ async function init() {
await updateReleasesSearch();
}
if (argv.flushNetworks || argv.flushChannels) {
await flushEntities(argv.flushNetworks, argv.flushChannels);
}
if (argv.delete) {
await deleteScenes(argv.delete);
}
const actorsFromFile = argv.actorsFile && await getFileEntries(argv.actorsFile);
const actorNames = (argv.actors || []).concat(actorsFromFile || []);

View File

@@ -238,6 +238,21 @@ const { argv } = yargs
type: 'boolean',
default: false,
})
.option('flush-channels', {
describe: 'Delete all scenes and movies from channels.',
type: 'array',
alias: 'flush-channel',
})
.option('flush-networks', {
describe: 'Delete all scenes and movies from network.',
type: 'array',
alias: 'flush-network',
})
.option('delete', {
describe: 'Remove scenes by ID.',
type: 'array',
alias: 'remove',
})
.coerce('after', interpretAfter)
.coerce('actors-update', interpretAfter);

View File

@@ -1,9 +1,12 @@
'use strict';
const config = require('config');
const inquirer = require('inquirer');
const logger = require('./logger')(__filename);
const argv = require('./argv');
const knex = require('./knex');
const { deleteScenes } = require('./releases');
function curateEntity(entity, includeParameters = false) {
if (!entity) {
@@ -187,11 +190,59 @@ async function searchEntities(query, type, limit) {
.groupBy('entities.id', 'entities.name', 'entities.slug', 'entities.type', 'entities.url', 'entities.description', 'parents.id')
.limit(limit || 100);
console.log(entities.toString());
return curateEntities(await entities);
}
async function flushEntities(networkSlugs = [], channelSlugs = []) {
const entitySlugs = networkSlugs.concat(channelSlugs).join(', ');
const entityQuery = knex
.withRecursive('selected_entities', knex.raw(`
SELECT entities.*
FROM entities
WHERE
entities.slug = ANY(:networkSlugs)
AND entities.type = 'network'
OR (entities.slug = ANY(:channelSlugs)
AND entities.type = 'channel')
UNION ALL
SELECT entities.*
FROM entities
INNER JOIN selected_entities ON selected_entities.id = entities.parent_id
`, {
networkSlugs,
channelSlugs,
}));
const sceneIds = await entityQuery
.clone()
.select('releases.id')
.distinct('releases.id')
.whereNotNull('releases.id')
.from('selected_entities')
.leftJoin('releases', 'releases.entity_id', 'selected_entities.id')
.pluck('releases.id');
if (sceneIds.length === 0) {
logger.info(`No scenes or movies found to remove for ${entitySlugs}`);
return;
}
const confirmed = await inquirer.prompt([{
type: 'confirm',
name: 'flushEntities',
message: `You are about to remove ${sceneIds.length} scenes for ${entitySlugs}. Are you sure?`,
default: false,
}]);
if (!confirmed.flushEntities) {
logger.warn(`Confirmation rejected, not flushing scenes for: ${entitySlugs}`);
return;
}
await deleteScenes(sceneIds);
}
module.exports = {
curateEntity,
curateEntities,
@@ -199,4 +250,5 @@ module.exports = {
fetchEntity,
fetchEntities,
searchEntities,
flushEntities,
};

View File

@@ -121,9 +121,18 @@ async function searchReleases(query, limit = 100) {
return releases.map(release => curateRelease(release));
}
async function deleteScenes(sceneIds) {
await knex('releases')
.whereIn('id', sceneIds)
.delete();
// TODO: wipe media without associations, clean disk
}
module.exports = {
curateRelease,
fetchRelease,
fetchReleases,
searchReleases,
deleteScenes,
};