Compare commits
3 Commits
91746c73e1
...
70795a69c8
Author | SHA1 | Date |
---|---|---|
|
70795a69c8 | |
|
236d4fcde7 | |
|
ba3b87471e |
|
@ -64,7 +64,7 @@
|
|||
>
|
||||
<img
|
||||
:src="`/media/${cover.thumbnail}`"
|
||||
:style="{ background: sfw ? `/media/${cover.sfw.lazy}` : `/media/${cover.lazy}` }"
|
||||
:style="{ 'background-image': sfw ? `url(/media/${cover.sfw.lazy})` : `url(/media/${cover.lazy})` }"
|
||||
class="item cover"
|
||||
loading="lazy"
|
||||
@load="$emit('load', $event)"
|
||||
|
@ -86,7 +86,7 @@
|
|||
>
|
||||
<img
|
||||
:src="sfw ? `/img/${photo.sfw.thumbnail}` : `/media/${photo.thumbnail}`"
|
||||
:style="{ background: sfw ? `/img/${photo.sfw.lazy}` : `/media/${photo.lazy}` }"
|
||||
:style="{ 'background-image': sfw ? `url(/img/${photo.sfw.lazy})` : `url(/media/${photo.lazy})` }"
|
||||
:alt="`Photo ${photo.index + 1}`"
|
||||
loading="lazy"
|
||||
class="item"
|
||||
|
|
|
@ -30,7 +30,7 @@ exports.up = knex => Promise.resolve()
|
|||
|
||||
table.text('hash');
|
||||
|
||||
table.integer('size', 12);
|
||||
table.bigInteger('size', 12);
|
||||
table.integer('quality', 6);
|
||||
table.integer('width', 6);
|
||||
table.integer('height', 6);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "traxxx",
|
||||
"version": "1.151.1",
|
||||
"version": "1.151.2",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "traxxx",
|
||||
"version": "1.151.1",
|
||||
"version": "1.151.2",
|
||||
"description": "All the latest porn releases in one place",
|
||||
"main": "src/app.js",
|
||||
"scripts": {
|
||||
|
|
After Width: | Height: | Size: 2.6 MiB |
After Width: | Height: | Size: 6.2 KiB |
After Width: | Height: | Size: 2.7 MiB |
After Width: | Height: | Size: 25 KiB |
After Width: | Height: | Size: 1007 KiB |
After Width: | Height: | Size: 6.3 KiB |
After Width: | Height: | Size: 543 KiB |
After Width: | Height: | Size: 30 KiB |
|
@ -801,15 +801,16 @@ const tagPhotos = [
|
|||
['fake-boobs', 14, 'Rikki Six for Dream Dolls'],
|
||||
['fake-boobs', 2, 'Gia Milana in "Hot Anal Latina" for HardX'],
|
||||
['fake-boobs', 17, 'Felina in "With Flowers On The Floor" for LouisDeMirabert'],
|
||||
['fake-boobs', 18, 'Ebony Godess for Action Girls'],
|
||||
['fake-boobs', 1, 'Lela Star in "Thick" for Jules Jordan'],
|
||||
['fake-boobs', 16, 'Marsha May in "Once You Go Black 7" for Jules Jordan'],
|
||||
['fake-boobs', 18, 'Ebony Godess for Action Girls'],
|
||||
['fake-boobs', 9, 'Putri Cinta for Watch 4 Beauty'],
|
||||
['fake-boobs', 3, 'Ashly Anderson for Passion HD'],
|
||||
['fake-boobs', 22, 'Sakura Sena'],
|
||||
['fake-boobs', 16, 'Marsha May in "Once You Go Black 7" for Jules Jordan'],
|
||||
['fake-boobs', 23, 'Lulu Sex Bomb in "Tropical Touch"'],
|
||||
['fake-boobs', 21, 'Emelie Ekström'],
|
||||
['fake-boobs', 10, 'Tia Cyrus in "Titty-Fucked Yoga Goddess" for Latina Sex Tapes'],
|
||||
['fake-boobs', 24, 'Shalina Devine in "Rumbling in the Ring, Part 2" for DDF Network'],
|
||||
['fake-boobs', 20, 'Chloe Lamour for DDF Busty'],
|
||||
['fake-boobs', 11, 'Jessa Rhodes and Cali Carter in "Busty Anal Workout" for LesbianX'],
|
||||
['fake-boobs', 13, 'Kitana Lure for Asshole Fever'],
|
||||
|
@ -837,6 +838,7 @@ const tagPhotos = [
|
|||
['latina', 1, 'Jynx Maze in "Big Anal Asses 2" for HardX'],
|
||||
['latina', 0, 'Vienna Black for Spizoo'],
|
||||
['maid', 1, 'Alessandra Jane for Brazzers'],
|
||||
['milf', 2, 'Shalina Devine for Anal Mom'],
|
||||
// ['milf', 0, 'Olivia Austin in "Dredd 3" for Jules Jordan'],
|
||||
['mff', 0, 'Madison Ivy, Adriana Chechik and Keiran Lee in "Day With A Pornstar" for Brazzers'],
|
||||
['mfm', 7, 'Rose Valerie for Euro Sex Parties'],
|
||||
|
|
|
@ -11,7 +11,7 @@ const { fetchScenes, fetchMovies } = require('./deep');
|
|||
const { storeScenes, storeMovies, updateReleasesSearch } = require('./store-releases');
|
||||
const { scrapeActors, flushActors, flushProfiles, interpolateProfiles } = require('./actors');
|
||||
const { flushEntities } = require('./entities');
|
||||
const { deleteScenes, deleteMovies, flushBatches } = require('./releases');
|
||||
const { deleteScenes, deleteMovies, flushScenes, flushBatches } = require('./releases');
|
||||
const { flushOrphanedMedia } = require('./media');
|
||||
const getFileEntries = require('./utils/file-entries');
|
||||
|
||||
|
@ -45,6 +45,10 @@ async function init() {
|
|||
await flushBatches(argv.flushBatches);
|
||||
}
|
||||
|
||||
if (argv.flushScenes) {
|
||||
await flushScenes();
|
||||
}
|
||||
|
||||
if (argv.deleteScenes) {
|
||||
await deleteScenes(argv.deleteScenes);
|
||||
}
|
||||
|
|
|
@ -283,6 +283,10 @@ const { argv } = yargs
|
|||
type: 'array',
|
||||
alias: 'flush-batch',
|
||||
})
|
||||
.option('flush-scenes', {
|
||||
describe: 'Remove all scenes.',
|
||||
type: 'boolean',
|
||||
})
|
||||
.option('delete-scenes', {
|
||||
describe: 'Remove scenes by ID.',
|
||||
type: 'array',
|
||||
|
|
|
@ -657,6 +657,8 @@ async function storeMedias(baseMedias, options) {
|
|||
const newMediaWithEntries = savedMedias.filter(Boolean).map((media, index) => curateMediaEntry(media, index));
|
||||
const newMediaEntries = newMediaWithEntries.filter(media => media.newEntry).map(media => media.entry);
|
||||
|
||||
// TODO: path duplicates disappear in DO NOTHING query, causing association error. source duplicate detection not working? use scene generator
|
||||
// await bulkInsert('media', newMediaEntries, false);
|
||||
await bulkInsert('media', newMediaEntries);
|
||||
|
||||
return [...newMediaWithEntries, ...existingHashMedias];
|
||||
|
|
|
@ -155,6 +155,27 @@ async function deleteScenes(sceneIds) {
|
|||
return deleteCount;
|
||||
}
|
||||
|
||||
async function flushScenes() {
|
||||
const sceneIds = await knex('releases').select('id').pluck('id');
|
||||
|
||||
const confirmed = await inquirer.prompt([{
|
||||
type: 'confirm',
|
||||
name: 'flushScenes',
|
||||
message: `You are about to remove ${sceneIds.length} scenes. Are you sure?`,
|
||||
default: false,
|
||||
}]);
|
||||
|
||||
if (!confirmed.flushScenes) {
|
||||
logger.warn('Confirmation rejected, not flushing scenes');
|
||||
return;
|
||||
}
|
||||
const deleteCount = await deleteScenes(sceneIds);
|
||||
|
||||
await flushOrphanedMedia();
|
||||
|
||||
logger.info(`Removed ${deleteCount}/${sceneIds.length} scenes`);
|
||||
}
|
||||
|
||||
async function deleteMovies(movieIds) {
|
||||
if (movieIds.length === 0) {
|
||||
return 0;
|
||||
|
@ -208,6 +229,7 @@ module.exports = {
|
|||
fetchScene,
|
||||
fetchScenes,
|
||||
flushBatches,
|
||||
flushScenes,
|
||||
searchScenes,
|
||||
deleteScenes,
|
||||
deleteMovies,
|
||||
|
|
|
@ -11,13 +11,13 @@ function scrapeAll(scenes, entity) {
|
|||
release.url = query.url('.videoPic a');
|
||||
release.entryId = query.q('.videoPic img', 'id').match(/set-target-(\d+)/)[1];
|
||||
|
||||
release.title = query.q('h3 a', true);
|
||||
release.description = query.q('.runtime + p', true);
|
||||
release.title = query.cnt('h3 a');
|
||||
release.description = query.cnt('.runtime + p');
|
||||
|
||||
release.date = query.date('.date', 'MM-DD-YYYY');
|
||||
release.duration = query.dur('.runtime');
|
||||
|
||||
release.actors = query.all('.tour_update_models a', true);
|
||||
release.actors = query.cnts('.tour_update_models a');
|
||||
|
||||
release.poster = query.img('.videoPic img');
|
||||
release.entity = entity;
|
||||
|
@ -31,10 +31,10 @@ function scrapeScene({ query }) {
|
|||
|
||||
release.entryId = query.q('.trailerLeft img', 'id').match(/set-target-(\d+)/)[1];
|
||||
|
||||
release.title = query.q('.infoHeader h1', true);
|
||||
release.description = query.q('.infoBox p', true);
|
||||
release.title = query.cnt('.infoHeader h1');
|
||||
release.description = query.cnt('.infoBox p');
|
||||
|
||||
release.actors = query.all('.tour_update_models a', true);
|
||||
release.actors = query.cnts('.infoBox .tour_update_models a');
|
||||
|
||||
release.poster = query.img('.posterimg');
|
||||
release.photos = query.imgs('.trailerSnaps img').slice(1); // first photo is poster in lower quality
|
||||
|
@ -55,10 +55,10 @@ function scrapeProfile({ query }) {
|
|||
|
||||
const bio = query.all('.moreInfo li').reduce((acc, el) => ({
|
||||
...acc,
|
||||
[slugify(query.q(el, 'span', true), '_')]: query.text(el),
|
||||
[slugify(query.cnt(el, 'span'), '_')]: query.text(el),
|
||||
}), {});
|
||||
|
||||
profile.description = query.q('.aboutModel p', true);
|
||||
profile.description = query.cnt('.aboutModel p');
|
||||
profile.dateOfBirth = qu.extractDate(bio.date_of_birth, ['MMMM D, YYYY', 'DD-MMM-YY']);
|
||||
|
||||
profile.birthPlace = bio.birth_location;
|
||||
|
|