Storing actor profiles from scene pages.
This commit is contained in:
parent
53b0101a12
commit
1bfdf4b232
|
@ -75,7 +75,8 @@ module.exports = {
|
||||||
'blowpass',
|
'blowpass',
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
// MindGeek; Brazzers and Mile High Media have their own assets
|
// MindGeek; Mile High Media has its own assets
|
||||||
|
'brazzers',
|
||||||
'realitykings',
|
'realitykings',
|
||||||
'mofos',
|
'mofos',
|
||||||
'digitalplayground',
|
'digitalplayground',
|
||||||
|
@ -90,7 +91,6 @@ module.exports = {
|
||||||
],
|
],
|
||||||
'wicked',
|
'wicked',
|
||||||
'burningangel',
|
'burningangel',
|
||||||
'brazzers',
|
|
||||||
'milehighmedia',
|
'milehighmedia',
|
||||||
[
|
[
|
||||||
'vixen',
|
'vixen',
|
||||||
|
|
|
@ -123,8 +123,9 @@ function toBaseActors(actorsOrNames, release) {
|
||||||
const baseActor = {
|
const baseActor = {
|
||||||
name,
|
name,
|
||||||
slug,
|
slug,
|
||||||
entryId: entryId || null,
|
entryId: entryId || actorOrName.entryId || null,
|
||||||
entity: release?.site?.network || release?.entity?.parent || release?.entity || null,
|
entity: release?.entity?.parent || release?.entity || null,
|
||||||
|
hasProfile: !!actorOrName.name, // actor contains profile information
|
||||||
};
|
};
|
||||||
|
|
||||||
if (actorOrName.name) {
|
if (actorOrName.name) {
|
||||||
|
@ -227,6 +228,10 @@ function curateActorEntries(baseActors, batchId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function curateProfileEntry(profile) {
|
function curateProfileEntry(profile) {
|
||||||
|
if (!profile.id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
const curatedProfileEntry = {
|
const curatedProfileEntry = {
|
||||||
...(profile.update !== false && { id: profile.update }),
|
...(profile.update !== false && { id: profile.update }),
|
||||||
actor_id: profile.id,
|
actor_id: profile.id,
|
||||||
|
@ -371,10 +376,10 @@ async function curateProfile(profile) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function interpolateProfiles(actors) {
|
async function interpolateProfiles(actorIds) {
|
||||||
const profiles = await knex('actors_profiles')
|
const profiles = await knex('actors_profiles')
|
||||||
.select(['actors_profiles.*', 'media.width as avatar_width', 'media.height as avatar_height', 'media.size as avatar_size'])
|
.select(['actors_profiles.*', 'media.width as avatar_width', 'media.height as avatar_height', 'media.size as avatar_size'])
|
||||||
.whereIn('actor_id', actors.map(actor => actor.id))
|
.whereIn('actor_id', actorIds)
|
||||||
.leftJoin('media', 'actors_profiles.avatar_media_id', 'media.id');
|
.leftJoin('media', 'actors_profiles.avatar_media_id', 'media.id');
|
||||||
|
|
||||||
const profilesByActorId = profiles.reduce((acc, profile) => ({
|
const profilesByActorId = profiles.reduce((acc, profile) => ({
|
||||||
|
@ -482,8 +487,8 @@ async function interpolateProfiles(actors) {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function upsertProfiles(profiles) {
|
async function upsertProfiles(profiles) {
|
||||||
const newProfileEntries = profiles.filter(profile => !profile.update).map(profile => curateProfileEntry(profile));
|
const newProfileEntries = profiles.filter(profile => !profile.update).map(profile => curateProfileEntry(profile)).filter(Boolean);
|
||||||
const updatingProfileEntries = profiles.filter(profile => profile.update).map(profile => curateProfileEntry(profile));
|
const updatingProfileEntries = profiles.filter(profile => profile.update).map(profile => curateProfileEntry(profile)).filter(Boolean);
|
||||||
|
|
||||||
if (newProfileEntries.length > 0) {
|
if (newProfileEntries.length > 0) {
|
||||||
await bulkInsert('actors_profiles', newProfileEntries);
|
await bulkInsert('actors_profiles', newProfileEntries);
|
||||||
|
@ -602,6 +607,14 @@ async function getActorNames(actorNames) {
|
||||||
return actorsWithoutProfiles.rows.map(actor => actor.name);
|
return actorsWithoutProfiles.rows.map(actor => actor.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function storeProfiles(profiles) {
|
||||||
|
const profilesWithAvatarIds = await associateAvatars(profiles);
|
||||||
|
const actorIds = Array.from(new Set(profiles.map(profile => profile.id)));
|
||||||
|
|
||||||
|
await upsertProfiles(profilesWithAvatarIds);
|
||||||
|
await interpolateProfiles(actorIds);
|
||||||
|
}
|
||||||
|
|
||||||
async function scrapeActors(argNames) {
|
async function scrapeActors(argNames) {
|
||||||
const actorNames = await getActorNames(argNames);
|
const actorNames = await getActorNames(argNames);
|
||||||
const baseActors = toBaseActors(actorNames);
|
const baseActors = toBaseActors(actorNames);
|
||||||
|
@ -668,10 +681,7 @@ async function scrapeActors(argNames) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argv.save) {
|
if (argv.save) {
|
||||||
const profilesWithAvatarIds = await associateAvatars(profiles);
|
await storeProfiles(profiles);
|
||||||
|
|
||||||
await upsertProfiles(profilesWithAvatarIds);
|
|
||||||
await interpolateProfiles(actors);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return profiles;
|
return profiles;
|
||||||
|
@ -698,6 +708,24 @@ async function getOrCreateActors(baseActors, batchId) {
|
||||||
const curatedActorEntries = curateActorEntries(uniqueBaseActors, batchId);
|
const curatedActorEntries = curateActorEntries(uniqueBaseActors, batchId);
|
||||||
const newActors = await bulkInsert('actors', curatedActorEntries);
|
const newActors = await bulkInsert('actors', curatedActorEntries);
|
||||||
|
|
||||||
|
const newActorIdsByEntityIdAndSlug = newActors.reduce((acc, actor) => ({
|
||||||
|
...acc,
|
||||||
|
[actor.entity_id]: {
|
||||||
|
...acc[actor.entity_id],
|
||||||
|
[actor.slug]: actor.id,
|
||||||
|
},
|
||||||
|
}), {});
|
||||||
|
|
||||||
|
const newActorProfiles = baseActors
|
||||||
|
.filter(actor => actor.hasProfile)
|
||||||
|
.map(actor => ({
|
||||||
|
...actor,
|
||||||
|
id: newActorIdsByEntityIdAndSlug[actor.entity?.id]?.[actor.slug] || newActorIdsByEntityIdAndSlug.null?.[actor.slug],
|
||||||
|
}))
|
||||||
|
.filter(actor => !!actor.id);
|
||||||
|
|
||||||
|
await storeProfiles(newActorProfiles);
|
||||||
|
|
||||||
if (Array.isArray(newActors)) {
|
if (Array.isArray(newActors)) {
|
||||||
return newActors.concat(existingActors);
|
return newActors.concat(existingActors);
|
||||||
}
|
}
|
||||||
|
|
|
@ -267,8 +267,8 @@ async function fetchScene(url, site, baseScene) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchProfile({ name: actorName }, networkSlug, actorPath = 'model') {
|
async function fetchProfile({ name: actorName }, networkOrNetworkSlug, actorPath = 'model') {
|
||||||
const url = `https://www.${networkSlug}.com`;
|
const url = `https://www.${networkOrNetworkSlug.slug || networkOrNetworkSlug}.com`;
|
||||||
const { session, instanceToken } = await getSession(url);
|
const { session, instanceToken } = await getSession(url);
|
||||||
|
|
||||||
const res = await session.get(`https://site-api.project1service.com/v1/actors/?search=${encodeURI(actorName)}`, {
|
const res = await session.get(`https://site-api.project1service.com/v1/actors/?search=${encodeURI(actorName)}`, {
|
||||||
|
@ -281,7 +281,7 @@ async function fetchProfile({ name: actorName }, networkSlug, actorPath = 'model
|
||||||
const actorData = res.body.result.find(actor => actor.name.toLowerCase() === actorName.toLowerCase());
|
const actorData = res.body.result.find(actor => actor.name.toLowerCase() === actorName.toLowerCase());
|
||||||
|
|
||||||
if (actorData) {
|
if (actorData) {
|
||||||
const actorUrl = `https://www.${networkSlug}.com/${actorPath}/${actorData.id}/`;
|
const actorUrl = `https://www.${networkOrNetworkSlug.slug || networkOrNetworkSlug}.com/${actorPath}/${actorData.id}/`;
|
||||||
const actorReleasesUrl = `https://site-api.project1service.com/v2/releases?actorId=${actorData.id}&limit=100&offset=0&orderBy=-dateReleased&type=scene`;
|
const actorReleasesUrl = `https://site-api.project1service.com/v2/releases?actorId=${actorData.id}&limit=100&offset=0&orderBy=-dateReleased&type=scene`;
|
||||||
|
|
||||||
const [actorRes, actorReleasesRes] = await Promise.all([
|
const [actorRes, actorReleasesRes] = await Promise.all([
|
||||||
|
@ -294,11 +294,11 @@ async function fetchProfile({ name: actorName }, networkSlug, actorPath = 'model
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (actorRes.statusCode === 200 && actorReleasesRes.statusCode === 200 && actorReleasesRes.body.result) {
|
if (actorRes.statusCode === 200 && actorReleasesRes.statusCode === 200 && actorReleasesRes.body.result) {
|
||||||
return scrapeProfile(actorData, actorRes.body.toString(), actorReleasesRes.body.result, networkSlug);
|
return scrapeProfile(actorData, actorRes.body.toString(), actorReleasesRes.body.result, networkOrNetworkSlug.slug || networkOrNetworkSlug);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (actorRes.statusCode === 200) {
|
if (actorRes.statusCode === 200) {
|
||||||
return scrapeProfile(actorData, actorRes.body.toString(), null, networkSlug);
|
return scrapeProfile(actorData, actorRes.body.toString(), null, networkOrNetworkSlug.slug || networkOrNetworkSlug);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue