Added profile flush.
This commit is contained in:
@@ -7,6 +7,7 @@ const moment = require('moment');
|
||||
const blake2 = require('blake2');
|
||||
const DOMPurify = require('dompurify');
|
||||
const { JSDOM } = require('jsdom');
|
||||
const omit = require('object.omit');
|
||||
|
||||
const { window } = new JSDOM('');
|
||||
const domPurify = DOMPurify(window);
|
||||
@@ -21,7 +22,7 @@ const bulkInsert = require('./utils/bulk-insert');
|
||||
const logger = require('./logger')(__filename);
|
||||
|
||||
const { toBaseReleases } = require('./deep');
|
||||
const { associateAvatars } = require('./media');
|
||||
const { associateAvatars, flushOrphanedMedia } = require('./media');
|
||||
|
||||
const slugify = require('./utils/slugify');
|
||||
const capitalize = require('./utils/capitalize');
|
||||
@@ -436,18 +437,26 @@ async function curateProfile(profile, actor) {
|
||||
}
|
||||
}
|
||||
|
||||
async function interpolateProfiles(actorIdsOrNames) {
|
||||
const profiles = await knex('actors_profiles')
|
||||
.select('actors_profiles.*', knex.raw('row_to_json(media) as avatar'))
|
||||
async function fetchProfiles(actorIdsOrNames) {
|
||||
return knex('actors_profiles')
|
||||
.select(knex.raw('actors_profiles.*, row_to_json(actors) as actor, row_to_json(media) as avatar'))
|
||||
.leftJoin('actors', 'actors.id', 'actors_profiles.actor_id')
|
||||
.modify((query) => {
|
||||
if (actorIdsOrNames?.length > 0) {
|
||||
if (actorIdsOrNames) {
|
||||
query
|
||||
.whereIn('actor_id', actorIdsOrNames.filter(idOrName => typeof idOrName === 'number'))
|
||||
.orWhereIn('actors.name', actorIdsOrNames.filter(idOrName => typeof idOrName === 'string'));
|
||||
.orWhere((builder) => {
|
||||
builder
|
||||
.whereIn('actors.name', actorIdsOrNames.filter(idOrName => typeof idOrName === 'string'))
|
||||
.whereNull('actors.entity_id');
|
||||
});
|
||||
}
|
||||
})
|
||||
.leftJoin('media', 'actors_profiles.avatar_media_id', 'media.id');
|
||||
}
|
||||
|
||||
async function interpolateProfiles(actorIdsOrNames) {
|
||||
const profiles = await fetchProfiles(actorIdsOrNames);
|
||||
|
||||
const profilesByActorId = profiles.reduce((acc, profile) => ({
|
||||
...acc,
|
||||
@@ -545,6 +554,27 @@ async function interpolateProfiles(actorIdsOrNames) {
|
||||
|
||||
const transaction = await knex.transaction();
|
||||
|
||||
// clear existing interpolated data
|
||||
const emptyProfile = Object
|
||||
.keys(omit(curateProfileEntry({ id: 1 }), ['id', 'actor_id', 'entity_id', 'url', 'description_hash']))
|
||||
.reduce((acc, key) => ({ ...acc, [key]: null }), {});
|
||||
|
||||
await knex('actors')
|
||||
.modify((modifyBuilder) => {
|
||||
if (actorIdsOrNames) {
|
||||
modifyBuilder
|
||||
.whereIn('id', actorIdsOrNames.filter(idOrName => typeof idOrName === 'number'))
|
||||
.orWhere((whereBuilder) => {
|
||||
whereBuilder
|
||||
.whereIn('name', actorIdsOrNames.filter(idOrName => typeof idOrName === 'string'))
|
||||
.whereNull('entity_id');
|
||||
});
|
||||
}
|
||||
})
|
||||
.update(emptyProfile)
|
||||
.transacting(transaction);
|
||||
|
||||
// insert new interpolated data
|
||||
const queries = interpolatedProfiles.map(profile => knex('actors')
|
||||
.where('id', profile.id)
|
||||
.update(profile)
|
||||
@@ -689,6 +719,30 @@ async function storeProfiles(profiles) {
|
||||
await interpolateProfiles(actorIds);
|
||||
}
|
||||
|
||||
async function flushProfiles(actorIdsOrNames) {
|
||||
const profiles = await fetchProfiles(actorIdsOrNames);
|
||||
const actorNames = Array.from(new Set(profiles.map(profile => profile.actor.name)));
|
||||
|
||||
const deleteCount = await knex('actors_profiles')
|
||||
.whereIn('id', profiles.map(profile => profile.id))
|
||||
.delete();
|
||||
|
||||
await interpolateProfiles(actorIdsOrNames);
|
||||
await flushOrphanedMedia(); // don't flush until main avatar is detached by re-interpolating
|
||||
|
||||
if (actorNames.length > 20) {
|
||||
logger.info(`Removed ${deleteCount} profiles for ${actorNames.length} actors`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (deleteCount > 0) {
|
||||
logger.info(`Removed ${deleteCount} profiles for ${actorNames.join(', ')}`);
|
||||
return;
|
||||
}
|
||||
|
||||
logger.info(`Removed ${deleteCount} profiles`);
|
||||
}
|
||||
|
||||
async function scrapeActors(argNames) {
|
||||
const actorNames = await getActorNames(argNames);
|
||||
const baseActors = toBaseActors(actorNames);
|
||||
@@ -905,8 +959,9 @@ async function searchActors(query) {
|
||||
module.exports = {
|
||||
associateActors,
|
||||
fetchActor,
|
||||
flushProfiles,
|
||||
interpolateProfiles,
|
||||
scrapeActors,
|
||||
searchActors,
|
||||
toBaseActors,
|
||||
interpolateProfiles,
|
||||
};
|
||||
|
||||
@@ -9,7 +9,7 @@ const knex = require('./knex');
|
||||
const fetchUpdates = require('./updates');
|
||||
const { fetchScenes, fetchMovies } = require('./deep');
|
||||
const { storeScenes, storeMovies, updateReleasesSearch } = require('./store-releases');
|
||||
const { scrapeActors, interpolateProfiles } = require('./actors');
|
||||
const { scrapeActors, flushProfiles, interpolateProfiles } = require('./actors');
|
||||
const { flushEntities } = require('./entities');
|
||||
const { deleteScenes, deleteMovies, flushBatches } = require('./releases');
|
||||
const { flushOrphanedMedia } = require('./media');
|
||||
@@ -26,7 +26,11 @@ async function init() {
|
||||
}
|
||||
|
||||
if (argv.interpolateProfiles) {
|
||||
await interpolateProfiles(argv.interpolateProfiles);
|
||||
await interpolateProfiles(argv.flushProfiles.length > 0 ? argv.flushProfiles : null);
|
||||
}
|
||||
|
||||
if (argv.flushProfiles) {
|
||||
await flushProfiles(argv.flushProfiles.length > 0 ? argv.flushProfiles : null);
|
||||
}
|
||||
|
||||
if (argv.flushNetworks || argv.flushChannels) {
|
||||
|
||||
@@ -268,6 +268,11 @@ const { argv } = yargs
|
||||
type: 'array',
|
||||
alias: 'flush-network',
|
||||
})
|
||||
.option('flush-profiles', {
|
||||
describe: 'Delete all profiles for an actor.',
|
||||
type: 'array',
|
||||
alias: ['flush-profile', 'flush-actors', 'flush-actor'],
|
||||
})
|
||||
.option('flush-batches', {
|
||||
describe: 'Delete all scenes and movies from batch by ID.',
|
||||
type: 'array',
|
||||
|
||||
@@ -779,6 +779,7 @@ async function flushOrphanedMedia() {
|
||||
knex('releases_teasers').select('media_id'),
|
||||
knex('movies_covers').select('media_id'),
|
||||
knex('movies_trailers').select('media_id'),
|
||||
knex('actors').select(knex.raw('avatar_media_id as media_id')),
|
||||
knex('actors_profiles').select(knex.raw('avatar_media_id as media_id')),
|
||||
knex('actors_photos').select('media_id'),
|
||||
knex('clips_photos').select('media_id'),
|
||||
|
||||
Reference in New Issue
Block a user