Compare commits
16 Commits
a4468f18dc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| aa3adbe634 | |||
| 59a700c2f3 | |||
| 18f5a6f476 | |||
| 63a178ca57 | |||
| 0ae949a616 | |||
| edc9720623 | |||
| bbc3fbb0a5 | |||
| 1fc468efac | |||
| 143c415797 | |||
| e79a4d48e1 | |||
| 343325440e | |||
| 5c018892d3 | |||
| be61293cbe | |||
| e493194ce1 | |||
| b61631c33c | |||
| fa65da75bc |
@@ -19,6 +19,9 @@
|
||||
|
||||
<meta name="viewport" content="width=device-width,height=device-height,initial-scale=1.0,interactive-widget=resizes-content" />
|
||||
|
||||
<!-- RTA restricted to adults label -->
|
||||
<meta name="RATING" content="RTA-5042-1996-1400-1577-RTA" />
|
||||
|
||||
<title>traxxx - Consent</title>
|
||||
<style>
|
||||
:root {
|
||||
@@ -156,6 +159,12 @@
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.rta {
|
||||
position: fixed;
|
||||
bottom: .5rem;
|
||||
right: .5rem;
|
||||
}
|
||||
|
||||
@media(max-width: 800px) {
|
||||
.heading {
|
||||
font-size: 1.25rem;
|
||||
@@ -219,5 +228,12 @@
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<img
|
||||
src="/img/rta.gif"
|
||||
alt="RTA Restricted To Adults"
|
||||
title="RTA Restricted To Adults"
|
||||
class="rta"
|
||||
>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
2
common
2
common
Submodule common updated: ec4b15ce33...e4d6ff6ad1
@@ -105,7 +105,7 @@
|
||||
class="bio-item residence"
|
||||
:class="{ hideable: !!actor.origin }"
|
||||
>
|
||||
<dfn class="bio-label"><Icon icon="location" />Lives in</dfn>
|
||||
<dfn class="bio-label"><Icon icon="location" />{{ actor.dateOfDeath ? 'Lived' : 'Lives' }} in</dfn>
|
||||
|
||||
<span>
|
||||
<span
|
||||
@@ -312,10 +312,10 @@
|
||||
<a
|
||||
v-for="social in socials"
|
||||
:key="`social-${social.id}`"
|
||||
v-tooltip="social.platform ? `${social.platform} ${env.socials.prefix[social.platform] || env.socials.prefix.default}${social.handle}` : social.url"
|
||||
:href="getSocialUrl(social)"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
:title="social.platform || social.url"
|
||||
class="social ellipsis"
|
||||
>
|
||||
<Icon
|
||||
@@ -339,7 +339,9 @@
|
||||
:class="`icon-social icon-${social.platform} icon-generic`"
|
||||
/>
|
||||
|
||||
<!--
|
||||
<template v-if="social.platform">{{ env.socials.prefix[social.platform] || env.socials.prefix.default }}</template>{{ social.handle }}
|
||||
-->
|
||||
</a>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -498,7 +500,7 @@ function getSocialUrl(social) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const socials = props.actor.socials.map((social) => ({
|
||||
const socials = props.actor.socials.slice(0, 10).map((social) => ({
|
||||
...social,
|
||||
handle: social.url
|
||||
? new URL(social.url).hostname
|
||||
@@ -735,19 +737,23 @@ const socials = props.actor.socials.map((social) => ({
|
||||
}
|
||||
|
||||
.socials {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
/*
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
|
||||
grid-gap: 0 0;
|
||||
overflow: hidden;
|
||||
*/
|
||||
gap: .25rem;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.social {
|
||||
display: flex;
|
||||
height: 2rem;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
padding: .1rem .5rem;
|
||||
justify-content: center;
|
||||
padding: .75rem .75rem;
|
||||
border-radius: .25rem;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
@@ -755,10 +761,6 @@ const socials = props.actor.socials.map((social) => ({
|
||||
font-weight: normal;
|
||||
background: var(--highlight-weak-40);
|
||||
|
||||
.icon {
|
||||
margin-right: .5rem;
|
||||
}
|
||||
|
||||
.icon-generic {
|
||||
fill: var(--highlight);
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
<span
|
||||
v-if="actor.ageAtDeath"
|
||||
:title="`Passed ${formatDate(actor.ageAtDeath, 'MMMM d, yyyy')}`"
|
||||
:title="`Passed ${formatDate(actor.dateOfDeath, 'MMMM d, yyyy')}`"
|
||||
class="age age-death"
|
||||
>{{ actor.ageAtDeath }}</span>
|
||||
|
||||
|
||||
@@ -266,7 +266,7 @@ const expanded = ref(new Set());
|
||||
|
||||
const mappedKeys = {
|
||||
actors: actorsById,
|
||||
tags: tagsById,
|
||||
// tags: tagsById,
|
||||
movies: moviesById,
|
||||
};
|
||||
|
||||
@@ -292,6 +292,16 @@ const curatedRevisions = computed(() => revisions.value.map((revision) => {
|
||||
}))];
|
||||
}
|
||||
|
||||
if (key === 'tags') {
|
||||
return [key, value.map((tag) => ({
|
||||
id: tag.id,
|
||||
name: tag.actorId
|
||||
? `${actorsById.value[tag.actorId]?.name}: ${tagsById.value[tag.id]?.name}`
|
||||
: tagsById.value[tag.id]?.name,
|
||||
modified: revision.deltas.some((delta) => delta.key === key && !delta.value.some((deltaTag) => deltaTag.id === tag.id && (!Object.hasOwn(tag, 'actorId') || deltaTag.actorId === tag.actorId))),
|
||||
}))];
|
||||
}
|
||||
|
||||
if (key === 'socials') {
|
||||
// new socials don't have IDs yet, so we need to compare the values
|
||||
return [key, value.map((item) => ({
|
||||
@@ -323,6 +333,19 @@ const curatedRevisions = computed(() => revisions.value.map((revision) => {
|
||||
};
|
||||
}
|
||||
|
||||
if (delta.key === 'tags') {
|
||||
return {
|
||||
...delta,
|
||||
value: delta.value.map((tag) => ({
|
||||
id: tag.id,
|
||||
name: tag.actorId
|
||||
? `${actorsById.value[tag.actorId]?.name}: ${tagsById.value[tag.id]?.name}`
|
||||
: tagsById.value[tag.id]?.name,
|
||||
modified: !revision.base[delta.key].some((baseTag) => baseTag.id === tag.id && (!Object.hasOwn(baseTag, 'actorId') || baseTag.actorId === tag.actorId)),
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
if (delta.key === 'socials') {
|
||||
// new socials don't have IDs yet, so we need to compare the values
|
||||
return {
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "traxxx-web",
|
||||
"version": "0.49.0",
|
||||
"version": "0.49.6",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"version": "0.49.0",
|
||||
"version": "0.49.6",
|
||||
"dependencies": {
|
||||
"@brillout/json-serializer": "^0.5.8",
|
||||
"@dicebear/collection": "^7.0.5",
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
"overrides": {
|
||||
"vite": "$vite"
|
||||
},
|
||||
"version": "0.49.0",
|
||||
"version": "0.49.6",
|
||||
"imports": {
|
||||
"#/*": "./*.js"
|
||||
}
|
||||
|
||||
BIN
public/img/rta.gif
Normal file
BIN
public/img/rta.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
@@ -70,6 +70,9 @@ async function onRenderHtml(pageContext) {
|
||||
|
||||
<meta name="description" content="Keep track of new porn releases and re-discover classics from your favorite porn stars and sites" />
|
||||
|
||||
<!-- RTA restricted to adults label -->
|
||||
<meta name="RATING" content="RTA-5042-1996-1400-1577-RTA" />
|
||||
|
||||
${config.analytics.enabled ? dangerouslySkipEscape(`<script src="${config.analytics.address}" data-website-id="${config.analytics.siteId}" data-exclude-hash="true" async></script>`) : ''}
|
||||
|
||||
<title>${title}</title>
|
||||
|
||||
@@ -55,7 +55,7 @@ const keyMap = {
|
||||
isCircumcised: 'circumcised',
|
||||
};
|
||||
|
||||
const socialsOrder = ['onlyfans', 'twitter', 'fansly', 'loyalfans', 'manyvids', 'pornhub', 'linktree', null];
|
||||
const socialsOrder = ['onlyfans', 'fansly', 'twitter', 'instagram', 'loyalfans', 'manyvids', 'pornhub', 'linktree', null];
|
||||
|
||||
export function curateActor(actor, context = {}) {
|
||||
return {
|
||||
@@ -80,6 +80,8 @@ export function curateActor(actor, context = {}) {
|
||||
ageThen: context.sceneDate && actor.date_of_birth && actor.date_of_birth.getFullYear() > 1
|
||||
? differenceInYears(context.sceneDate, actor.date_of_birth)
|
||||
: null,
|
||||
dateOfBirth: actor.date_of_birth,
|
||||
dateOfDeath: actor.date_of_death,
|
||||
bust: actor.bust,
|
||||
cup: actor.cup,
|
||||
waist: actor.waist,
|
||||
|
||||
@@ -17,6 +17,7 @@ import initLogger from './logger.js';
|
||||
import { curateRevision } from './revisions.js';
|
||||
import { getAffiliateSceneUrl } from './affiliates.js';
|
||||
import { censor } from './censor.js';
|
||||
import initSceneRevisions from '../common/scenes-revisions.mjs';
|
||||
|
||||
const logger = initLogger();
|
||||
const mj = new MerkleJson();
|
||||
@@ -729,8 +730,14 @@ export async function fetchSceneRevisions(revisionId, filters = {}, reqUser) {
|
||||
.limit(limit)
|
||||
.offset((page - 1) * limit);
|
||||
|
||||
const actorIds = Array.from(new Set(revisions.flatMap((revision) => [...revision.base.actors, ...(revision.deltas.find((delta) => delta.key === 'actors')?.value || [])])));
|
||||
const tagIds = Array.from(new Set(revisions.flatMap((revision) => [...revision.base.tags, ...(revision.deltas.find((delta) => delta.key === 'tags')?.value || [])])));
|
||||
const actorIds = Array.from(new Set(revisions.flatMap((revision) => [
|
||||
...revision.base.actors,
|
||||
...(revision.deltas.find((delta) => delta.key === 'actors')?.value || []),
|
||||
...revision.base.tags.map((tag) => tag.actorId),
|
||||
...revision.deltas.find((delta) => delta.key === 'tags')?.value.map((tag) => tag.actorId) || [],
|
||||
].filter(Boolean))));
|
||||
|
||||
const tagIds = Array.from(new Set(revisions.flatMap((revision) => [...revision.base.tags, ...(revision.deltas.find((delta) => delta.key === 'tags')?.value || [])].map((tag) => tag.id))));
|
||||
const movieIds = Array.from(new Set(revisions.flatMap((revision) => [...revision.base.movies, ...(revision.deltas.find((delta) => delta.key === 'movies')?.value || [])])));
|
||||
|
||||
const [actors, tags, movies] = await Promise.all([
|
||||
@@ -750,6 +757,20 @@ export async function fetchSceneRevisions(revisionId, filters = {}, reqUser) {
|
||||
};
|
||||
}
|
||||
|
||||
const { createSceneRevision, reviewSceneRevision } = initSceneRevisions({
|
||||
config,
|
||||
knex,
|
||||
mj,
|
||||
logger,
|
||||
fetchScenesById,
|
||||
});
|
||||
|
||||
export {
|
||||
createSceneRevision,
|
||||
reviewSceneRevision,
|
||||
};
|
||||
|
||||
/*
|
||||
const keyMap = {
|
||||
datePrecision: 'date_precision',
|
||||
productionDate: 'production_date',
|
||||
@@ -967,6 +988,13 @@ export async function createSceneRevision(sceneId, { edits, comment, apply }, re
|
||||
return [key, values.id];
|
||||
}
|
||||
|
||||
if (key === 'tags') {
|
||||
return [key, values.map((tag) => ({
|
||||
id: tag.id,
|
||||
actorId: tag.actorId,
|
||||
}))];
|
||||
}
|
||||
|
||||
if (Array.isArray(values)) {
|
||||
return [key, values.map((value) => value?.hash || value?.id || value)];
|
||||
}
|
||||
@@ -983,6 +1011,16 @@ export async function createSceneRevision(sceneId, { edits, comment, apply }, re
|
||||
return null;
|
||||
}
|
||||
|
||||
if (key === 'tags') {
|
||||
return {
|
||||
key,
|
||||
value: value.map((tag) => ({
|
||||
id: tag.id,
|
||||
actorId: tag.actorId,
|
||||
})),
|
||||
};
|
||||
}
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
const valueSet = new Set(value);
|
||||
const baseSet = new Set(baseScene[key]);
|
||||
@@ -1020,3 +1058,4 @@ export async function createSceneRevision(sceneId, { edits, comment, apply }, re
|
||||
reviewSceneRevision(revisionEntry.id, true, {}, reqUser).catch(() => {});
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
80
src/tools/scene_tag_revision_fix.js
Normal file
80
src/tools/scene_tag_revision_fix.js
Normal file
@@ -0,0 +1,80 @@
|
||||
import { MerkleJson } from 'merkle-json';
|
||||
|
||||
import knex from '../knex.js';
|
||||
|
||||
const mj = new MerkleJson();
|
||||
|
||||
function curateTag(tag) {
|
||||
if (Object.hasOwn(tag, 'actorId')) {
|
||||
return {
|
||||
id: tag.id,
|
||||
actorId: tag.actorId,
|
||||
};
|
||||
}
|
||||
|
||||
if (typeof tag === 'number') {
|
||||
return {
|
||||
id: tag,
|
||||
// can't restore actorId, don't set to null to hint at missing data
|
||||
};
|
||||
}
|
||||
|
||||
throw new Error(`Unrecognized tag delta: ${JSON.stringify(tag)}`);
|
||||
}
|
||||
|
||||
async function init() {
|
||||
const revisions = await knex('scenes_revisions');
|
||||
|
||||
// console.log(revisions);
|
||||
|
||||
const fixedRevisions = revisions.map((revision) => {
|
||||
if (revision.base.tags.length === 0 && !revision.deltas.some((delta) => delta.key === 'tags')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const newDeltas = revision.deltas.map((delta) => {
|
||||
if (delta.key !== 'tags') {
|
||||
return delta;
|
||||
}
|
||||
|
||||
return {
|
||||
...delta,
|
||||
value: delta.value.map((tag) => curateTag(tag)),
|
||||
};
|
||||
});
|
||||
|
||||
const newBase = {
|
||||
...revision.base,
|
||||
tags: revision.base.tags.map((tag) => curateTag(tag)),
|
||||
};
|
||||
|
||||
return {
|
||||
...revision,
|
||||
deltas: newDeltas,
|
||||
base: newBase,
|
||||
};
|
||||
}).filter(Boolean);
|
||||
|
||||
const entries = fixedRevisions.map((revision) => ({
|
||||
id: revision.id,
|
||||
base: JSON.stringify(revision.base),
|
||||
deltas: JSON.stringify(revision.deltas),
|
||||
hash: mj.hash({
|
||||
base: revision.base,
|
||||
deltas: revision.deltas,
|
||||
}),
|
||||
}));
|
||||
|
||||
console.log(entries);
|
||||
|
||||
await knex('scenes_revisions')
|
||||
.insert(entries)
|
||||
.onConflict('id')
|
||||
.merge(['base', 'deltas', 'hash']);
|
||||
|
||||
console.log(`Fixed ${entries.length} revisions`);
|
||||
|
||||
await knex.destroy();
|
||||
}
|
||||
|
||||
init();
|
||||
@@ -2,14 +2,14 @@ export default function consentHandler(req, res, next) {
|
||||
const redirect = req.headers.referer && new URL(req.headers.referer).searchParams.get('redirect');
|
||||
|
||||
if (Object.hasOwn(req.query, 'lgbt')) {
|
||||
const lgbtFilters = (req.tagFilter || []).filter((tag) => !['gay', 'bisexual', 'transsexual'].includes(tag));
|
||||
const lgbtFilters = Array.from(new Set([...(req.tagFilter || []).filter((tag) => !['gay', 'bisexual', 'transsexual'].includes(tag)), 'extreme-insertion']));
|
||||
|
||||
req.tagFilter = lgbtFilters; // eslint-disable-line no-param-reassign
|
||||
res.cookie('tags', JSON.stringify(lgbtFilters));
|
||||
}
|
||||
|
||||
if (Object.hasOwn(req.query, 'straight')) {
|
||||
const straightFilters = Array.from(new Set([...(req.tagFilter || []), 'gay', 'bisexual', 'transsexual']));
|
||||
const straightFilters = Array.from(new Set([...(req.tagFilter || []), 'gay', 'bisexual', 'transsexual', 'extreme-insertion']));
|
||||
|
||||
req.tagFilter = straightFilters; // eslint-disable-line no-param-reassign
|
||||
res.cookie('tags', JSON.stringify(straightFilters));
|
||||
|
||||
2
static
2
static
Submodule static updated: 258250e8c0...4c6f9888dc
Reference in New Issue
Block a user