Compare commits
94 Commits
c29ecac41c
...
90aa29d2d4
Author | SHA1 | Date |
---|---|---|
DebaucheryLibrarian | 90aa29d2d4 | |
DebaucheryLibrarian | 0369446681 | |
DebaucheryLibrarian | 238dce78b5 | |
DebaucheryLibrarian | 124ff3f5e3 | |
DebaucheryLibrarian | 1cf06a8b49 | |
DebaucheryLibrarian | a8bdb7ab59 | |
DebaucheryLibrarian | 08fd69af39 | |
DebaucheryLibrarian | 560ff103ce | |
DebaucheryLibrarian | edc724b475 | |
DebaucheryLibrarian | ac904c849d | |
DebaucheryLibrarian | 5481b6e0a6 | |
DebaucheryLibrarian | eba96df631 | |
DebaucheryLibrarian | 7caa325c5f | |
DebaucheryLibrarian | e20641e101 | |
DebaucheryLibrarian | 8f81f71802 | |
DebaucheryLibrarian | e7a4ccecf3 | |
DebaucheryLibrarian | ec33a8b5a9 | |
DebaucheryLibrarian | 4a9aa62831 | |
DebaucheryLibrarian | 8b5eada088 | |
DebaucheryLibrarian | eeb947d311 | |
DebaucheryLibrarian | 430d7a8cdd | |
DebaucheryLibrarian | c94dcdd9e6 | |
DebaucheryLibrarian | 46c514f530 | |
DebaucheryLibrarian | b29a34c76a | |
DebaucheryLibrarian | 20ba833147 | |
DebaucheryLibrarian | 1ed47c3173 | |
DebaucheryLibrarian | ccac1f96dd | |
DebaucheryLibrarian | c860bfebc1 | |
DebaucheryLibrarian | d5806c3d31 | |
DebaucheryLibrarian | bf36825fce | |
DebaucheryLibrarian | a1780e2c4b | |
DebaucheryLibrarian | 02850eb6e3 | |
DebaucheryLibrarian | 71efd7a96f | |
DebaucheryLibrarian | 3508e47600 | |
DebaucheryLibrarian | eef0be09b3 | |
DebaucheryLibrarian | 2df20aea38 | |
DebaucheryLibrarian | 1032c3cb57 | |
DebaucheryLibrarian | 5f26f8de27 | |
DebaucheryLibrarian | 328550b9a3 | |
DebaucheryLibrarian | 28455ecd5d | |
DebaucheryLibrarian | 54dbea659a | |
DebaucheryLibrarian | 447c1d748a | |
DebaucheryLibrarian | 4a10887e48 | |
DebaucheryLibrarian | 48015a4c95 | |
DebaucheryLibrarian | abbfedf3f7 | |
DebaucheryLibrarian | fa9153deb8 | |
DebaucheryLibrarian | b287f5c2db | |
DebaucheryLibrarian | 2ebc2d441f | |
DebaucheryLibrarian | 5f2c9eb5df | |
DebaucheryLibrarian | ce41e24434 | |
DebaucheryLibrarian | c5d81e94e5 | |
DebaucheryLibrarian | 0500bdee2b | |
DebaucheryLibrarian | e9a1df9123 | |
DebaucheryLibrarian | 277a06c3de | |
DebaucheryLibrarian | c064efc812 | |
DebaucheryLibrarian | 1408074ef4 | |
DebaucheryLibrarian | 8c1f1b69ff | |
DebaucheryLibrarian | 5783507344 | |
DebaucheryLibrarian | ae64c5225f | |
DebaucheryLibrarian | d2f81d446b | |
DebaucheryLibrarian | ab5b165c68 | |
DebaucheryLibrarian | c3d4bf0e62 | |
DebaucheryLibrarian | 60f594a948 | |
DebaucheryLibrarian | 7f74d227f0 | |
DebaucheryLibrarian | f59429c30a | |
DebaucheryLibrarian | 40276a11f9 | |
DebaucheryLibrarian | 0e846bec3f | |
DebaucheryLibrarian | ba376fa074 | |
DebaucheryLibrarian | d1b54dc2c5 | |
DebaucheryLibrarian | b9c3efa24e | |
DebaucheryLibrarian | 40e613ed8d | |
DebaucheryLibrarian | d033def947 | |
DebaucheryLibrarian | 671e110d99 | |
DebaucheryLibrarian | b7a31b7933 | |
DebaucheryLibrarian | 1082effc17 | |
DebaucheryLibrarian | 693983dc29 | |
DebaucheryLibrarian | 6fe212796b | |
DebaucheryLibrarian | bb1aa4aa55 | |
DebaucheryLibrarian | 7d77e0603b | |
DebaucheryLibrarian | 9f727a0fa0 | |
DebaucheryLibrarian | 997914ec27 | |
DebaucheryLibrarian | 37f01b68e8 | |
DebaucheryLibrarian | ca695db3ba | |
DebaucheryLibrarian | 48acabac49 | |
DebaucheryLibrarian | d7ee278b02 | |
DebaucheryLibrarian | 191a3628b5 | |
DebaucheryLibrarian | 80750b44dc | |
DebaucheryLibrarian | 25f3dcf9a5 | |
DebaucheryLibrarian | c17e44e9f9 | |
DebaucheryLibrarian | 0b101dde3c | |
DebaucheryLibrarian | 4d20dae079 | |
DebaucheryLibrarian | 86e4fb7603 | |
DebaucheryLibrarian | e8d081cc67 | |
DebaucheryLibrarian | dab38c8013 |
|
@ -1,6 +1,7 @@
|
|||
<template>
|
||||
<router-link
|
||||
<RouterLink
|
||||
:to="`/actor/${actor.id}/${actor.slug}`"
|
||||
:target="target"
|
||||
class="actor nolink"
|
||||
>
|
||||
<div class="avatar">
|
||||
|
@ -18,7 +19,7 @@
|
|||
</div>
|
||||
|
||||
<span class="name">{{ actor.name }}</span>
|
||||
</router-link>
|
||||
</RouterLink>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
@ -36,6 +37,10 @@ export default {
|
|||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
target: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
unstashActor,
|
||||
|
|
|
@ -41,9 +41,9 @@
|
|||
/>
|
||||
</span>
|
||||
|
||||
<a
|
||||
<RouterLink
|
||||
:to="hasScrolled ? '' : { name: 'actor', params: { actorId: actor.id, actorSlug: actor.slug } }"
|
||||
class="avatar-container"
|
||||
@click="goToActor"
|
||||
>
|
||||
<img
|
||||
v-if="actor.avatar"
|
||||
|
@ -130,7 +130,7 @@
|
|||
class="country"
|
||||
/>
|
||||
</span>
|
||||
</a>
|
||||
</RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -138,13 +138,6 @@
|
|||
<script>
|
||||
import Gender from './gender.vue';
|
||||
|
||||
function goToActor() {
|
||||
// can't seem to control behavior with RouterLink
|
||||
if (!this.hasScrolled) {
|
||||
this.$router.push({ name: 'actor', params: { actorId: this.actor.id, actorSlug: this.actor.slug } });
|
||||
}
|
||||
}
|
||||
|
||||
async function stashActor() {
|
||||
this.favorited = true;
|
||||
|
||||
|
@ -215,7 +208,6 @@ export default {
|
|||
methods: {
|
||||
stashActor,
|
||||
unstashActor,
|
||||
goToActor,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -3,13 +3,28 @@
|
|||
title="Add alert"
|
||||
@close="$emit('close')"
|
||||
>
|
||||
<div
|
||||
v-if="error"
|
||||
class="dialog-error"
|
||||
>{{ error }}</div>
|
||||
|
||||
<form
|
||||
class="dialog-body"
|
||||
@submit.prevent="addAlert"
|
||||
>
|
||||
<div class="dialog-section">
|
||||
<h3 class="dialog-heading">
|
||||
When<span class="dialog-description">All to appear in the same scene</span>
|
||||
When
|
||||
|
||||
<label class="dialog-description noselect">
|
||||
<template v-if="all">Scene must match <strong>all</strong> fields</template>
|
||||
<template v-else>Scene must match <strong>any</strong> field</template>
|
||||
|
||||
<Toggle
|
||||
:checked="all"
|
||||
@change="(checked) => all = checked"
|
||||
/>
|
||||
</label>
|
||||
</h3>
|
||||
|
||||
<div class="alert-section">
|
||||
|
@ -29,7 +44,10 @@
|
|||
:key="`actor-${actor.id}`"
|
||||
class="actor"
|
||||
>
|
||||
<ActorPreview :actor="actor" />
|
||||
<ActorPreview
|
||||
:actor="actor"
|
||||
target="_blank"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
icon="cross3"
|
||||
|
@ -104,10 +122,15 @@
|
|||
|
||||
<div class="entities">
|
||||
<div
|
||||
v-if="entity"
|
||||
v-for="(entity, index) in entities"
|
||||
:key="`entity-${entity.id}`"
|
||||
:class="{ invalid: all && index > 0 }"
|
||||
class="entity"
|
||||
>
|
||||
<Entity :entity="entity" />
|
||||
<Entity
|
||||
:entity="entity"
|
||||
target="_blank"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
icon="cross3"
|
||||
|
@ -116,7 +139,7 @@
|
|||
/>
|
||||
</div>
|
||||
|
||||
<Tooltip v-if="!entity">
|
||||
<Tooltip v-if="entities.length < 1 || !all">
|
||||
<div class="entity placeholder">
|
||||
Any channel
|
||||
|
||||
|
@ -136,6 +159,72 @@
|
|||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert-section">
|
||||
<h4 class="alert-heading">Matching</h4>
|
||||
|
||||
<ul class="matches nolist">
|
||||
<li
|
||||
v-for="(match, index) in matches"
|
||||
:key="`match-${index}`"
|
||||
class="match"
|
||||
>
|
||||
<span class="match-property">{{ match.property }}: </span>
|
||||
|
||||
<span
|
||||
v-if="match.expression.slice(0, 1) === '/' && match.expression.slice(-1) === '/'"
|
||||
class="match-expression"
|
||||
><span class="match-slash">/</span>{{ match.expression.slice(1, -1) }}<span class="match-slash">/</span></span>
|
||||
|
||||
<span
|
||||
v-else
|
||||
class="match-expression"
|
||||
>{{ match.expression }}</span>
|
||||
|
||||
<Icon
|
||||
icon="cross3"
|
||||
class="remove"
|
||||
@click.native="removeMatch(index)"
|
||||
/>
|
||||
</li>
|
||||
|
||||
<Tooltip
|
||||
v-if="!entity"
|
||||
@open="$refs.expression?.focus()"
|
||||
>
|
||||
<li class="match placeholder">
|
||||
Anything
|
||||
|
||||
<Icon
|
||||
icon="plus3"
|
||||
class="add"
|
||||
/>
|
||||
</li>
|
||||
|
||||
<template #tooltip>
|
||||
<form
|
||||
class="pattern-tooltip"
|
||||
@submit.prevent="addMatch"
|
||||
>
|
||||
<select
|
||||
v-model="matchProperty"
|
||||
class="input"
|
||||
>
|
||||
<option value="title">Title</option>
|
||||
<option value="description">Description</option>
|
||||
</select>
|
||||
|
||||
<input
|
||||
ref="expression"
|
||||
v-model="matchExpression"
|
||||
class="input"
|
||||
placeholder="Expression, // for RegExp"
|
||||
>
|
||||
</form>
|
||||
</template>
|
||||
</Tooltip>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dialog-section">
|
||||
|
@ -194,7 +283,7 @@
|
|||
|
||||
<div class="dialog-actions right">
|
||||
<button
|
||||
:disabled="actors.length === 0 && tags.length === 0 && !entity"
|
||||
:disabled="actors.length === 0 && tags.length === 0 && !entity && matches.length === 0"
|
||||
type="submit"
|
||||
class="button button-primary"
|
||||
>Add alert</button>
|
||||
|
@ -207,19 +296,28 @@
|
|||
import ActorPreview from '../actors/preview.vue';
|
||||
import Entity from '../entities/tile.vue';
|
||||
import Checkbox from '../form/checkbox.vue';
|
||||
import Toggle from '../form/toggle.vue';
|
||||
import Search from './search.vue';
|
||||
|
||||
async function addAlert() {
|
||||
await this.$store.dispatch('addAlert', {
|
||||
actors: this.actors.map((actor) => actor.id),
|
||||
tags: this.tags.map((tag) => tag.id),
|
||||
entity: this.entity?.id,
|
||||
notify: this.notify,
|
||||
email: this.email,
|
||||
stashes: this.stashes.map((stash) => stash.id),
|
||||
});
|
||||
this.error = null;
|
||||
|
||||
this.$emit('close', true);
|
||||
try {
|
||||
await this.$store.dispatch('addAlert', {
|
||||
all: this.all,
|
||||
actors: this.actors.map((actor) => actor.id),
|
||||
tags: this.tags.map((tag) => tag.id),
|
||||
matches: this.matches,
|
||||
entities: this.entities.map((entity) => entity.id),
|
||||
notify: this.notify,
|
||||
email: this.email,
|
||||
stashes: this.stashes.map((stash) => stash.id),
|
||||
});
|
||||
|
||||
this.$emit('close', true);
|
||||
} catch (error) {
|
||||
this.error = error.message;
|
||||
}
|
||||
}
|
||||
|
||||
function addActor(actor) {
|
||||
|
@ -231,7 +329,7 @@ function addActor(actor) {
|
|||
}
|
||||
|
||||
function addEntity(entity) {
|
||||
this.entity = entity;
|
||||
this.entities = this.entities.concat(entity);
|
||||
this.events.emit('blur');
|
||||
}
|
||||
|
||||
|
@ -247,14 +345,34 @@ function removeActor(actor) {
|
|||
this.actors = this.actors.filter((listedActor) => listedActor.id !== actor.id);
|
||||
}
|
||||
|
||||
function removeEntity() {
|
||||
this.entity = null;
|
||||
function removeEntity(entity) {
|
||||
this.entities = this.entities.filter((alertEntity) => alertEntity.id !== entity.id);
|
||||
}
|
||||
|
||||
function removeTag(tag) {
|
||||
this.tags = this.tags.filter((listedTag) => listedTag.id !== tag.id);
|
||||
}
|
||||
|
||||
function addMatch() {
|
||||
if (!this.matchExpression) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.matches = this.matches.concat({
|
||||
property: this.matchProperty,
|
||||
expression: this.matchExpression,
|
||||
});
|
||||
|
||||
this.matchProperty = 'title';
|
||||
this.matchExpression = null;
|
||||
|
||||
this.events.emit('blur');
|
||||
}
|
||||
|
||||
function removeMatch(removeIndex) {
|
||||
this.matches = this.matches.filter((match, matchIndex) => matchIndex !== removeIndex);
|
||||
}
|
||||
|
||||
function addStash(stash) {
|
||||
if (!this.stashes.some((selectedStash) => selectedStash.id === stash.id)) {
|
||||
this.stashes = this.stashes.concat(stash);
|
||||
|
@ -273,13 +391,19 @@ export default {
|
|||
Checkbox,
|
||||
Entity,
|
||||
Search,
|
||||
Toggle,
|
||||
},
|
||||
emits: ['close'],
|
||||
data() {
|
||||
return {
|
||||
error: null,
|
||||
actors: [],
|
||||
tags: [],
|
||||
entity: null,
|
||||
all: true,
|
||||
entities: [],
|
||||
matches: [],
|
||||
matchProperty: 'title',
|
||||
matchExpression: null,
|
||||
notify: true,
|
||||
email: false,
|
||||
stashes: [],
|
||||
|
@ -290,10 +414,12 @@ export default {
|
|||
addActor,
|
||||
addAlert,
|
||||
addEntity,
|
||||
addMatch,
|
||||
addTag,
|
||||
addStash,
|
||||
removeActor,
|
||||
removeEntity,
|
||||
removeMatch,
|
||||
removeTag,
|
||||
removeStash,
|
||||
},
|
||||
|
@ -320,9 +446,24 @@ export default {
|
|||
}
|
||||
|
||||
.dialog-description {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: var(--shadow);
|
||||
font-size: .9rem;
|
||||
font-weight: normal;
|
||||
|
||||
.toggle-container {
|
||||
margin-left: .5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.dialog-error {
|
||||
padding: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
background: var(--error);
|
||||
color: var(--text-light);
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.alert-heading {
|
||||
|
@ -338,6 +479,34 @@ export default {
|
|||
font-size: 0;
|
||||
}
|
||||
|
||||
.match {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: .25rem 0;
|
||||
font-family: inherit;
|
||||
|
||||
.remove {
|
||||
position: relative;
|
||||
top: -.1rem;
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.match-property {
|
||||
text-transform: capitalize;
|
||||
color: var(--shadow);
|
||||
}
|
||||
|
||||
.match-expression {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.match-slash {
|
||||
padding: 0 .1rem;
|
||||
color: var(--primary);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.actors > .actor,
|
||||
.entity,
|
||||
.tag,
|
||||
|
@ -347,6 +516,11 @@ export default {
|
|||
margin: 0 .5rem .5rem 0;
|
||||
}
|
||||
|
||||
.entity.invalid {
|
||||
opacity: .5;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.entity .tile {
|
||||
width: 10rem;
|
||||
height: 2.5rem;
|
||||
|
@ -366,6 +540,14 @@ export default {
|
|||
color: var(--text);
|
||||
}
|
||||
|
||||
.pattern-tooltip {
|
||||
display: flex;
|
||||
gap: .5rem;
|
||||
position: relative;
|
||||
padding: .5rem;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.remove {
|
||||
width: 1rem;
|
||||
height: 1rem;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<template>
|
||||
<iframe
|
||||
v-if="campaign?.banner?.type === 'html'"
|
||||
ref="iframe"
|
||||
:width="campaign.banner.width"
|
||||
:height="campaign.banner.height"
|
||||
:src="getSource(campaign)"
|
||||
|
@ -8,6 +9,8 @@
|
|||
marginwidth="0"
|
||||
marginheight="0"
|
||||
class="campaign frame"
|
||||
data-umami-event="campaign-click"
|
||||
:data-umami-event-campaign-id="`${campaign.entity.slug}-${campaign.id}`"
|
||||
/>
|
||||
|
||||
<a
|
||||
|
@ -15,6 +18,8 @@
|
|||
:href="campaign.url || campaign.affiliate?.url"
|
||||
target="_blank"
|
||||
class="campaign"
|
||||
data-umami-event="campaign-click"
|
||||
:data-umami-event-campaign-id="`${campaign.entity.slug}-${campaign.id}`"
|
||||
>
|
||||
<img
|
||||
:src="getSource(campaign)"
|
||||
|
@ -41,7 +46,6 @@ function ratioFilter(banner) {
|
|||
|
||||
if (banner.type === 'html' && banner.width > window.innerWidth) {
|
||||
// usually non-scalable iframes
|
||||
console.log('TOO WIDE');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -217,4 +221,17 @@ export default {
|
|||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.frame-container {
|
||||
position: relative;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.frame-target {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -96,17 +96,29 @@ function scrollToTop() {
|
|||
this.$refs.content.scrollTop = 0;
|
||||
}
|
||||
|
||||
function trackIframeCampaign() {
|
||||
// no way to capture clicks from an iframe directly
|
||||
if (window.umami && document.activeElement.tagName === 'IFRAME' && document.activeElement.dataset.umamiEvent === 'campaign-click') {
|
||||
window.umami.track('campaign-click', {
|
||||
'campaign-id': document.activeElement.dataset.umamiEventCampaignId,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function mounted() {
|
||||
document.addEventListener('click', this.blur);
|
||||
window.addEventListener('resize', this.resize);
|
||||
|
||||
this.events.on('toggleSettings', this.toggleSettings);
|
||||
this.events.on('toggleSidebar', this.toggleSidebar);
|
||||
|
||||
window.addEventListener('blur', this.trackIframeCampaign);
|
||||
}
|
||||
|
||||
function beforeUnmount() {
|
||||
document.removeEventListener('click', this.blur);
|
||||
window.removeEventListener('resize', this.resize);
|
||||
window.removeEventListener('blur', this.trackIframeCampaign);
|
||||
}
|
||||
|
||||
export default {
|
||||
|
@ -129,10 +141,11 @@ export default {
|
|||
mounted,
|
||||
beforeUnmount,
|
||||
methods: {
|
||||
setConsent,
|
||||
toggleSidebar,
|
||||
toggleFilters,
|
||||
toggleSettings,
|
||||
setConsent,
|
||||
trackIframeCampaign,
|
||||
blur,
|
||||
resize,
|
||||
scroll,
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
<template>
|
||||
<router-link
|
||||
<RouterLink
|
||||
:to="`/${entity.type}/${entity.slug}`"
|
||||
:title="entity.name"
|
||||
:target="target"
|
||||
class="tile"
|
||||
>
|
||||
<div class="tile-logo">
|
||||
|
@ -47,7 +48,7 @@
|
|||
<span v-if="typeof entity.sceneTotal !== 'undefined'">{{ entity.sceneTotal }} scenes</span>
|
||||
<span v-if="entity.type === 'network'">{{ entity.childrenTotal }} channels</span>
|
||||
</span>
|
||||
</router-link>
|
||||
</RouterLink>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
@ -57,6 +58,10 @@ export default {
|
|||
type: Object,
|
||||
default: null,
|
||||
},
|
||||
target: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
emits: ['load'],
|
||||
};
|
||||
|
|
|
@ -99,7 +99,7 @@
|
|||
|
||||
<Icon
|
||||
v-if="notification.alert"
|
||||
v-tooltip="`You set an alert for <strong>${notification.alert.tags.map(tag => tag.name).join(', ') || 'all'}</strong> scenes with <strong>${notification.alert.actors.map(actor => actor.name).join(', ') || 'any actor'}</strong> for <strong>${notification.alert.entity?.name || 'any channel'}</strong>`"
|
||||
v-tooltip="`You set an alert for scenes with <strong>${notification.alert.all ? 'all of' : 'any of'}</strong> <strong>${notification.alert.actors.map(actor => actor.name).join(', ') || 'any actor'}</strong> containing <strong>${notification.alert.tags.map(tag => tag.name).join(', ') || 'any tags'}</strong> from <strong>${notification.alert.entities.map((entity) => entity.name).join(', ') || 'any channel'}</strong> matching <strong>${notification.alert.matches.map((match) => `${match.property}: ${match.expression}`).join(', ') || 'any text'}</strong>`"
|
||||
icon="question5"
|
||||
@click.prevent.stop
|
||||
/>
|
||||
|
@ -145,12 +145,12 @@ export default {
|
|||
default: 0,
|
||||
},
|
||||
},
|
||||
emits: ['addAlert'],
|
||||
data() {
|
||||
return {
|
||||
showAddAlert: false,
|
||||
};
|
||||
},
|
||||
emits: ['addAlert'],
|
||||
methods: {
|
||||
checkNotifications,
|
||||
checkNotification,
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<div class="media-container">
|
||||
<div
|
||||
class="media"
|
||||
:class="{ center: (release.photos?.length || 0) + (release.scenesPhotos?.length || 0) < 2, preview: !me }"
|
||||
:class="{ center: (release.photos?.length || 0) + (release.caps?.length || 0) + (release.scenesPhotos?.length || 0) < 2, preview: !me }"
|
||||
>
|
||||
<div
|
||||
v-if="release.trailer || release.teaser"
|
||||
|
@ -169,9 +169,10 @@ function photos() {
|
|||
const clips = this.release.clips || [];
|
||||
const clipPostersById = clips.reduce((acc, clip) => ({ ...acc, [clip.poster.id]: clip.poster }), {});
|
||||
const uniqueClipPosters = Array.from(new Set(clips.map((clip) => clip.poster.id) || [])).map((posterId) => clipPostersById[posterId]);
|
||||
const photosWithClipPosters = (this.release.photos || []).concat(this.release.scenesPhotos || []).concat(uniqueClipPosters);
|
||||
const photosWithClipPosters = (this.release.photos || []).concat(this.release.caps || []).concat(this.release.scenesPhotos || []).concat(uniqueClipPosters);
|
||||
|
||||
if (this.release.trailer || (this.release.teaser && this.release.teaser.mime !== 'image/gif')) {
|
||||
// if (this.release.trailer) {
|
||||
// poster will be on trailer video
|
||||
return photosWithClipPosters;
|
||||
}
|
||||
|
|
|
@ -21,21 +21,24 @@
|
|||
<Details :release="release" />
|
||||
|
||||
<button
|
||||
v-if="release.photos?.length > 0 || release.scenesPhotos?.length > 0"
|
||||
v-if="showAlbum"
|
||||
class="album-toggle"
|
||||
@click="$router.push({ hash: '#album' })"
|
||||
><Icon icon="grid3" />View album</button>
|
||||
|
||||
<Album
|
||||
v-if="showAlbum"
|
||||
:items="[release.poster, ...(release.photos || []), ...(release.scenesPhotos || [])]"
|
||||
v-if="showAlbum && $route.hash === '#album'"
|
||||
:items="[release.poster, ...(release.photos || []), ...(release.caps || []), ...(release.scenesPhotos || [])]"
|
||||
:title="release.title"
|
||||
:path="config.media.mediaPath"
|
||||
@close="$router.replace({ hash: undefined })"
|
||||
/>
|
||||
|
||||
<div class="info column">
|
||||
<div class="row row-title">
|
||||
<div
|
||||
class="row row-title"
|
||||
:class="{ 'has-alt': release.altTitles?.length > 0 }"
|
||||
>
|
||||
<h2
|
||||
v-if="release.title"
|
||||
class="title"
|
||||
|
@ -62,6 +65,19 @@
|
|||
/>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.altTitles?.length > 0"
|
||||
class="row alttitles"
|
||||
>
|
||||
<h2
|
||||
v-for="(altTitle, index) in release.altTitles"
|
||||
:key="`altitle-${index}`"
|
||||
class="alttitle"
|
||||
>
|
||||
{{ altTitle }}
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<Releases
|
||||
v-if="release.scenes && release.scenes.length > 0"
|
||||
:releases="release.scenes"
|
||||
|
@ -155,6 +171,14 @@
|
|||
<div class="duration">{{ formatDuration(release.duration) }}</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.photoCount"
|
||||
class="row-tidbit"
|
||||
>
|
||||
<span class="row-label">Photos</span>
|
||||
{{ release.photoCount }}
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.shootId"
|
||||
class="row-tidbit"
|
||||
|
@ -391,7 +415,7 @@ function pageTitle() {
|
|||
}
|
||||
|
||||
function showAlbum() {
|
||||
return (this.release.photos?.length > 0 || this.release.scenesPhotos?.length > 0) && this.$route.hash === '#album';
|
||||
return this.release.photos?.length > 0 || this.release.caps?.length > 0 || this.release.scenesPhotos?.length > 0;
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
|
@ -520,6 +544,11 @@ export default {
|
|||
color: var(--shadow);
|
||||
}
|
||||
|
||||
.alttitle {
|
||||
color: var(--shadow);
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.album-toggle {
|
||||
height: fit-content;
|
||||
display: inline-flex;
|
||||
|
|
|
@ -57,7 +57,12 @@
|
|||
<script setup>
|
||||
import config from 'config';
|
||||
|
||||
import { defineProps, defineEmits, computed } from 'vue';
|
||||
import {
|
||||
defineProps,
|
||||
defineEmits,
|
||||
computed,
|
||||
} from 'vue';
|
||||
|
||||
import { useStore } from 'vuex';
|
||||
import { useRouter } from 'vue-router';
|
||||
|
||||
|
|
|
@ -125,6 +125,7 @@ function mounted() {
|
|||
}
|
||||
|
||||
export default {
|
||||
emits: ['open', 'close'],
|
||||
data() {
|
||||
return {
|
||||
opened: false,
|
||||
|
@ -133,7 +134,6 @@ export default {
|
|||
arrowOffset: 0,
|
||||
};
|
||||
},
|
||||
emits: ['open', 'close'],
|
||||
mounted,
|
||||
methods: {
|
||||
calculate,
|
||||
|
|
|
@ -93,17 +93,43 @@
|
|||
</div>
|
||||
|
||||
<div
|
||||
v-if="alert.entity"
|
||||
v-if="alert.entities.length > 0"
|
||||
class="alert-section alert-trigger"
|
||||
>
|
||||
<h4 class="alert-heading">Channel</h4>
|
||||
<h4 class="alert-heading">{{ alert.entities.length > 1 ? 'Channels' : 'Channel' }}</h4>
|
||||
|
||||
<Entity
|
||||
v-if="alert.entity"
|
||||
:entity="alert.entity"
|
||||
v-for="entity in alert.entities"
|
||||
:key="`${alert.id}${entity.id}`"
|
||||
:entity="entity"
|
||||
class="entity"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="alert.matches.length > 0"
|
||||
class="alert-section alert-trigger"
|
||||
>
|
||||
<h4 class="alert-heading">Matches</h4>
|
||||
|
||||
<ul class="alert-matches nolist">
|
||||
<li
|
||||
v-for="match in alert.matches"
|
||||
:key="`match-${match.id}`"
|
||||
class="match"
|
||||
>
|
||||
<span
|
||||
v-if="match.expression.slice(0, 1) === '/' && match.expression.slice(-1) === '/'"
|
||||
class="match-expression"
|
||||
><span class="match-slash">/</span>{{ match.expression.slice(1, -1) }}<span class="match-slash">/</span></span>
|
||||
|
||||
<span
|
||||
v-else
|
||||
class="match-expression"
|
||||
>{{ match.expression }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -227,26 +253,34 @@ export default {
|
|||
}
|
||||
|
||||
.alert-actors,
|
||||
.alert-tags {
|
||||
.alert-tags,
|
||||
.alert-matches {
|
||||
display: flex;
|
||||
grid-gap: .5rem;
|
||||
}
|
||||
|
||||
.tag {
|
||||
.tag,
|
||||
.match {
|
||||
color: var(--shadow-strong);
|
||||
padding: .5rem;
|
||||
border: solid 1px var(--shadow-hint);
|
||||
font-size: .9rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
border: solid 1px var(--primary);
|
||||
}
|
||||
.tag:hover {
|
||||
cursor: pointer;
|
||||
border: solid 1px var(--primary);
|
||||
}
|
||||
|
||||
.entity {
|
||||
width: 10rem;
|
||||
height: 2.5rem;
|
||||
}
|
||||
|
||||
.match-slash {
|
||||
padding: 0 .1rem;
|
||||
color: var(--primary);
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -18,6 +18,10 @@
|
|||
<link rel="stylesheet" href="/css/style.css">
|
||||
|
||||
<script src="/js/bundle.js" defer></script>
|
||||
|
||||
<% if (analytics.enabled) { %>
|
||||
<script async src="<%- analytics.address %>" data-website-id="<%- analytics.siteId %>"></script>
|
||||
<% } %>
|
||||
</head>
|
||||
<body>
|
||||
<div id="container"></div>
|
||||
|
|
|
@ -80,6 +80,7 @@ function curateRelease(release, type = 'scene', context = {}) {
|
|||
curatedRelease.series = release.series?.filter(Boolean).map(({ serie }) => curateRelease(serie, 'serie', context)) || [];
|
||||
curatedRelease.chapters = release.chapters?.filter(Boolean).map((chapter) => curateRelease(chapter, 'chapter', context)) || [];
|
||||
curatedRelease.photos = release.photos?.filter(Boolean).map((photo) => photo.media || photo) || [];
|
||||
curatedRelease.caps = release.caps?.filter(Boolean).map((cap) => cap.media || cap) || [];
|
||||
curatedRelease.scenesPhotos = release.scenesPhotos?.filter(Boolean).map((photo) => photo.media || photo) || [];
|
||||
curatedRelease.covers = release.covers?.filter(Boolean).map(({ media }) => media) || [];
|
||||
|
||||
|
@ -190,6 +191,10 @@ function curateAlert(alert) {
|
|||
curatedAlert.entity = curateEntity(alert.entity.entity || alert.entity);
|
||||
}
|
||||
|
||||
if (alert.entities) {
|
||||
curatedAlert.entities = alert.entities.map((entity) => curateEntity(entity.entity || entity));
|
||||
}
|
||||
|
||||
if (alert.stashes) {
|
||||
curatedAlert.stashes = alert.stashes.map((stash) => curateStash(stash.stash || stash));
|
||||
}
|
||||
|
|
|
@ -89,21 +89,34 @@ function initEntitiesActions(store, router) {
|
|||
offset: $offset
|
||||
orderBy: $orderBy
|
||||
filter: {
|
||||
not: { tags: { overlaps: $exclude } }
|
||||
effectiveDate: { lessThan: $before, greaterThan: $after }
|
||||
showcased: { equalTo: true }
|
||||
or: [
|
||||
and: [
|
||||
{
|
||||
channelSlug: { equalTo: $entitySlug }
|
||||
channelType: { equalTo: $entityType }
|
||||
or: [
|
||||
{
|
||||
not: { tags: { overlaps: $exclude } }
|
||||
}
|
||||
{
|
||||
tags: { isNull: true }
|
||||
}
|
||||
]
|
||||
}
|
||||
{
|
||||
networkSlug: { equalTo: $entitySlug }
|
||||
networkType: { equalTo: $entityType }
|
||||
}
|
||||
{
|
||||
parentNetworkSlug: { equalTo: $entitySlug }
|
||||
parentNetworkType: { equalTo: $entityType }
|
||||
or: [
|
||||
{
|
||||
channelSlug: { equalTo: $entitySlug }
|
||||
channelType: { equalTo: $entityType }
|
||||
}
|
||||
{
|
||||
networkSlug: { equalTo: $entitySlug }
|
||||
networkType: { equalTo: $entityType }
|
||||
}
|
||||
{
|
||||
parentNetworkSlug: { equalTo: $entitySlug }
|
||||
parentNetworkType: { equalTo: $entityType }
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -97,6 +97,13 @@ const actorFields = `
|
|||
${actorStashesFields}
|
||||
`;
|
||||
|
||||
const basicActorFields = `
|
||||
id
|
||||
name
|
||||
slug
|
||||
gender
|
||||
`;
|
||||
|
||||
const movieFields = `
|
||||
id
|
||||
title
|
||||
|
@ -240,6 +247,14 @@ const releaseActorsFragment = `
|
|||
}
|
||||
`;
|
||||
|
||||
const releaseBasicActorsFragment = `
|
||||
actors: releasesActors(orderBy: ACTOR_BY_ACTOR_ID__GENDER_ASC) {
|
||||
actor {
|
||||
${basicActorFields}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
const releaseDirectorFragment = `
|
||||
directors: releasesDirectors(orderBy: ACTOR_BY_DIRECTOR_ID__NAME_ASC) {
|
||||
director {
|
||||
|
@ -339,6 +354,31 @@ const releasePhotosFragment = `
|
|||
}
|
||||
`;
|
||||
|
||||
const releaseCapsFragment = `
|
||||
caps: releasesCaps(orderBy: MEDIA_BY_MEDIA_ID__INDEX_ASC) {
|
||||
media {
|
||||
id
|
||||
index
|
||||
path
|
||||
thumbnail
|
||||
width
|
||||
height
|
||||
thumbnailWidth
|
||||
thumbnailHeight
|
||||
lazy
|
||||
isS3
|
||||
comment
|
||||
sfw: sfwMedia {
|
||||
id
|
||||
thumbnail
|
||||
lazy
|
||||
path
|
||||
comment
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
const releaseTrailerFragment = `
|
||||
trailer: releasesTrailer {
|
||||
media {
|
||||
|
@ -379,11 +419,11 @@ const releaseFields = `
|
|||
createdAt
|
||||
url
|
||||
createdBatchId
|
||||
${releaseActorsFragment}
|
||||
${releaseBasicActorsFragment}
|
||||
${releaseTagsFragment}
|
||||
${releasePosterFragment}
|
||||
${releaseCoversFragment}
|
||||
${releasePhotosFragment}
|
||||
${releaseCapsFragment}
|
||||
${siteFragment}
|
||||
studio {
|
||||
id
|
||||
|
@ -456,9 +496,17 @@ const releasesFragment = `
|
|||
offset: $offset
|
||||
orderBy: $orderBy
|
||||
filter: {
|
||||
not: { tags: { overlaps: $exclude } }
|
||||
or: [
|
||||
{
|
||||
not: { tags: { overlaps: $exclude } }
|
||||
}
|
||||
{
|
||||
tags: { isNull: true }
|
||||
}
|
||||
]
|
||||
effectiveDate: { lessThan: $before, greaterThan: $after }
|
||||
showcased: { equalTo: true }
|
||||
batchShowcased: { in: $batchShowcased }
|
||||
}
|
||||
) {
|
||||
releases: nodes {
|
||||
|
@ -497,6 +545,7 @@ const releaseFragment = `
|
|||
release(id: $releaseId) {
|
||||
id
|
||||
title
|
||||
altTitles
|
||||
description
|
||||
date
|
||||
datePrecision
|
||||
|
@ -504,6 +553,7 @@ const releaseFragment = `
|
|||
createdAt
|
||||
shootId
|
||||
qualities
|
||||
photoCount
|
||||
productionDate
|
||||
createdBatchId
|
||||
productionLocation
|
||||
|
@ -521,6 +571,7 @@ const releaseFragment = `
|
|||
${releaseTagsFragment}
|
||||
${releasePosterFragment}
|
||||
${releasePhotosFragment}
|
||||
${releaseCapsFragment}
|
||||
${releaseCoversFragment}
|
||||
${releaseTrailerFragment}
|
||||
${releaseTeaserFragment}
|
||||
|
@ -624,7 +675,11 @@ const releaseFragment = `
|
|||
`;
|
||||
|
||||
const batchFragment = `
|
||||
batches(first: 1, orderBy: CREATED_AT_DESC) {
|
||||
batches(
|
||||
first: 1,
|
||||
orderBy: CREATED_AT_DESC,
|
||||
filter: { showcased: { equalTo: true } }
|
||||
) {
|
||||
id
|
||||
}
|
||||
`;
|
||||
|
|
|
@ -24,7 +24,8 @@ function initReleasesActions(store, router) {
|
|||
$after:Datetime = "1900-01-01 00:00:00",
|
||||
$before:Datetime = "2100-01-01 00:00:00",
|
||||
$orderBy: [ReleasesSummariesOrderBy!],
|
||||
$exclude: [String!]
|
||||
$exclude: [String!],
|
||||
$batchShowcased: [Boolean!]
|
||||
) {
|
||||
${releasesFragment}
|
||||
${batchFragment}
|
||||
|
@ -38,6 +39,7 @@ function initReleasesActions(store, router) {
|
|||
before,
|
||||
orderBy,
|
||||
exclude: store.state.ui.tagFilter,
|
||||
batchShowcased: range === 'new' ? true : [true, false],
|
||||
});
|
||||
|
||||
return {
|
||||
|
|
|
@ -161,7 +161,14 @@ function initTagsActions(store, _router) {
|
|||
offset: $offset
|
||||
orderBy: $orderBy
|
||||
filter: {
|
||||
not: { tags: { overlaps: $exclude } }
|
||||
or: [
|
||||
{
|
||||
not: { tags: { overlaps: $exclude } }
|
||||
}
|
||||
{
|
||||
tags: { isNull: true }
|
||||
}
|
||||
]
|
||||
tags: { anyEqualTo: $tagSlug }
|
||||
effectiveDate: { lessThan: $before, greaterThan: $after }
|
||||
showcased: { equalTo: true }
|
||||
|
|
|
@ -68,6 +68,7 @@ function initUiActions(store, _router) {
|
|||
${releaseFields}
|
||||
}
|
||||
alert {
|
||||
all
|
||||
tags: alertsTags {
|
||||
tag {
|
||||
id
|
||||
|
@ -82,7 +83,7 @@ function initUiActions(store, _router) {
|
|||
slug
|
||||
}
|
||||
}
|
||||
entity: alertsEntity {
|
||||
entities: alertsEntities {
|
||||
entity {
|
||||
id
|
||||
name
|
||||
|
@ -90,6 +91,10 @@ function initUiActions(store, _router) {
|
|||
independent
|
||||
}
|
||||
}
|
||||
matches: alertsMatches {
|
||||
property
|
||||
expression
|
||||
}
|
||||
}
|
||||
}
|
||||
totalCount
|
||||
|
@ -259,7 +264,6 @@ function initUiActions(store, _router) {
|
|||
}
|
||||
|
||||
async function fetchCampaign(context, campaignId) {
|
||||
console.log(campaignId);
|
||||
const { campaign } = await graphql(`
|
||||
query Campaign(
|
||||
$campaignId: Int!
|
||||
|
|
|
@ -71,6 +71,7 @@ function initUsersActions(store, _router) {
|
|||
id
|
||||
notify
|
||||
email
|
||||
all
|
||||
stashes: alertsStashes {
|
||||
stash {
|
||||
id
|
||||
|
@ -85,12 +86,17 @@ function initUsersActions(store, _router) {
|
|||
slug
|
||||
}
|
||||
}
|
||||
matches: alertsMatches {
|
||||
id
|
||||
property
|
||||
expression
|
||||
}
|
||||
actors: alertsActors {
|
||||
actor {
|
||||
${actorFields}
|
||||
}
|
||||
}
|
||||
entity: alertsEntity {
|
||||
entities: alertsEntities {
|
||||
entity {
|
||||
id
|
||||
name
|
||||
|
|
|
@ -30,6 +30,20 @@ module.exports = {
|
|||
},
|
||||
},
|
||||
},
|
||||
redis: {
|
||||
host: 'localhost',
|
||||
port: 6379,
|
||||
username: null,
|
||||
password: null,
|
||||
},
|
||||
location: {
|
||||
userAgent: 'contact via https://traxxx.me/',
|
||||
},
|
||||
analytics: {
|
||||
enabled: false,
|
||||
address: 'http://localhost:3000/script.js',
|
||||
siteId: '1b28ac3b-d229-43bf-aec9-75cf0a72a466',
|
||||
},
|
||||
s3: {
|
||||
enabled: false,
|
||||
bucket: 'traxxx',
|
||||
|
@ -57,6 +71,7 @@ module.exports = {
|
|||
'amberathome',
|
||||
'marycarey',
|
||||
'racqueldevonshire',
|
||||
'aziani',
|
||||
// blowpass
|
||||
'sunlustxxx',
|
||||
// ddfnetwork
|
||||
|
@ -360,7 +375,7 @@ module.exports = {
|
|||
thumbnailQuality: 100,
|
||||
lazySize: 90,
|
||||
lazyQuality: 90,
|
||||
trailerQuality: [480, 540, 360, 720, 960, 1080, 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
|
||||
attempts: 2,
|
||||
fetchStreams: true,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// const config = require('config');
|
||||
const config = require('config');
|
||||
|
||||
module.exports = {
|
||||
apps: [
|
||||
|
@ -14,5 +14,15 @@ module.exports = {
|
|||
NODE_ENV: 'production',
|
||||
},
|
||||
},
|
||||
...(config.analytics.enabled ? [{
|
||||
name: 'umami',
|
||||
script: 'npm start',
|
||||
cwd: process.env.UMAMI_DIR || '../umami',
|
||||
restart_delay: 3000,
|
||||
merge_logs: true,
|
||||
env: {
|
||||
NODE_ENV: 'production',
|
||||
},
|
||||
}] : []),
|
||||
],
|
||||
};
|
||||
|
|
|
@ -15,9 +15,10 @@ exports.up = async (knex) => {
|
|||
AND (channels.showcased IS NOT false OR COALESCE(studios.showcased, false) = true)
|
||||
AND (networks.showcased IS NOT false OR COALESCE(channels.showcased, false) = true OR COALESCE(studios.showcased, false) = true)
|
||||
AS showcased,
|
||||
batches.showcased AS batch_showcased,
|
||||
releases.effective_date,
|
||||
releases.created_at,
|
||||
array_agg(tags.slug) FILTER (WHERE tags.slug IS NOT NULL) AS tags
|
||||
array_agg(tags.slug ORDER BY tags.priority DESC) FILTER (WHERE tags.slug IS NOT NULL) AS tags
|
||||
FROM releases
|
||||
LEFT JOIN releases_tags ON releases_tags.release_id = releases.id
|
||||
LEFT JOIN tags ON tags.id = releases_tags.tag_id
|
||||
|
@ -25,14 +26,15 @@ exports.up = async (knex) => {
|
|||
LEFT JOIN entities AS studios ON studios.id = releases.studio_id
|
||||
LEFT JOIN entities AS networks ON networks.id = channels.parent_id
|
||||
LEFT JOIN entities AS parent_networks ON parent_networks.id = networks.parent_id
|
||||
GROUP BY releases.id, studios.showcased,
|
||||
LEFT JOIN batches ON batches.id = releases.updated_batch_id
|
||||
GROUP BY releases.id, studios.showcased, batches.showcased,
|
||||
channels.showcased, channels.slug, channels.type,
|
||||
networks.showcased, networks.slug, networks.type,
|
||||
parent_networks.slug, parent_networks.type
|
||||
);
|
||||
|
||||
COMMENT ON MATERIALIZED VIEW releases_summaries IS E'@foreignKey (release_id) references releases (id)';
|
||||
GRANT ALL ON ALL TABLES IN SCHEMA public TO :visitor;
|
||||
GRANT ALL ON releases_summaries TO :visitor;
|
||||
`, {
|
||||
visitor: knex.raw(config.database.query.user),
|
||||
});
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
exports.up = async (knex) => {
|
||||
await knex.schema.alterTable('actors_social', (table) => {
|
||||
table.integer('profile_id')
|
||||
.references('id')
|
||||
.inTable('actors_profiles');
|
||||
|
||||
table.dropUnique(['url', 'actor_id']);
|
||||
table.unique(['url', 'actor_id', 'profile_id']);
|
||||
});
|
||||
|
||||
await knex.raw(`
|
||||
CREATE UNIQUE INDEX actors_social_url_actor_id_null_unique ON actors_social (url, actor_id) WHERE profile_id IS NULL;
|
||||
`);
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await knex.raw(`
|
||||
DROP INDEX actors_social_url_actor_id_null_unique;
|
||||
`);
|
||||
|
||||
await knex.schema.alterTable('actors_social', (table) => {
|
||||
table.dropUnique(['url', 'actor_id', 'profile_id']);
|
||||
table.unique(['url', 'actor_id']);
|
||||
|
||||
table.dropColumn('profile_id');
|
||||
});
|
||||
};
|
|
@ -0,0 +1,24 @@
|
|||
const config = require('config');
|
||||
|
||||
exports.up = async (knex) => {
|
||||
await knex.schema.createTable('releases_caps', (table) => {
|
||||
table.integer('release_id')
|
||||
.notNullable()
|
||||
.references('id')
|
||||
.inTable('releases')
|
||||
.onDelete('cascade');
|
||||
|
||||
table.text('media_id')
|
||||
.notNullable()
|
||||
.references('id')
|
||||
.inTable('media');
|
||||
});
|
||||
|
||||
await knex.raw('GRANT ALL ON releases_caps TO :visitor;', {
|
||||
visitor: knex.raw(config.database.query.user),
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await knex.schema.dropTable('releases_caps');
|
||||
};
|
|
@ -0,0 +1,27 @@
|
|||
exports.up = async (knex) => {
|
||||
await knex.schema.alterTable('actors_profiles', (table) => {
|
||||
table.string('hair_type');
|
||||
table.decimal('shoe_size');
|
||||
table.string('blood_type');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('actors', (table) => {
|
||||
table.string('hair_type');
|
||||
table.decimal('shoe_size');
|
||||
table.string('blood_type');
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await knex.schema.alterTable('actors_profiles', (table) => {
|
||||
table.dropColumn('hair_type');
|
||||
table.dropColumn('shoe_size');
|
||||
table.dropColumn('blood_type');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('actors', (table) => {
|
||||
table.dropColumn('hair_type');
|
||||
table.dropColumn('shoe_size');
|
||||
table.dropColumn('blood_type');
|
||||
});
|
||||
};
|
|
@ -0,0 +1,13 @@
|
|||
exports.up = async (knex) => {
|
||||
await knex.schema.alterTable('batches', (table) => {
|
||||
table.boolean('showcased')
|
||||
.notNullable()
|
||||
.defaultTo(true);
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await knex.schema.alterTable('batches', (table) => {
|
||||
table.dropColumn('showcased');
|
||||
});
|
||||
};
|
|
@ -0,0 +1,27 @@
|
|||
exports.up = async (knex) => {
|
||||
await knex.schema.alterTable('releases', (table) => {
|
||||
table.specificType('alt_titles', 'text ARRAY');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('movies', (table) => {
|
||||
table.specificType('alt_titles', 'text ARRAY');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('series', (table) => {
|
||||
table.specificType('alt_titles', 'text ARRAY');
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await knex.schema.alterTable('releases', (table) => {
|
||||
table.dropColumn('alt_titles');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('movies', (table) => {
|
||||
table.dropColumn('alt_titles');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('series', (table) => {
|
||||
table.dropColumn('alt_titles');
|
||||
});
|
||||
};
|
|
@ -0,0 +1,36 @@
|
|||
exports.up = async (knex) => {
|
||||
await knex.schema.createTable('movies_teasers', (table) => {
|
||||
table.integer('movie_id', 16)
|
||||
.notNullable()
|
||||
.references('id')
|
||||
.inTable('movies')
|
||||
.onDelete('cascade');
|
||||
|
||||
table.text('media_id', 21)
|
||||
.notNullable()
|
||||
.references('id')
|
||||
.inTable('media');
|
||||
|
||||
table.unique('movie_id');
|
||||
});
|
||||
|
||||
await knex.schema.createTable('series_teasers', (table) => {
|
||||
table.integer('serie_id', 16)
|
||||
.notNullable()
|
||||
.references('id')
|
||||
.inTable('series')
|
||||
.onDelete('cascade');
|
||||
|
||||
table.text('media_id', 21)
|
||||
.notNullable()
|
||||
.references('id')
|
||||
.inTable('media');
|
||||
|
||||
table.unique('serie_id');
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await knex.schema.dropTable('movies_teasers');
|
||||
await knex.schema.dropTable('series_teasers');
|
||||
};
|
|
@ -0,0 +1,19 @@
|
|||
exports.up = async (knex) => {
|
||||
await knex.schema.alterTable('releases', (table) => {
|
||||
table.integer('photo_count');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('movies', (table) => {
|
||||
table.integer('photo_count');
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await knex.schema.alterTable('releases', (table) => {
|
||||
table.dropColumn('photo_count');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('movies', (table) => {
|
||||
table.dropColumn('photo_count');
|
||||
});
|
||||
};
|
|
@ -0,0 +1,42 @@
|
|||
const config = require('config');
|
||||
|
||||
exports.up = async (knex) => {
|
||||
await knex.schema.alterTable('alerts', (table) => {
|
||||
table.boolean('all')
|
||||
.defaultTo(true);
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('alerts_entities', (table) => {
|
||||
table.dropUnique('alert_id');
|
||||
});
|
||||
|
||||
await knex.schema.createTable('alerts_matches', (table) => {
|
||||
table.increments('id');
|
||||
|
||||
table.integer('alert_id')
|
||||
.references('id')
|
||||
.inTable('alerts')
|
||||
.onDelete('cascade');
|
||||
|
||||
table.string('property');
|
||||
table.string('expression');
|
||||
});
|
||||
|
||||
await knex.raw(`
|
||||
GRANT SELECT ON alerts_matches TO :visitor;
|
||||
`, {
|
||||
visitor: knex.raw(config.database.query.user),
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = async (knex) => {
|
||||
await knex.schema.alterTable('alerts', (table) => {
|
||||
table.dropColumn('all');
|
||||
});
|
||||
|
||||
await knex.schema.alterTable('alerts_entities', (table) => {
|
||||
table.unique('alert_id');
|
||||
});
|
||||
|
||||
await knex.schema.dropTable('alerts_matches');
|
||||
};
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "traxxx",
|
||||
"version": "1.229.0",
|
||||
"version": "1.233.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "traxxx",
|
||||
"version": "1.229.0",
|
||||
"version": "1.233.0",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@casl/ability": "^5.2.2",
|
||||
|
@ -36,6 +36,7 @@
|
|||
"dayjs": "^1.8.21",
|
||||
"dompurify": "^2.0.11",
|
||||
"ejs": "^3.0.1",
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
"express": "^4.17.1",
|
||||
"express-promise-router": "^4.1.0",
|
||||
"express-react-views": "^0.11.0",
|
||||
|
@ -71,6 +72,7 @@
|
|||
"puppeteer": "^20.5.0",
|
||||
"puppeteer-extra": "^3.3.6",
|
||||
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
||||
"redis": "^4.6.7",
|
||||
"sharp": "^0.29.2",
|
||||
"showdown": "^1.9.1",
|
||||
"source-map-support": "^0.5.16",
|
||||
|
@ -80,7 +82,7 @@
|
|||
"tunnel": "0.0.6",
|
||||
"ua-parser-js": "^1.0.32",
|
||||
"undici": "^4.13.0",
|
||||
"unprint": "^0.10.1",
|
||||
"unprint": "^0.10.11",
|
||||
"url-pattern": "^1.0.3",
|
||||
"v-tooltip": "^2.0.3",
|
||||
"video.js": "^7.11.4",
|
||||
|
@ -3228,6 +3230,64 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/bloom": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz",
|
||||
"integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==",
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/client": {
|
||||
"version": "1.5.8",
|
||||
"resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz",
|
||||
"integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==",
|
||||
"dependencies": {
|
||||
"cluster-key-slot": "1.1.2",
|
||||
"generic-pool": "3.9.0",
|
||||
"yallist": "4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/client/node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
},
|
||||
"node_modules/@redis/graph": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
|
||||
"integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/json": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
|
||||
"integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/search": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz",
|
||||
"integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==",
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@redis/time-series": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
|
||||
"integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==",
|
||||
"peerDependencies": {
|
||||
"@redis/client": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@tensorflow/tfjs-core": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.0.tgz",
|
||||
|
@ -5146,6 +5206,14 @@
|
|||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/chalk/node_modules/escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/chardet": {
|
||||
"version": "0.7.0",
|
||||
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
|
||||
|
@ -5412,6 +5480,14 @@
|
|||
"request": "^2.88.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cluster-key-slot": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
|
||||
"integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cmake-js": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.1.0.tgz",
|
||||
|
@ -7010,11 +7086,14 @@
|
|||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
|
||||
},
|
||||
"node_modules/escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/escodegen": {
|
||||
|
@ -7624,17 +7703,6 @@
|
|||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||
},
|
||||
"node_modules/eslint/node_modules/escape-string-regexp": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/eslint/node_modules/eslint-scope": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz",
|
||||
|
@ -8384,6 +8452,14 @@
|
|||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/figures/node_modules/escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/file-entry-cache": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
|
||||
|
@ -9112,6 +9188,14 @@
|
|||
"node": ">= 4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/generic-pool": {
|
||||
"version": "3.9.0",
|
||||
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
|
||||
"integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==",
|
||||
"engines": {
|
||||
"node": ">= 4"
|
||||
}
|
||||
},
|
||||
"node_modules/gensync": {
|
||||
"version": "1.0.0-beta.2",
|
||||
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
||||
|
@ -11524,17 +11608,6 @@
|
|||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/matcher/node_modules/escape-string-regexp": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
|
@ -12504,6 +12577,15 @@
|
|||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/node-sass/node_modules/escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/node-sass/node_modules/gauge": {
|
||||
"version": "2.7.4",
|
||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
|
||||
|
@ -14804,6 +14886,19 @@
|
|||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/redis": {
|
||||
"version": "4.6.7",
|
||||
"resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz",
|
||||
"integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==",
|
||||
"dependencies": {
|
||||
"@redis/bloom": "1.2.0",
|
||||
"@redis/client": "1.5.8",
|
||||
"@redis/graph": "1.1.0",
|
||||
"@redis/json": "1.0.4",
|
||||
"@redis/search": "1.1.3",
|
||||
"@redis/time-series": "1.0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/regenerate": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
|
||||
|
@ -17538,9 +17633,9 @@
|
|||
}
|
||||
},
|
||||
"node_modules/unprint": {
|
||||
"version": "0.10.1",
|
||||
"resolved": "https://registry.npmjs.org/unprint/-/unprint-0.10.1.tgz",
|
||||
"integrity": "sha512-2KtzIQKlOzXyDDyrCQQQXWuljC6kHjAhYZT1NRiDT2Lr1GgnwR+R9iVqbq6iz1Z1Oflt7ngpYW1MGHy3xDnduw==",
|
||||
"version": "0.10.11",
|
||||
"resolved": "https://registry.npmjs.org/unprint/-/unprint-0.10.11.tgz",
|
||||
"integrity": "sha512-+OL+8BFF9SYvayp57l8ifq77I6ok2ilPCidBVka7VbMALJgqHxkHqrqkCupw2RKX2tNfPT/TGa+NJsYGboFnRQ==",
|
||||
"dependencies": {
|
||||
"axios": "^0.27.2",
|
||||
"bottleneck": "^2.19.5",
|
||||
|
@ -17646,17 +17741,6 @@
|
|||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/unprint/node_modules/escape-string-regexp": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/unprint/node_modules/eslint": {
|
||||
"version": "8.26.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz",
|
||||
|
@ -21448,6 +21532,53 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"@redis/bloom": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz",
|
||||
"integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==",
|
||||
"requires": {}
|
||||
},
|
||||
"@redis/client": {
|
||||
"version": "1.5.8",
|
||||
"resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz",
|
||||
"integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==",
|
||||
"requires": {
|
||||
"cluster-key-slot": "1.1.2",
|
||||
"generic-pool": "3.9.0",
|
||||
"yallist": "4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"@redis/graph": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz",
|
||||
"integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==",
|
||||
"requires": {}
|
||||
},
|
||||
"@redis/json": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz",
|
||||
"integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==",
|
||||
"requires": {}
|
||||
},
|
||||
"@redis/search": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz",
|
||||
"integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==",
|
||||
"requires": {}
|
||||
},
|
||||
"@redis/time-series": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz",
|
||||
"integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==",
|
||||
"requires": {}
|
||||
},
|
||||
"@tensorflow/tfjs-core": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.0.tgz",
|
||||
|
@ -23017,6 +23148,13 @@
|
|||
"ansi-styles": "^3.2.1",
|
||||
"escape-string-regexp": "^1.0.5",
|
||||
"supports-color": "^5.3.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"chardet": {
|
||||
|
@ -23213,6 +23351,11 @@
|
|||
"request-promise": "^4.2.4"
|
||||
}
|
||||
},
|
||||
"cluster-key-slot": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
|
||||
"integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="
|
||||
},
|
||||
"cmake-js": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.1.0.tgz",
|
||||
|
@ -24465,9 +24608,9 @@
|
|||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
|
||||
},
|
||||
"escodegen": {
|
||||
"version": "2.0.0",
|
||||
|
@ -24599,11 +24742,6 @@
|
|||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
|
||||
},
|
||||
"eslint-scope": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz",
|
||||
|
@ -25487,6 +25625,13 @@
|
|||
"integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
|
||||
"requires": {
|
||||
"escape-string-regexp": "^1.0.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"file-entry-cache": {
|
||||
|
@ -26051,6 +26196,11 @@
|
|||
"globule": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"generic-pool": {
|
||||
"version": "3.9.0",
|
||||
"resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz",
|
||||
"integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g=="
|
||||
},
|
||||
"gensync": {
|
||||
"version": "1.0.0-beta.2",
|
||||
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
||||
|
@ -27857,13 +28007,6 @@
|
|||
"integrity": "sha512-S6x5wmcDmsDRRU/c2dkccDwQPXoFczc5+HpQ2lON8pnvHlnvHAHj5WlLVvw6n6vNyHuVugYrFohYxbS+pvFpKQ==",
|
||||
"requires": {
|
||||
"escape-string-regexp": "^4.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"escape-string-regexp": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"media-typer": {
|
||||
|
@ -28618,6 +28761,12 @@
|
|||
"supports-color": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
|
||||
"dev": true
|
||||
},
|
||||
"gauge": {
|
||||
"version": "2.7.4",
|
||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
|
||||
|
@ -30274,6 +30423,19 @@
|
|||
"strip-indent": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"redis": {
|
||||
"version": "4.6.7",
|
||||
"resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz",
|
||||
"integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==",
|
||||
"requires": {
|
||||
"@redis/bloom": "1.2.0",
|
||||
"@redis/client": "1.5.8",
|
||||
"@redis/graph": "1.1.0",
|
||||
"@redis/json": "1.0.4",
|
||||
"@redis/search": "1.1.3",
|
||||
"@redis/time-series": "1.0.4"
|
||||
}
|
||||
},
|
||||
"regenerate": {
|
||||
"version": "1.4.2",
|
||||
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
|
||||
|
@ -32378,9 +32540,9 @@
|
|||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
||||
},
|
||||
"unprint": {
|
||||
"version": "0.10.1",
|
||||
"resolved": "https://registry.npmjs.org/unprint/-/unprint-0.10.1.tgz",
|
||||
"integrity": "sha512-2KtzIQKlOzXyDDyrCQQQXWuljC6kHjAhYZT1NRiDT2Lr1GgnwR+R9iVqbq6iz1Z1Oflt7ngpYW1MGHy3xDnduw==",
|
||||
"version": "0.10.11",
|
||||
"resolved": "https://registry.npmjs.org/unprint/-/unprint-0.10.11.tgz",
|
||||
"integrity": "sha512-+OL+8BFF9SYvayp57l8ifq77I6ok2ilPCidBVka7VbMALJgqHxkHqrqkCupw2RKX2tNfPT/TGa+NJsYGboFnRQ==",
|
||||
"requires": {
|
||||
"axios": "^0.27.2",
|
||||
"bottleneck": "^2.19.5",
|
||||
|
@ -32461,11 +32623,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
|
||||
},
|
||||
"eslint": {
|
||||
"version": "8.26.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "traxxx",
|
||||
"version": "1.229.0",
|
||||
"version": "1.233.0",
|
||||
"description": "All the latest porn releases in one place",
|
||||
"main": "src/app.js",
|
||||
"scripts": {
|
||||
|
@ -95,6 +95,7 @@
|
|||
"dayjs": "^1.8.21",
|
||||
"dompurify": "^2.0.11",
|
||||
"ejs": "^3.0.1",
|
||||
"escape-string-regexp": "^4.0.0",
|
||||
"express": "^4.17.1",
|
||||
"express-promise-router": "^4.1.0",
|
||||
"express-react-views": "^0.11.0",
|
||||
|
@ -130,6 +131,7 @@
|
|||
"puppeteer": "^20.5.0",
|
||||
"puppeteer-extra": "^3.3.6",
|
||||
"puppeteer-extra-plugin-stealth": "^2.11.2",
|
||||
"redis": "^4.6.7",
|
||||
"sharp": "^0.29.2",
|
||||
"showdown": "^1.9.1",
|
||||
"source-map-support": "^0.5.16",
|
||||
|
@ -139,7 +141,7 @@
|
|||
"tunnel": "0.0.6",
|
||||
"ua-parser-js": "^1.0.32",
|
||||
"undici": "^4.13.0",
|
||||
"unprint": "^0.10.1",
|
||||
"unprint": "^0.10.11",
|
||||
"url-pattern": "^1.0.3",
|
||||
"v-tooltip": "^2.0.3",
|
||||
"video.js": "^7.11.4",
|
||||
|
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 7.4 KiB |
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 8.8 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 138 KiB |
After Width: | Height: | Size: 87 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |