Compare commits
3 Commits
master
...
whalemembe
Author | SHA1 | Date |
---|---|---|
|
63e3ac5ef0 | |
|
ded7c64907 | |
|
1cedcae753 |
|
@ -11,12 +11,9 @@
|
||||||
"no-tabs": "off",
|
"no-tabs": "off",
|
||||||
"no-unused-vars": ["error", {"argsIgnorePattern": "^_"}],
|
"no-unused-vars": ["error", {"argsIgnorePattern": "^_"}],
|
||||||
"no-console": 0,
|
"no-console": 0,
|
||||||
"arrow-body-style": 0,
|
|
||||||
"default-param-last": 0,
|
"default-param-last": 0,
|
||||||
"template-curly-spacing": "off",
|
"template-curly-spacing": "off",
|
||||||
"max-len": 0,
|
"max-len": 0,
|
||||||
"func-names": 0,
|
|
||||||
"space-before-function-paren": 0,
|
|
||||||
"vue/no-v-html": 0,
|
"vue/no-v-html": 0,
|
||||||
"vue/html-indent": ["error", "tab"],
|
"vue/html-indent": ["error", "tab"],
|
||||||
"vue/multiline-html-element-content-newline": 0,
|
"vue/multiline-html-element-content-newline": 0,
|
||||||
|
|
|
@ -9,10 +9,8 @@ public/js/*
|
||||||
public/css/*
|
public/css/*
|
||||||
public/img/tags
|
public/img/tags
|
||||||
public/img/logos/
|
public/img/logos/
|
||||||
public/banners
|
|
||||||
config/*
|
config/*
|
||||||
!config/default.js
|
!config/default.js
|
||||||
!config/analvids.json
|
|
||||||
assets/js/config/
|
assets/js/config/
|
||||||
!assets/js/config/default.js
|
!assets/js/config/default.js
|
||||||
/export*
|
/export*
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
[submodule "common"]
|
|
||||||
path = common
|
|
||||||
url = git@unknown.name:DebaucheryLibrarian/traxxx-common.git
|
|
|
@ -1,4 +0,0 @@
|
||||||
<!-- Generated by IcoMoon.io -->
|
|
||||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path d="M11.445 0.055l-8.945 8.945-2.5 7 6.995-2.5 8.95-8.945c0.5-2-2.5-5-4.5-4.5zM4.5 11l-1-1 8.5-8.5 1 1-8.5 8.5z"></path>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 264 B |
|
@ -1,4 +0,0 @@
|
||||||
<!-- Generated by IcoMoon.io -->
|
|
||||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path d="M11.91 0c-0.159 0-0.315 0.018-0.465 0.055l-8.945 8.945-2.5 7 6.995-2.5 8.95-8.945c0.462-1.85-2.069-4.555-4.035-4.555zM6.525 12.025l-2.553-2.553 7.5-7.5 2.555 2.555-7.502 7.498z"></path>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 333 B |
|
@ -1,5 +0,0 @@
|
||||||
<!-- Generated by IcoMoon.io -->
|
|
||||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path d="M12 8.5v5.5h-10v-10h5.5l2-2h-8c-0.825 0-1.5 0.675-1.5 1.5v11c0 0.825 0.675 1.5 1.5 1.5h11c0.825 0 1.5-0.675 1.5-1.5v-8l-2 2z"></path>
|
|
||||||
<path d="M13.5 0l-9.5 9.5v2.5h2.5l9.5-9.5c0-1.5-1-2.5-2.5-2.5z"></path>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 353 B |
|
@ -1,5 +0,0 @@
|
||||||
<!-- Generated by IcoMoon.io -->
|
|
||||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
|
||||||
<path d="M12 8.5v5.5h-10v-10h5.5l2-2h-8c-0.825 0-1.5 0.675-1.5 1.5v11c0 0.825 0.675 1.5 1.5 1.5h11c0.825 0 1.5-0.675 1.5-1.5v-8l-2 2z"></path>
|
|
||||||
<path d="M13.5 0l-9.5 9.5v2.5h2.5l9.5-9.5c0-1.5-1-2.5-2.5-2.5zM6.5 10l-0.75-0.75 7.5-7.5 0.75 0.75-7.5 7.5z"></path>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 398 B |
|
@ -39,7 +39,7 @@ function initReleasesActions(store, router) {
|
||||||
before,
|
before,
|
||||||
orderBy,
|
orderBy,
|
||||||
exclude: store.state.ui.tagFilter,
|
exclude: store.state.ui.tagFilter,
|
||||||
batchShowcased: true,
|
batchShowcased: range === 'new' ? true : [true, false],
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
1
common
|
@ -1 +0,0 @@
|
||||||
Subproject commit dc00c3d58af2c23530b8b3cb6704f3860fdd7d0f
|
|
|
@ -131,25 +131,6 @@ module.exports = {
|
||||||
'paintoy',
|
'paintoy',
|
||||||
'aganmedon',
|
'aganmedon',
|
||||||
'sensualpain',
|
'sensualpain',
|
||||||
// porn world
|
|
||||||
'1byday',
|
|
||||||
'bustylover',
|
|
||||||
'ddfbusty',
|
|
||||||
'ddfnetworkvr',
|
|
||||||
'eurogirlsongirls',
|
|
||||||
'euroteenerotica',
|
|
||||||
'fuckinhd',
|
|
||||||
'handsonhardcore',
|
|
||||||
'hotlegsandfeet',
|
|
||||||
'houseoftaboo',
|
|
||||||
'onlyblowjob',
|
|
||||||
// letsdoeit
|
|
||||||
'xchimera',
|
|
||||||
'scamangels',
|
|
||||||
'bitchesabroad',
|
|
||||||
'pornoacademie',
|
|
||||||
'bumsbus',
|
|
||||||
'kinkyinlaws',
|
|
||||||
],
|
],
|
||||||
networks: [
|
networks: [
|
||||||
// dummy network for testing
|
// dummy network for testing
|
||||||
|
@ -157,8 +138,6 @@ module.exports = {
|
||||||
// porn doe
|
// porn doe
|
||||||
'forbondage',
|
'forbondage',
|
||||||
'score',
|
'score',
|
||||||
// porncz
|
|
||||||
'porncz',
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
profiles: [
|
profiles: [
|
||||||
|
@ -210,9 +189,12 @@ module.exports = {
|
||||||
'hotcrazymess',
|
'hotcrazymess',
|
||||||
'thatsitcomshow',
|
'thatsitcomshow',
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
// Adult DVD Empire
|
||||||
|
'elegantangel',
|
||||||
|
'westcoastproductions',
|
||||||
|
],
|
||||||
'21sextury',
|
'21sextury',
|
||||||
'dogfartnetwork',
|
|
||||||
'adultempire',
|
|
||||||
'julesjordan',
|
'julesjordan',
|
||||||
'dorcelclub',
|
'dorcelclub',
|
||||||
'bang',
|
'bang',
|
||||||
|
@ -229,7 +211,6 @@ module.exports = {
|
||||||
'vrcosplayx',
|
'vrcosplayx',
|
||||||
'teamskeet',
|
'teamskeet',
|
||||||
'mylf',
|
'mylf',
|
||||||
'spermmania',
|
|
||||||
[
|
[
|
||||||
'letsdoeit',
|
'letsdoeit',
|
||||||
'mamacitaz',
|
'mamacitaz',
|
||||||
|
@ -269,15 +250,13 @@ module.exports = {
|
||||||
'topwebmodels',
|
'topwebmodels',
|
||||||
'pascalssubsluts',
|
'pascalssubsluts',
|
||||||
'kellymadison',
|
'kellymadison',
|
||||||
'5kporn',
|
|
||||||
'private',
|
'private',
|
||||||
|
'ddfnetwork',
|
||||||
'bangbros',
|
'bangbros',
|
||||||
'hitzefrei',
|
'hitzefrei',
|
||||||
'porncz',
|
'porncz',
|
||||||
'czechav',
|
'czechav',
|
||||||
'angelogodshackoriginal',
|
|
||||||
'littlecapricedreams',
|
'littlecapricedreams',
|
||||||
'missyx',
|
|
||||||
'gangbangcreampie',
|
'gangbangcreampie',
|
||||||
'gloryholesecrets',
|
'gloryholesecrets',
|
||||||
'aziani',
|
'aziani',
|
||||||
|
@ -289,10 +268,7 @@ module.exports = {
|
||||||
'silverstonedvd',
|
'silverstonedvd',
|
||||||
'silviasaint',
|
'silviasaint',
|
||||||
],
|
],
|
||||||
[
|
'legalporno',
|
||||||
'analvids',
|
|
||||||
'pornworld',
|
|
||||||
],
|
|
||||||
'pierrewoodman',
|
'pierrewoodman',
|
||||||
'score',
|
'score',
|
||||||
'boobpedia',
|
'boobpedia',
|
||||||
|
@ -317,7 +293,6 @@ module.exports = {
|
||||||
'www.deeper.com',
|
'www.deeper.com',
|
||||||
'www.slayed.com',
|
'www.slayed.com',
|
||||||
'www.milfy.com',
|
'www.milfy.com',
|
||||||
'www.wifey.com',
|
|
||||||
'sthw-trailer-vixen.ssl-cdn.com',
|
'sthw-trailer-vixen.ssl-cdn.com',
|
||||||
'sthw-trailer-tushy.ssl-cdn.com',
|
'sthw-trailer-tushy.ssl-cdn.com',
|
||||||
'sthw-trailer-tushyraw.ssl-cdn.com',
|
'sthw-trailer-tushyraw.ssl-cdn.com',
|
||||||
|
@ -325,7 +300,6 @@ module.exports = {
|
||||||
'sthw-trailer-blackedraw.ssl-cdn.com',
|
'sthw-trailer-blackedraw.ssl-cdn.com',
|
||||||
'sthw-trailer-deeper.ssl-cdn.com',
|
'sthw-trailer-deeper.ssl-cdn.com',
|
||||||
'sthw-trailer-milfy.ssl-cdn.com',
|
'sthw-trailer-milfy.ssl-cdn.com',
|
||||||
'sthw-trailer-wifey.ssl-cdn.com',
|
|
||||||
'streamhw-trailer-vixen.ssl-cdn.com',
|
'streamhw-trailer-vixen.ssl-cdn.com',
|
||||||
'streamhw-trailer-tushy.ssl-cdn.com',
|
'streamhw-trailer-tushy.ssl-cdn.com',
|
||||||
'streamhw-trailer-tushyraw.ssl-cdn.com',
|
'streamhw-trailer-tushyraw.ssl-cdn.com',
|
||||||
|
@ -333,7 +307,6 @@ module.exports = {
|
||||||
'streamhw-trailer-blackedraw.ssl-cdn.com',
|
'streamhw-trailer-blackedraw.ssl-cdn.com',
|
||||||
'streamhw-trailer-deeper.ssl-cdn.com',
|
'streamhw-trailer-deeper.ssl-cdn.com',
|
||||||
'streamhw-trailer-milfy.ssl-cdn.com',
|
'streamhw-trailer-milfy.ssl-cdn.com',
|
||||||
'streamhw-trailer-wifey.ssl-cdn.com',
|
|
||||||
'cdn.vixen.com',
|
'cdn.vixen.com',
|
||||||
'cdn.tushy.com',
|
'cdn.tushy.com',
|
||||||
'cdn.blacked.com',
|
'cdn.blacked.com',
|
||||||
|
@ -342,8 +315,6 @@ module.exports = {
|
||||||
'cdn.tushyraw.com',
|
'cdn.tushyraw.com',
|
||||||
'cdn.slayed.com',
|
'cdn.slayed.com',
|
||||||
'cdn.milfy.com',
|
'cdn.milfy.com',
|
||||||
'cdn.wifey.com',
|
|
||||||
'www.analvids.com',
|
|
||||||
'www.vogov.com',
|
'www.vogov.com',
|
||||||
'www.vogov.com',
|
'www.vogov.com',
|
||||||
'www.nubiles.net',
|
'www.nubiles.net',
|
||||||
|
@ -361,17 +332,6 @@ module.exports = {
|
||||||
'www.badteenspunished.com',
|
'www.badteenspunished.com',
|
||||||
'www.cumlouder.com',
|
'www.cumlouder.com',
|
||||||
'im0.imgcm.com',
|
'im0.imgcm.com',
|
||||||
// Spizoo
|
|
||||||
'www.spizoo.com',
|
|
||||||
'www.creamher.com',
|
|
||||||
'www.gothgirlfriends.com',
|
|
||||||
'www.mrluckypov.com',
|
|
||||||
'www.mrluckyvip.com',
|
|
||||||
'www.mrluckyraw.com',
|
|
||||||
'www.firstclasspov.com',
|
|
||||||
'www.rawattack.com',
|
|
||||||
'www.realsensual.com',
|
|
||||||
'www.vlogxxx.com',
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
bypass: {
|
bypass: {
|
||||||
|
@ -397,38 +357,22 @@ module.exports = {
|
||||||
interval: 50,
|
interval: 50,
|
||||||
concurrency: 20,
|
concurrency: 20,
|
||||||
},
|
},
|
||||||
media: {
|
'www.deeper.com': {
|
||||||
interval: 50,
|
enable: false, // can be omitted to enable
|
||||||
concurrency: 20,
|
|
||||||
},
|
|
||||||
'www.kink.com': {
|
|
||||||
interval: 1000,
|
interval: 1000,
|
||||||
concurrency: 1,
|
concurrency: 1,
|
||||||
},
|
},
|
||||||
'www.brazzers.com': {
|
|
||||||
interval: 2000,
|
|
||||||
concurrency: 1,
|
|
||||||
},
|
|
||||||
'www.realitykings.com': {
|
|
||||||
interval: 2000,
|
|
||||||
concurrency: 1,
|
|
||||||
},
|
|
||||||
'www.analvids.com': { // seems to error at default rate
|
|
||||||
interval: 500,
|
|
||||||
concurrency: 1,
|
|
||||||
},
|
|
||||||
'images.mylfcdn.net': {
|
|
||||||
interval: 50,
|
|
||||||
concurrency: 1,
|
|
||||||
},
|
|
||||||
'westcoastproductions.com': {
|
'westcoastproductions.com': {
|
||||||
interval: 100,
|
interval: 100,
|
||||||
concurrency: 1,
|
concurrency: 1,
|
||||||
},
|
},
|
||||||
|
'images.mylfcdn.net': {
|
||||||
|
interval: 50,
|
||||||
|
concurrency: 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
fetchAfter: [1, 'week'],
|
fetchAfter: [1, 'week'],
|
||||||
missingDateLimit: 3,
|
missingDateLimit: 3,
|
||||||
upcomingMissingDateLimit: 20,
|
|
||||||
memorySampling: {
|
memorySampling: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
sampleDuration: 300000, // 5 minutes
|
sampleDuration: 300000, // 5 minutes
|
||||||
|
@ -446,12 +390,11 @@ module.exports = {
|
||||||
thumbnailQuality: 100,
|
thumbnailQuality: 100,
|
||||||
lazySize: 90,
|
lazySize: 90,
|
||||||
lazyQuality: 90,
|
lazyQuality: 90,
|
||||||
trailerQuality: [540, 720, 960, 480, 1080, 360, 320, 1440, 1600, 1920, 2160, 270, 240, 180],
|
trailerQuality: [540, 720, 480, 360, 960, 1080, 320, 1440, 1600, 1920, 2160, 270, 240, 180],
|
||||||
limit: 25, // max number of photos per release
|
limit: 25, // max number of photos per release
|
||||||
attempts: 2,
|
attempts: 2,
|
||||||
fetchStreams: true,
|
fetchStreams: true,
|
||||||
streamConcurrency: 2, // max number of video streams (m3u8 etc.) to fetch and process at once
|
streamConcurrency: 2, // max number of video streams (m3u8 etc.) to fetch and process at once
|
||||||
flushWindow: 1000,
|
|
||||||
},
|
},
|
||||||
titleSlugLength: 50,
|
titleSlugLength: 50,
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,25 +18,17 @@ const scenesFields = `
|
||||||
network_id int,
|
network_id int,
|
||||||
network_name text,
|
network_name text,
|
||||||
network_slug text,
|
network_slug text,
|
||||||
studio_id int,
|
|
||||||
studio_name text,
|
|
||||||
studio_slug text,
|
|
||||||
entity_ids multi,
|
entity_ids multi,
|
||||||
actor_ids multi,
|
actor_ids multi,
|
||||||
actors text,
|
actors text,
|
||||||
tag_ids multi,
|
tag_ids multi,
|
||||||
tags text,
|
tags text,
|
||||||
movie_ids multi,
|
|
||||||
movies text,
|
|
||||||
serie_ids multi,
|
|
||||||
series text,
|
|
||||||
meta text,
|
meta text,
|
||||||
date timestamp,
|
date timestamp,
|
||||||
is_showcased bool,
|
is_showcased bool,
|
||||||
created_at timestamp,
|
created_at timestamp,
|
||||||
effective_date timestamp,
|
effective_date timestamp,
|
||||||
stashed int,
|
stashed int
|
||||||
dupe_index int
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const moviesFields = `
|
const moviesFields = `
|
||||||
|
@ -61,8 +53,7 @@ const moviesFields = `
|
||||||
effective_date timestamp,
|
effective_date timestamp,
|
||||||
stashed int,
|
stashed int,
|
||||||
stashed_scenes int,
|
stashed_scenes int,
|
||||||
stashed_total int,
|
stashed_total int
|
||||||
dupe_index int
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const actorsFields = `
|
const actorsFields = `
|
||||||
|
@ -83,41 +74,39 @@ const actorsFields = `
|
||||||
scenes int
|
scenes int
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports.up = async () => {
|
exports.up = async (knex) => {
|
||||||
try {
|
try {
|
||||||
await utilsApi.sql(`create table if not exists scenes (${scenesFields})`);
|
await utilsApi.sql(`create table scenes (${scenesFields})`);
|
||||||
|
|
||||||
await utilsApi.sql(`create table if not exists scenes_stashed (
|
await utilsApi.sql(`create table scenes_stashed (
|
||||||
scene_id int,
|
scene_id int,
|
||||||
stash_id int,
|
stash_id int,
|
||||||
user_id int,
|
user_id int,
|
||||||
created_at timestamp
|
created_at timestamp
|
||||||
)`);
|
)`);
|
||||||
|
|
||||||
await utilsApi.sql(`create table if not exists movies (${moviesFields})`);
|
await utilsApi.sql(`create table movies (${moviesFields})`);
|
||||||
|
|
||||||
await utilsApi.sql(`create table if not exists movies_stashed (
|
await utilsApi.sql(`create table movies_stashed (
|
||||||
movie_id int,
|
movie_id int,
|
||||||
stash_id int,
|
stash_id int,
|
||||||
user_id int,
|
user_id int,
|
||||||
created_at timestamp
|
created_at timestamp
|
||||||
)`);
|
)`);
|
||||||
|
|
||||||
await utilsApi.sql(`create table if not exists actors (${actorsFields}) min_prefix_len='3'`);
|
await utilsApi.sql(`create table actors (${actorsFields})`);
|
||||||
|
|
||||||
await utilsApi.sql(`create table if not exists actors_stashed (
|
await utilsApi.sql(`create table actors_stashed (
|
||||||
actor_id int,
|
actor_id int,
|
||||||
stash_id int,
|
stash_id int,
|
||||||
user_id int,
|
user_id int,
|
||||||
created_at timestamp
|
created_at timestamp
|
||||||
)`);
|
)`);
|
||||||
|
|
||||||
/*
|
|
||||||
await knex.schema.alterTable('stashes_scenes', (table) => table.increments('id'));
|
await knex.schema.alterTable('stashes_scenes', (table) => table.increments('id'));
|
||||||
await knex.schema.alterTable('stashes_movies', (table) => table.increments('id'));
|
await knex.schema.alterTable('stashes_movies', (table) => table.increments('id'));
|
||||||
await knex.schema.alterTable('stashes_actors', (table) => table.increments('id'));
|
await knex.schema.alterTable('stashes_actors', (table) => table.increments('id'));
|
||||||
await knex.schema.alterTable('stashes_series', (table) => table.increments('id'));
|
await knex.schema.alterTable('stashes_series', (table) => table.increments('id'));
|
||||||
*/
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,16 +16,6 @@ exports.up = async (knex) => {
|
||||||
.notNullable()
|
.notNullable()
|
||||||
.defaultTo(true);
|
.defaultTo(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
await knex.raw(`
|
|
||||||
UPDATE alerts
|
|
||||||
SET
|
|
||||||
all_actors = false,
|
|
||||||
all_entities = false,
|
|
||||||
all_tags = false,
|
|
||||||
all_matches= false
|
|
||||||
WHERE alerts.all = false;
|
|
||||||
`);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
exports.down = async (knex) => {
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
const config = require('config');
|
|
||||||
|
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.alterTable('entities', (table) => {
|
|
||||||
// internal options, as opposed to parameters for scraper options
|
|
||||||
table.json('options');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('releases', (table) => {
|
|
||||||
table.dropForeign('entity_id');
|
|
||||||
|
|
||||||
table.foreign('entity_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('entities')
|
|
||||||
.onDelete('cascade');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('releases_caps', (table) => {
|
|
||||||
table.unique(['release_id', 'media_id']);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.createTable('movies_tags', (table) => {
|
|
||||||
table.integer('tag_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('tags');
|
|
||||||
|
|
||||||
table.integer('movie_id')
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('movies')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.text('original_tag');
|
|
||||||
|
|
||||||
table.text('source')
|
|
||||||
.defaultTo('scraper');
|
|
||||||
|
|
||||||
table.unique(['tag_id', 'movie_id']);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.raw('GRANT ALL ON ALL TABLES IN SCHEMA public TO :visitor;', {
|
|
||||||
visitor: knex.raw(config.database.query.user),
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.alterTable('entities', (table) => {
|
|
||||||
table.dropColumn('options');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('releases', (table) => {
|
|
||||||
table.dropForeign('entity_id');
|
|
||||||
|
|
||||||
table.foreign('entity_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('entities')
|
|
||||||
.onDelete('no action');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('releases_caps', (table) => {
|
|
||||||
table.dropUnique(['release_id', 'media_id']);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.dropTable('movies_tags');
|
|
||||||
};
|
|
|
@ -1,31 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.alterTable('entities_tags', (table) => {
|
|
||||||
table.dropForeign('tag_id');
|
|
||||||
table.dropForeign('entity_id');
|
|
||||||
|
|
||||||
table.foreign('tag_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('tags')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.foreign('entity_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('entities')
|
|
||||||
.onDelete('cascade');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.alterTable('entities_tags', (table) => {
|
|
||||||
table.dropForeign('tag_id');
|
|
||||||
table.dropForeign('entity_id');
|
|
||||||
|
|
||||||
table.foreign('tag_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('tags');
|
|
||||||
|
|
||||||
table.foreign('entity_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('entities');
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,25 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.createTable('users_templates', (table) => {
|
|
||||||
table.increments('id');
|
|
||||||
|
|
||||||
table.integer('user_id')
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('users');
|
|
||||||
|
|
||||||
table.string('name')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.text('template')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.unique(['user_id', 'name']);
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.dropTable('users_templates');
|
|
||||||
};
|
|
|
@ -1,28 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.createTable('users_keys', (table) => {
|
|
||||||
table.increments('id');
|
|
||||||
|
|
||||||
table.integer('user_id')
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('users');
|
|
||||||
|
|
||||||
table.text('key')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.string('identifier');
|
|
||||||
|
|
||||||
table.unique(['user_id', 'identifier']);
|
|
||||||
|
|
||||||
table.datetime('last_used_at');
|
|
||||||
table.specificType('last_used_ip', 'inet');
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.dropTable('users_keys');
|
|
||||||
};
|
|
|
@ -1,87 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.createTable('scenes_revisions', (table) => {
|
|
||||||
table.increments('id');
|
|
||||||
|
|
||||||
table.integer('scene_id')
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('releases')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.integer('user_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('users')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.json('base')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.json('deltas')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.text('hash')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.text('comment');
|
|
||||||
|
|
||||||
table.boolean('approved');
|
|
||||||
|
|
||||||
table.integer('reviewed_by')
|
|
||||||
.references('id')
|
|
||||||
.inTable('users')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.datetime('reviewed_at');
|
|
||||||
table.text('feedback');
|
|
||||||
|
|
||||||
table.datetime('applied_at');
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.createTable('bans', (table) => {
|
|
||||||
table.increments('id');
|
|
||||||
|
|
||||||
table.integer('user_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('users')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.string('username');
|
|
||||||
table.specificType('ip', 'cidr');
|
|
||||||
|
|
||||||
table.boolean('match_all')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(false);
|
|
||||||
|
|
||||||
table.string('scope');
|
|
||||||
table.boolean('shadow');
|
|
||||||
|
|
||||||
table.integer('banned_by')
|
|
||||||
.references('id')
|
|
||||||
.inTable('users')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.datetime('expires_at')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('users', (table) => {
|
|
||||||
table.specificType('last_ip', 'cidr');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.dropTable('scenes_revisions');
|
|
||||||
await knex.schema.dropTable('bans');
|
|
||||||
|
|
||||||
await knex.schema.alterTable('users', (table) => {
|
|
||||||
table.dropColumn('last_ip');
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,35 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.alterTable('actors', (table) => {
|
|
||||||
table.integer('leg');
|
|
||||||
table.integer('foot');
|
|
||||||
table.integer('thigh');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors_profiles', (table) => {
|
|
||||||
table.integer('leg');
|
|
||||||
table.integer('foot');
|
|
||||||
table.integer('thigh');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('releases', (table) => {
|
|
||||||
table.integer('video_count');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.alterTable('actors', (table) => {
|
|
||||||
table.dropColumn('leg');
|
|
||||||
table.dropColumn('foot');
|
|
||||||
table.dropColumn('thigh');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors_profiles', (table) => {
|
|
||||||
table.dropColumn('leg');
|
|
||||||
table.dropColumn('foot');
|
|
||||||
table.dropColumn('thigh');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('releases', (table) => {
|
|
||||||
table.dropColumn('video_count');
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,15 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.alterTable('scenes_revisions', (table) => {
|
|
||||||
table.integer('scene_id')
|
|
||||||
.nullable()
|
|
||||||
.alter();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.alterTable('scenes_revisions', (table) => {
|
|
||||||
table.integer('scene_id')
|
|
||||||
.notNullable()
|
|
||||||
.alter();
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,119 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.raw('CREATE UNIQUE INDEX unique_main_profiles ON actors_profiles (actor_id) WHERE (entity_id IS NULL);');
|
|
||||||
|
|
||||||
await knex.schema.createTable('actors_revisions', (table) => {
|
|
||||||
table.increments('id');
|
|
||||||
|
|
||||||
table.integer('actor_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('actors')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.integer('profile_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('actors_profiles')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.integer('user_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('users')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.json('base')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.json('deltas')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.text('hash')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.text('comment');
|
|
||||||
|
|
||||||
table.boolean('approved');
|
|
||||||
|
|
||||||
table.integer('reviewed_by')
|
|
||||||
.references('id')
|
|
||||||
.inTable('users')
|
|
||||||
.onDelete('set null');
|
|
||||||
|
|
||||||
table.datetime('reviewed_at');
|
|
||||||
table.text('feedback');
|
|
||||||
|
|
||||||
table.datetime('applied_at');
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors', (table) => {
|
|
||||||
table.integer('boobs_volume');
|
|
||||||
table.enum('boobs_implant', ['saline', 'silicone', 'gummy', 'fat']);
|
|
||||||
table.enum('boobs_placement', ['over', 'under']);
|
|
||||||
table.string('boobs_surgeon');
|
|
||||||
|
|
||||||
table.boolean('natural_butt');
|
|
||||||
table.integer('butt_volume');
|
|
||||||
table.enum('butt_implant', ['bbl', 'lift', 'silicone', 'lipo', 'filler', 'mms']);
|
|
||||||
|
|
||||||
table.boolean('natural_lips');
|
|
||||||
table.integer('lips_volume');
|
|
||||||
|
|
||||||
table.string('agency');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors_profiles', (table) => {
|
|
||||||
table.integer('boobs_volume');
|
|
||||||
table.enum('boobs_implant', ['saline', 'silicone', 'gummy', 'fat']);
|
|
||||||
table.enum('boobs_placement', ['over', 'under']);
|
|
||||||
table.string('boobs_surgeon');
|
|
||||||
|
|
||||||
table.boolean('natural_butt');
|
|
||||||
table.integer('butt_volume');
|
|
||||||
table.enum('butt_implant', ['bbl', 'lift', 'silicone', 'lipo', 'filler', 'mms']);
|
|
||||||
|
|
||||||
table.boolean('natural_lips');
|
|
||||||
table.integer('lips_volume');
|
|
||||||
|
|
||||||
table.string('agency');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.raw('DROP INDEX unique_main_profiles;');
|
|
||||||
|
|
||||||
await knex.schema.dropTable('actors_revisions');
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors', (table) => {
|
|
||||||
table.dropColumn('boobs_volume');
|
|
||||||
table.dropColumn('boobs_implant');
|
|
||||||
table.dropColumn('boobs_placement');
|
|
||||||
table.dropColumn('boobs_surgeon');
|
|
||||||
|
|
||||||
table.dropColumn('natural_butt');
|
|
||||||
table.dropColumn('butt_volume');
|
|
||||||
table.dropColumn('butt_implant');
|
|
||||||
|
|
||||||
table.dropColumn('natural_lips');
|
|
||||||
table.dropColumn('lips_volume');
|
|
||||||
|
|
||||||
table.dropColumn('agency');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors_profiles', (table) => {
|
|
||||||
table.dropColumn('boobs_volume');
|
|
||||||
table.dropColumn('boobs_implant');
|
|
||||||
table.dropColumn('boobs_placement');
|
|
||||||
table.dropColumn('boobs_surgeon');
|
|
||||||
|
|
||||||
table.dropColumn('natural_butt');
|
|
||||||
table.dropColumn('butt_volume');
|
|
||||||
table.dropColumn('butt_implant');
|
|
||||||
|
|
||||||
table.dropColumn('natural_lips');
|
|
||||||
table.dropColumn('lips_volume');
|
|
||||||
|
|
||||||
table.dropColumn('agency');
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,19 +0,0 @@
|
||||||
function createColumns(table) {
|
|
||||||
table.enum('boobs_incision', ['mammary', 'areolar', 'crescent', 'lollipop', 'anchor', 'axillary', 'umbilical']);
|
|
||||||
table.boolean('natural_labia');
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.alterTable('actors', createColumns);
|
|
||||||
await knex.schema.alterTable('actors_profiles', createColumns);
|
|
||||||
};
|
|
||||||
|
|
||||||
function dropColumns(table) {
|
|
||||||
table.dropColumn('boobs_incision');
|
|
||||||
table.dropColumn('natural_labia');
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.alterTable('actors', dropColumns);
|
|
||||||
await knex.schema.alterTable('actors_profiles', dropColumns);
|
|
||||||
};
|
|
|
@ -1,75 +0,0 @@
|
||||||
exports.up = async function(knex) {
|
|
||||||
// restore avatars in table in case of rollback and rerun
|
|
||||||
const avatars = await knex('actors_avatars')
|
|
||||||
.select('actors_avatars.*', 'actors_profiles.actor_id')
|
|
||||||
.leftJoin('actors_profiles', 'actors_profiles.id', 'actors_avatars.profile_id');
|
|
||||||
|
|
||||||
await knex('actors_avatars').delete();
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors_avatars', (table) => {
|
|
||||||
table.integer('profile_id')
|
|
||||||
.nullable()
|
|
||||||
.alter();
|
|
||||||
|
|
||||||
table.integer('actor_id')
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('actors');
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
|
|
||||||
table.dropUnique('profile_id');
|
|
||||||
table.unique(['profile_id', 'media_id']);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('media', (table) => {
|
|
||||||
// actor avatars often retain the same URL when updated, handle URL-deduping in app code
|
|
||||||
table.dropUnique('source');
|
|
||||||
table.string('source_version'); // usually etag
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.raw('CREATE UNIQUE INDEX unique_main_avatars ON actors_avatars (actor_id) WHERE (profile_id IS NULL);');
|
|
||||||
|
|
||||||
if (avatars.length > 0) {
|
|
||||||
await knex('actors_avatars').insert(avatars);
|
|
||||||
}
|
|
||||||
|
|
||||||
const profiles = await knex('actors_profiles')
|
|
||||||
.select('id', 'actor_id', 'avatar_media_id')
|
|
||||||
.whereNotNull('avatar_media_id');
|
|
||||||
|
|
||||||
await knex('actors_avatars')
|
|
||||||
.insert(profiles.map((profile) => ({
|
|
||||||
actor_id: profile.actor_id,
|
|
||||||
profile_id: profile.id,
|
|
||||||
media_id: profile.avatar_media_id,
|
|
||||||
})))
|
|
||||||
.onConflict()
|
|
||||||
.ignore();
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async function(knex) {
|
|
||||||
// no need to delete all entries, only the ones incompatible with the old scheme
|
|
||||||
await knex('actors_avatars')
|
|
||||||
.whereNull('profile_id')
|
|
||||||
.delete();
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors_avatars', (table) => {
|
|
||||||
table.integer('profile_id')
|
|
||||||
.notNullable()
|
|
||||||
.alter();
|
|
||||||
|
|
||||||
table.dropColumn('actor_id');
|
|
||||||
table.dropColumn('created_at');
|
|
||||||
|
|
||||||
table.unique('profile_id');
|
|
||||||
table.dropUnique(['profile_id', 'media_id']);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('media', (table) => {
|
|
||||||
table.dropColumn('source_version');
|
|
||||||
table.unique('source');
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,46 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.alterTable('actors_social', (table) => {
|
|
||||||
table.dropUnique(['url', 'actor_id', 'profile_id']);
|
|
||||||
table.dropColumn('profile_id');
|
|
||||||
|
|
||||||
table.string('handle');
|
|
||||||
|
|
||||||
table.boolean('is_broken')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(false);
|
|
||||||
|
|
||||||
table.datetime('pinged_at');
|
|
||||||
table.datetime('verified_at');
|
|
||||||
|
|
||||||
table.unique(['actor_id', 'platform', 'handle']);
|
|
||||||
table.unique(['actor_id', 'url']);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.raw('ALTER TABLE actors_social ADD CONSTRAINT socials_url_or_handle CHECK (num_nulls(handle, url) = 1);');
|
|
||||||
await knex.raw('ALTER TABLE actors_social ADD CONSTRAINT socials_handle_and_platform CHECK (num_nulls(platform, handle) = 2 or num_nulls(platform, handle) = 0);');
|
|
||||||
|
|
||||||
await knex.schema.renameTable('actors_social', 'actors_socials');
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.raw('ALTER TABLE actors_socials DROP CONSTRAINT socials_url_or_handle;');
|
|
||||||
await knex.raw('ALTER TABLE actors_socials DROP CONSTRAINT socials_handle_and_platform;');
|
|
||||||
|
|
||||||
await knex.schema.renameTable('actors_socials', 'actors_social');
|
|
||||||
|
|
||||||
await knex.schema.alterTable('actors_social', (table) => {
|
|
||||||
table.dropUnique(['actor_id', 'platform', 'handle']);
|
|
||||||
table.dropUnique(['actor_id', 'url']);
|
|
||||||
|
|
||||||
table.integer('profile_id')
|
|
||||||
.references('id')
|
|
||||||
.inTable('actors_profiles');
|
|
||||||
|
|
||||||
table.dropColumn('handle');
|
|
||||||
table.dropColumn('verified_at');
|
|
||||||
table.dropColumn('pinged_at');
|
|
||||||
table.dropColumn('is_broken');
|
|
||||||
|
|
||||||
table.unique(['url', 'actor_id', 'profile_id']);
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,53 +0,0 @@
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.alterTable('media', (table) => table.index('sfw_media_id'));
|
|
||||||
await knex.schema.alterTable('actors_profiles', (table) => table.index('avatar_media_id'));
|
|
||||||
await knex.schema.alterTable('actors_avatars', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('actors_photos', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('chapters_photos', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('chapters_posters', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_covers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_photos', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_posters', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_teasers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_trailers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_caps', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_covers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_posters', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_photos', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_teasers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_trailers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('series_covers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('series_photos', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('series_posters', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('series_teasers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('series_trailers', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('tags_photos', (table) => table.index('media_id'));
|
|
||||||
await knex.schema.alterTable('tags_posters', (table) => table.index('media_id'));
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.alterTable('media', (table) => table.dropIndex('sfw_media_id'));
|
|
||||||
await knex.schema.alterTable('actors_profiles', (table) => table.dropIndex('avatar_media_id'));
|
|
||||||
await knex.schema.alterTable('actors_avatars', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('actors_photos', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('chapters_photos', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('chapters_posters', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_covers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_photos', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_posters', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_teasers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('movies_trailers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_caps', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_covers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_posters', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_photos', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_teasers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('releases_trailers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('series_covers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('series_photos', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('series_posters', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('series_teasers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('series_trailers', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('tags_photos', (table) => table.dropIndex('media_id'));
|
|
||||||
await knex.schema.alterTable('tags_posters', (table) => table.dropIndex('media_id'));
|
|
||||||
};
|
|
|
@ -1,102 +0,0 @@
|
||||||
const config = require('config');
|
|
||||||
|
|
||||||
exports.up = async (knex) => {
|
|
||||||
await knex.schema.alterTable('alerts', (table) => {
|
|
||||||
table.boolean('from_preset')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(false);
|
|
||||||
|
|
||||||
table.text('comment');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.createMaterializedView('alerts_users_actors', (view) => {
|
|
||||||
view.columns('user_id', 'actor_id', 'alert_ids');
|
|
||||||
|
|
||||||
view.as(
|
|
||||||
knex('alerts_actors')
|
|
||||||
.select(
|
|
||||||
'alerts.user_id',
|
|
||||||
'alerts_actors.actor_id',
|
|
||||||
knex.raw('array_agg(distinct alerts.id) as alert_ids'),
|
|
||||||
knex.raw('(alerts_tags.id is null and alerts_entities.id is null and alerts_matches.id is null and related_actors.id is null) as is_only'),
|
|
||||||
)
|
|
||||||
.leftJoin('alerts', 'alerts.id', 'alerts_actors.alert_id')
|
|
||||||
.leftJoin('alerts_entities', 'alerts_entities.alert_id', 'alerts_actors.alert_id')
|
|
||||||
.leftJoin('alerts_tags', 'alerts_tags.alert_id', 'alerts_actors.alert_id')
|
|
||||||
.leftJoin('alerts_matches', 'alerts_matches.alert_id', 'alerts_actors.alert_id')
|
|
||||||
.leftJoin('alerts_actors as related_actors', (joinBuilder) => {
|
|
||||||
joinBuilder
|
|
||||||
.on('related_actors.alert_id', 'alerts_actors.alert_id')
|
|
||||||
.on('related_actors.actor_id', '!=', 'alerts_actors.actor_id');
|
|
||||||
})
|
|
||||||
.groupBy(['user_id', 'alerts_actors.actor_id', 'is_only']),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.createMaterializedView('alerts_users_tags', (view) => {
|
|
||||||
view.columns('user_id', 'tag_id', 'alert_ids');
|
|
||||||
|
|
||||||
view.as(
|
|
||||||
knex('alerts_tags')
|
|
||||||
.select(
|
|
||||||
'alerts.user_id',
|
|
||||||
'alerts_tags.tag_id',
|
|
||||||
knex.raw('array_agg(distinct alerts.id) as alert_ids'),
|
|
||||||
knex.raw('(alerts_actors.id is null and alerts_entities.id is null and alerts_matches.id is null and related_tags.id is null) as is_only'),
|
|
||||||
)
|
|
||||||
.leftJoin('alerts', 'alerts.id', 'alerts_tags.alert_id')
|
|
||||||
.leftJoin('alerts_entities', 'alerts_entities.alert_id', 'alerts_tags.alert_id')
|
|
||||||
.leftJoin('alerts_actors', 'alerts_actors.alert_id', 'alerts_tags.alert_id')
|
|
||||||
.leftJoin('alerts_matches', 'alerts_matches.alert_id', 'alerts_tags.alert_id')
|
|
||||||
.leftJoin('alerts_tags as related_tags', (joinBuilder) => {
|
|
||||||
joinBuilder
|
|
||||||
.on('related_tags.alert_id', 'alerts_tags.alert_id')
|
|
||||||
.on('related_tags.tag_id', '!=', 'alerts_tags.tag_id');
|
|
||||||
})
|
|
||||||
.groupBy(['user_id', 'alerts_tags.tag_id', 'is_only']),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.createMaterializedView('alerts_users_entities', (view) => {
|
|
||||||
view.columns('user_id', 'entity_id', 'alert_ids');
|
|
||||||
|
|
||||||
view.as(
|
|
||||||
knex('alerts_entities')
|
|
||||||
.select(
|
|
||||||
'alerts.user_id',
|
|
||||||
'alerts_entities.entity_id',
|
|
||||||
knex.raw('array_agg(distinct alerts.id) as alert_ids'),
|
|
||||||
knex.raw('(alerts_actors.id is null and alerts_tags.id is null and alerts_matches.id is null and related_entities.id is null) as is_only'),
|
|
||||||
)
|
|
||||||
.leftJoin('alerts', 'alerts.id', 'alerts_entities.alert_id')
|
|
||||||
.leftJoin('alerts_tags', 'alerts_tags.alert_id', 'alerts_entities.alert_id')
|
|
||||||
.leftJoin('alerts_actors', 'alerts_actors.alert_id', 'alerts_entities.alert_id')
|
|
||||||
.leftJoin('alerts_matches', 'alerts_matches.alert_id', 'alerts_entities.alert_id')
|
|
||||||
.leftJoin('alerts_entities as related_entities', (joinBuilder) => {
|
|
||||||
joinBuilder
|
|
||||||
.on('related_entities.alert_id', 'alerts_entities.alert_id')
|
|
||||||
.on('related_entities.entity_id', '!=', 'alerts_entities.entity_id');
|
|
||||||
})
|
|
||||||
.groupBy(['user_id', 'alerts_entities.entity_id', 'is_only']),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.raw(`
|
|
||||||
GRANT SELECT ON alerts_users_actors TO :visitor;
|
|
||||||
GRANT SELECT ON alerts_users_entities TO :visitor;
|
|
||||||
GRANT SELECT ON alerts_users_tags TO :visitor;
|
|
||||||
`, {
|
|
||||||
visitor: knex.raw(config.database.query.user),
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async (knex) => {
|
|
||||||
await knex.schema.alterTable('alerts', (table) => {
|
|
||||||
table.dropColumn('from_preset');
|
|
||||||
table.dropColumn('comment');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.dropMaterializedView('alerts_users_actors');
|
|
||||||
await knex.schema.dropMaterializedView('alerts_users_tags');
|
|
||||||
await knex.schema.dropMaterializedView('alerts_users_entities');
|
|
||||||
};
|
|
|
@ -1,21 +0,0 @@
|
||||||
exports.up = async function(knex) {
|
|
||||||
await knex.schema.alterTable('alerts', (table) => {
|
|
||||||
table.json('meta');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('stashes', (table) => {
|
|
||||||
table.text('comment');
|
|
||||||
table.json('meta');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.down = async function(knex) {
|
|
||||||
await knex.schema.alterTable('alerts', (table) => {
|
|
||||||
table.dropColumn('meta');
|
|
||||||
});
|
|
||||||
|
|
||||||
await knex.schema.alterTable('stashes', (table) => {
|
|
||||||
table.dropColumn('comment');
|
|
||||||
table.dropColumn('meta');
|
|
||||||
});
|
|
||||||
};
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "traxxx",
|
"name": "traxxx",
|
||||||
"version": "1.244.55",
|
"version": "1.237.11",
|
||||||
"description": "All the latest porn releases in one place",
|
"description": "All the latest porn releases in one place",
|
||||||
"main": "src/app.js",
|
"main": "src/app.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -106,13 +106,12 @@
|
||||||
"express-session": "^1.17.3",
|
"express-session": "^1.17.3",
|
||||||
"face-api.js": "^0.22.2",
|
"face-api.js": "^0.22.2",
|
||||||
"file-type": "^18.7.0",
|
"file-type": "^18.7.0",
|
||||||
"fluent-ffmpeg": "^2.1.3",
|
"fluent-ffmpeg": "^2.1.2",
|
||||||
"fs-extra": "^11.1.1",
|
"fs-extra": "^11.1.1",
|
||||||
"graphile-build": "^4.14.0",
|
"graphile-build": "^4.14.0",
|
||||||
"graphile-utils": "^4.14.0",
|
"graphile-utils": "^4.14.0",
|
||||||
"graphql": "^15.8.0",
|
"graphql": "^15.8.0",
|
||||||
"html-entities": "^2.4.0",
|
"html-entities": "^2.4.0",
|
||||||
"https-proxy-agent": "^7.0.5",
|
|
||||||
"iconv-lite": "^0.6.3",
|
"iconv-lite": "^0.6.3",
|
||||||
"inquirer": "^8.2.6",
|
"inquirer": "^8.2.6",
|
||||||
"inspector-api": "^1.4.8",
|
"inspector-api": "^1.4.8",
|
||||||
|
@ -135,7 +134,7 @@
|
||||||
"postgraphile-plugin-connection-filter": "^2.3.0",
|
"postgraphile-plugin-connection-filter": "^2.3.0",
|
||||||
"promise-task-queue": "^1.2.0",
|
"promise-task-queue": "^1.2.0",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"puppeteer": "^24.4.0",
|
"puppeteer": "^21.5.2",
|
||||||
"puppeteer-extra": "^3.3.6",
|
"puppeteer-extra": "^3.3.6",
|
||||||
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
||||||
"redis": "^4.6.11",
|
"redis": "^4.6.11",
|
||||||
|
@ -148,7 +147,7 @@
|
||||||
"tunnel": "0.0.6",
|
"tunnel": "0.0.6",
|
||||||
"ua-parser-js": "^1.0.37",
|
"ua-parser-js": "^1.0.37",
|
||||||
"undici": "^5.28.1",
|
"undici": "^5.28.1",
|
||||||
"unprint": "^0.15.6",
|
"unprint": "^0.10.11",
|
||||||
"url-pattern": "^1.0.3",
|
"url-pattern": "^1.0.3",
|
||||||
"v-tooltip": "^2.1.3",
|
"v-tooltip": "^2.1.3",
|
||||||
"video.js": "^8.6.1",
|
"video.js": "^8.6.1",
|
||||||
|
|
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 105 KiB |
After Width: | Height: | Size: 71 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 67 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 59 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 50 KiB |
After Width: | Height: | Size: 64 KiB |
|
@ -0,0 +1 @@
|
||||||
|
<iframe style="background-color: white;" width="300" height="100" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10002480" src="//a.adtng.com/get/10002480?ata=DebaucheryLibrarian"></iframe>
|
|
@ -0,0 +1 @@
|
||||||
|
<iframe style="background-color: white;" width="300" height="250" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10001807" src="//a.adtng.com/get/10001807?ata=DebaucheryLibrarian"></iframe>
|
|
@ -0,0 +1 @@
|
||||||
|
<iframe style="background-color: white;" width="315" height="300" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10002484" src="//a.adtng.com/get/10002484?ata=DebaucheryLibrarian"></iframe>
|
|
@ -0,0 +1 @@
|
||||||
|
<iframe style="background-color: white;" width="728" height="90" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10002481" src="//a.adtng.com/get/10002481?ata=DebaucheryLibrarian"></iframe>
|
|
@ -0,0 +1 @@
|
||||||
|
<iframe style="background-color: white;" width="728" height="90" scrolling="no" frameborder="0" allowtransparency="true" marginheight="0" marginwidth="0" name="spot_id_10002466" src="//a.adtng.com/get/10002466?ata=DebaucheryLibrarian"></iframe>
|
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 190 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 83 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 146 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 498 KiB |
After Width: | Height: | Size: 145 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 191 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 41 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 69 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 72 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 676 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 55 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 100 KiB |