traxxx/src/tools/manticore-actors.js

106 lines
2.6 KiB
JavaScript

'use strict';
const config = require('config');
const manticore = require('manticoresearch');
const args = require('yargs').argv;
const knex = require('../knex');
const mantiClient = new manticore.ApiClient();
mantiClient.basePath = `http://${config.database.manticore.host}:${config.database.manticore.httpPort}`;
const searchApi = new manticore.SearchApi(mantiClient);
const utilsApi = new manticore.UtilsApi(mantiClient);
const indexApi = new manticore.IndexApi(mantiClient);
const update = args.update;
async function fetchActors() {
// manually select date of birth, otherwise it is retrieved in local timezone but interpreted as UTC...
const actors = await knex.raw(`
SELECT
actors_meta.*,
date_of_birth AT TIME ZONE 'Europe/Amsterdam' AT TIME ZONE 'UTC' as dob
FROM actors_meta;
`);
return actors.rows;
}
async function init() {
if (update) {
await utilsApi.sql('drop table actors');
await utilsApi.sql(`create table actors(
id int,
name text,
slug string,
gender string,
date_of_birth timestamp,
country string,
has_avatar bool,
weight int,
height int,
cup string,
natural_boobs int,
penis_length int,
penis_girth int,
stashed int,
scenes int
)`);
const actors = await fetchActors();
const docs = actors.map((actor) => ({
insert: {
index: 'actors',
id: actor.id,
doc: {
name: actor.name,
slug: actor.slug,
gender: actor.gender || undefined,
date_of_birth: actor.dob ? Math.round(actor.dob.getTime() / 1000) : undefined,
has_avatar: !!actor.avatar_media_id,
country: actor.birth_country_alpha2 || undefined,
height: actor.height || undefined,
weight: actor.weight || undefined,
cup: actor.cup || undefined,
natural_boobs: actor.natural_boobs === null ? 0 : Number(actor.natural_boobs) + 1, // manticore bool does not seem to support null, and we need three states for natural_boobs: yes, no and unknown
penis_length: actor.penis_length || undefined,
penis_girth: actor.penis_girth || undefined,
stashed: actor.stashed || 0,
scenes: actor.scenes || 0,
},
},
}));
const data = await indexApi.bulk(docs.map((doc) => JSON.stringify(doc)).join('\n')).catch((error) => {
console.log(error);
});
console.log('data', data);
knex.destroy();
return;
}
const result = await searchApi.search({
index: 'actors',
query: {
equals: {
has_avatar: 1,
},
},
limit: 3,
sort: [{ slug: 'asc' }],
});
console.log(result);
console.log(result.hits?.hits);
knex.destroy();
}
init();