forked from DebaucheryLibrarian/traxxx
Using batch insert for profiles to prevent errors on large inserts.
This commit is contained in:
@@ -622,7 +622,6 @@ export default {
|
||||
}
|
||||
|
||||
.photos-container {
|
||||
min-width: 15rem;
|
||||
box-sizing: border-box;
|
||||
border-left: solid 1px $shadow-hint;
|
||||
padding: 1rem 1rem 1rem 1.5rem;
|
||||
|
||||
@@ -1,46 +1,46 @@
|
||||
<template>
|
||||
<div class="networks">
|
||||
<form
|
||||
class="search"
|
||||
@submit.prevent="searchSites"
|
||||
>
|
||||
<input
|
||||
v-model="query"
|
||||
:placeholder="`Find ${siteCount} sites in ${networks.length} networks`"
|
||||
class="query"
|
||||
@input="searchSites"
|
||||
>
|
||||
<div class="networks">
|
||||
<form
|
||||
class="search"
|
||||
@submit.prevent="searchSites"
|
||||
>
|
||||
<input
|
||||
v-model="query"
|
||||
:placeholder="`Find ${siteCount} sites in ${networks.length} networks`"
|
||||
class="query"
|
||||
@input="searchSites"
|
||||
>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
class="search-button"
|
||||
><Icon icon="search" /></button>
|
||||
</form>
|
||||
<button
|
||||
type="submit"
|
||||
class="search-button"
|
||||
><Icon icon="search" /></button>
|
||||
</form>
|
||||
|
||||
<div
|
||||
v-if="query.length"
|
||||
class="network-tiles"
|
||||
>
|
||||
<Site
|
||||
v-for="site in searchResults"
|
||||
:key="`site-tile-${site.slug}`"
|
||||
:site="site"
|
||||
/>
|
||||
<div
|
||||
v-if="query.length"
|
||||
class="network-tiles"
|
||||
>
|
||||
<Site
|
||||
v-for="site in searchResults"
|
||||
:key="`site-tile-${site.slug}`"
|
||||
:site="site"
|
||||
/>
|
||||
|
||||
<span v-if="searchResults.length === 0">No results for "{{ query }}"</span>
|
||||
</div>
|
||||
<span v-if="searchResults.length === 0">No results for "{{ query }}"</span>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="query.length === 0"
|
||||
class="network-tiles"
|
||||
>
|
||||
<Network
|
||||
v-for="network in networks"
|
||||
:key="`network-tile-${network.slug}`"
|
||||
:network="network"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="query.length === 0"
|
||||
class="network-tiles"
|
||||
>
|
||||
<Network
|
||||
v-for="network in networks"
|
||||
:key="`network-tile-${network.slug}`"
|
||||
:network="network"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -48,41 +48,41 @@ import Network from '../tile/network.vue';
|
||||
import Site from '../tile/site.vue';
|
||||
|
||||
async function searchSites() {
|
||||
this.searchResults = await this.$store.dispatch('searchSites', {
|
||||
query: this.query,
|
||||
limit: 20,
|
||||
});
|
||||
this.searchResults = await this.$store.dispatch('searchSites', {
|
||||
query: this.query,
|
||||
limit: 20,
|
||||
});
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
this.networks = await this.$store.dispatch('fetchNetworks');
|
||||
this.pageTitle = 'Networks';
|
||||
this.networks = await this.$store.dispatch('fetchNetworks');
|
||||
this.pageTitle = 'Networks';
|
||||
}
|
||||
|
||||
function siteCount() {
|
||||
return this.networks.map(network => network.sites).flat().length;
|
||||
return this.networks.map(network => network.sites).flat().length;
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Network,
|
||||
Site,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
query: '',
|
||||
pageTitle: null,
|
||||
networks: [],
|
||||
searchResults: [],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
siteCount,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
searchSites,
|
||||
},
|
||||
components: {
|
||||
Network,
|
||||
Site,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
query: '',
|
||||
pageTitle: null,
|
||||
networks: [],
|
||||
searchResults: [],
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
siteCount,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
searchSites,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,227 +1,227 @@
|
||||
<template>
|
||||
<div
|
||||
v-if="release"
|
||||
class="content"
|
||||
>
|
||||
<Banner :release="release" />
|
||||
<div
|
||||
v-if="release"
|
||||
class="content"
|
||||
>
|
||||
<Banner :release="release" />
|
||||
|
||||
<div class="details">
|
||||
<div class="column">
|
||||
<a
|
||||
v-if="release.date"
|
||||
v-tooltip.bottom="release.url && `View scene on ${release.site.name}`"
|
||||
:title="release.url && `View scene on ${release.site.name}`"
|
||||
:href="release.url"
|
||||
:class="{ link: release.url }"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="tidbit date"
|
||||
>
|
||||
<Icon
|
||||
v-if="isAfter(new Date(), release.date)"
|
||||
icon="calendar2"
|
||||
/>
|
||||
<div class="details">
|
||||
<div class="column">
|
||||
<a
|
||||
v-if="release.date"
|
||||
v-tooltip.bottom="release.url && `View scene on ${release.site.name}`"
|
||||
:title="release.url && `View scene on ${release.site.name}`"
|
||||
:href="release.url"
|
||||
:class="{ link: release.url }"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="tidbit date"
|
||||
>
|
||||
<Icon
|
||||
v-if="isAfter(new Date(), release.date)"
|
||||
icon="calendar2"
|
||||
/>
|
||||
|
||||
<Icon
|
||||
v-else
|
||||
v-tooltip.bottom="'To be released'"
|
||||
icon="sun3"
|
||||
/>
|
||||
<Icon
|
||||
v-else
|
||||
v-tooltip.bottom="'To be released'"
|
||||
icon="sun3"
|
||||
/>
|
||||
|
||||
<span class="showable">{{ formatDate(release.date, 'MMM D, YYYY') }}</span>
|
||||
<span class="hideable">{{ formatDate(release.date, 'MMMM D, YYYY') }}</span>
|
||||
</a>
|
||||
<span class="showable">{{ formatDate(release.date, 'MMM D, YYYY') }}</span>
|
||||
<span class="hideable">{{ formatDate(release.date, 'MMMM D, YYYY') }}</span>
|
||||
</a>
|
||||
|
||||
<span
|
||||
v-if="release.shootId"
|
||||
v-tooltip.bottom="`Shoot #`"
|
||||
class="tidbit shoot hideable"
|
||||
>
|
||||
<Icon icon="clapboard-play" />
|
||||
{{ release.shootId }}
|
||||
</span>
|
||||
<span
|
||||
v-if="release.shootId"
|
||||
v-tooltip.bottom="`Shoot #`"
|
||||
class="tidbit shoot hideable"
|
||||
>
|
||||
<Icon icon="clapboard-play" />
|
||||
{{ release.shootId }}
|
||||
</span>
|
||||
|
||||
<span
|
||||
v-if="release.duration"
|
||||
v-tooltip.bottom="`Duration`"
|
||||
class="tidbit duration hideable"
|
||||
>
|
||||
<Icon icon="stopwatch" />
|
||||
<span
|
||||
v-if="release.duration"
|
||||
v-tooltip.bottom="`Duration`"
|
||||
class="tidbit duration hideable"
|
||||
>
|
||||
<Icon icon="stopwatch" />
|
||||
|
||||
<span
|
||||
v-if="release.duration >= 3600"
|
||||
class="duration-segment"
|
||||
>{{ Math.floor(release.duration / 3600).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ Math.floor((release.duration % 3600) / 60).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ (release.duration % 60).toString().padStart(2, '0') }}</span>
|
||||
</span>
|
||||
<span
|
||||
v-if="release.duration >= 3600"
|
||||
class="duration-segment"
|
||||
>{{ Math.floor(release.duration / 3600).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ Math.floor((release.duration % 3600) / 60).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ (release.duration % 60).toString().padStart(2, '0') }}</span>
|
||||
</span>
|
||||
|
||||
<span class="tidbit site">
|
||||
<a
|
||||
v-if="release.site.independent"
|
||||
:href="`/network/${release.network.slug}`"
|
||||
>
|
||||
<img
|
||||
:src="`/img/logos/${release.network.slug}/network.png`"
|
||||
:title="release.network.name"
|
||||
class="logo logo-site"
|
||||
>
|
||||
</a>
|
||||
<span class="tidbit site">
|
||||
<a
|
||||
v-if="release.site.independent"
|
||||
:href="`/network/${release.network.slug}`"
|
||||
>
|
||||
<img
|
||||
:src="`/img/logos/${release.network.slug}/thumbs/network.png`"
|
||||
:title="release.network.name"
|
||||
class="logo logo-site"
|
||||
>
|
||||
</a>
|
||||
|
||||
<template v-else>
|
||||
<a :href="`/network/${release.network.slug}`">
|
||||
<img
|
||||
:src="`/img/logos/${release.network.slug}/network.png`"
|
||||
:title="release.network.name"
|
||||
:alt="release.network.name"
|
||||
class="logo logo-network"
|
||||
>
|
||||
</a>
|
||||
<template v-else>
|
||||
<a :href="`/network/${release.network.slug}`">
|
||||
<img
|
||||
:src="`/img/logos/${release.network.slug}/thumbs/network.png`"
|
||||
:title="release.network.name"
|
||||
:alt="release.network.name"
|
||||
class="logo logo-network"
|
||||
>
|
||||
</a>
|
||||
|
||||
<span class="chain">presents</span>
|
||||
<span class="chain">presents</span>
|
||||
|
||||
<a
|
||||
:href="`/site/${release.site.slug}`"
|
||||
>
|
||||
<img
|
||||
:src="`/img/logos/${release.network.slug}/${release.site.slug}.png`"
|
||||
:title="release.site.name"
|
||||
class="logo logo-site"
|
||||
>
|
||||
</a>
|
||||
</template>
|
||||
<a
|
||||
:href="`/site/${release.site.slug}`"
|
||||
>
|
||||
<img
|
||||
:src="`/img/logos/${release.network.slug}/thumbs/${release.site.slug}.png`"
|
||||
:title="release.site.name"
|
||||
class="logo logo-site"
|
||||
>
|
||||
</a>
|
||||
</template>
|
||||
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info column">
|
||||
<h2 class="row title">{{ release.title }}</h2>
|
||||
<div class="info column">
|
||||
<h2 class="row title">{{ release.title }}</h2>
|
||||
|
||||
<div class="row associations">
|
||||
<ul class="actors nolist">
|
||||
<li
|
||||
v-for="actor in release.actors"
|
||||
:key="actor.id"
|
||||
>
|
||||
<Actor :actor="actor" />
|
||||
</li>
|
||||
</ul>
|
||||
<div class="row associations">
|
||||
<ul class="actors nolist">
|
||||
<li
|
||||
v-for="actor in release.actors"
|
||||
:key="actor.id"
|
||||
>
|
||||
<Actor :actor="actor" />
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div
|
||||
v-if="release.movies && release.movies.length > 0"
|
||||
class="movies"
|
||||
>
|
||||
<Release :release="release.movies[0]" />
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="release.movies && release.movies.length > 0"
|
||||
class="movies"
|
||||
>
|
||||
<Release :release="release.movies[0]" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.scenes && release.scenes.length > 0"
|
||||
class="scenes"
|
||||
>
|
||||
<h3>Scenes</h3>
|
||||
<Releases
|
||||
:releases="release.scenes"
|
||||
class="row"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
v-if="release.scenes && release.scenes.length > 0"
|
||||
class="scenes"
|
||||
>
|
||||
<h3>Scenes</h3>
|
||||
<Releases
|
||||
:releases="release.scenes"
|
||||
class="row"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.tags.length > 0"
|
||||
class="row"
|
||||
>
|
||||
<Icon icon="price-tags3" />
|
||||
<div
|
||||
v-if="release.tags.length > 0"
|
||||
class="row"
|
||||
>
|
||||
<Icon icon="price-tags3" />
|
||||
|
||||
<ul class="tags nolist">
|
||||
<li
|
||||
v-for="tag in release.tags"
|
||||
:key="`tag-${tag.slug}`"
|
||||
class="tag"
|
||||
>
|
||||
<a
|
||||
:href="`/tag/${tag.slug}`"
|
||||
class="link"
|
||||
>{{ tag.name }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<ul class="tags nolist">
|
||||
<li
|
||||
v-for="tag in release.tags"
|
||||
:key="`tag-${tag.slug}`"
|
||||
class="tag"
|
||||
>
|
||||
<a
|
||||
:href="`/tag/${tag.slug}`"
|
||||
class="link"
|
||||
>{{ tag.name }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.duration"
|
||||
class="row duration showable"
|
||||
>
|
||||
<Icon icon="stopwatch" />
|
||||
<div
|
||||
v-if="release.duration"
|
||||
class="row duration showable"
|
||||
>
|
||||
<Icon icon="stopwatch" />
|
||||
|
||||
<span
|
||||
v-if="release.duration >= 3600"
|
||||
class="duration-segment"
|
||||
>{{ Math.floor(release.duration / 3600).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ Math.floor((release.duration % 3600) / 60).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ (release.duration % 60).toString().padStart(2, '0') }}</span>
|
||||
</div>
|
||||
<span
|
||||
v-if="release.duration >= 3600"
|
||||
class="duration-segment"
|
||||
>{{ Math.floor(release.duration / 3600).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ Math.floor((release.duration % 3600) / 60).toString().padStart(2, '0') }}:</span>
|
||||
<span class="duration-segment">{{ (release.duration % 60).toString().padStart(2, '0') }}</span>
|
||||
</div>
|
||||
|
||||
<p
|
||||
v-if="release.description"
|
||||
class="row description"
|
||||
>
|
||||
<Icon icon="info2" />
|
||||
{{ release.description }}
|
||||
</p>
|
||||
<p
|
||||
v-if="release.description"
|
||||
class="row description"
|
||||
>
|
||||
<Icon icon="info2" />
|
||||
{{ release.description }}
|
||||
</p>
|
||||
|
||||
<div
|
||||
v-if="release.studio"
|
||||
class="row"
|
||||
>
|
||||
<Icon icon="video-camera2" />
|
||||
<div
|
||||
v-if="release.studio"
|
||||
class="row"
|
||||
>
|
||||
<Icon icon="video-camera2" />
|
||||
|
||||
<a
|
||||
v-if="release.studio"
|
||||
:href="release.studio.url"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="link"
|
||||
>{{ release.studio.name }}</a>
|
||||
</div>
|
||||
<a
|
||||
v-if="release.studio"
|
||||
:href="release.studio.url"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="link"
|
||||
>{{ release.studio.name }}</a>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="release.shootId"
|
||||
class="row showable"
|
||||
>
|
||||
<Icon icon="clapboard-play" />
|
||||
<div
|
||||
v-if="release.shootId"
|
||||
class="row showable"
|
||||
>
|
||||
<Icon icon="clapboard-play" />
|
||||
|
||||
<a
|
||||
:href="release.url"
|
||||
:title="`release.shootId`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="link shoot"
|
||||
>{{ release.shootId }}</a>
|
||||
</div>
|
||||
<a
|
||||
:href="release.url"
|
||||
:title="`release.shootId`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="link shoot"
|
||||
>{{ release.shootId }}</a>
|
||||
</div>
|
||||
|
||||
<span class="row">
|
||||
<Icon icon="drawer-in" />
|
||||
<span class="row">
|
||||
<Icon icon="drawer-in" />
|
||||
|
||||
<a
|
||||
:href="`/added/${formatDate(release.dateAdded, 'YYYY-MM-DD')}`"
|
||||
:title="`Added on ${formatDate(release.dateAdded, 'MMMM D, YYYY')}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="link added"
|
||||
>{{ formatDate(release.dateAdded, 'MMMM D, YYYY') }}</a>
|
||||
</span>
|
||||
<a
|
||||
:href="`/added/${formatDate(release.dateAdded, 'YYYY-MM-DD')}`"
|
||||
:title="`Added on ${formatDate(release.dateAdded, 'MMMM D, YYYY')}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="link added"
|
||||
>{{ formatDate(release.dateAdded, 'MMMM D, YYYY') }}</a>
|
||||
</span>
|
||||
|
||||
<div class="row">
|
||||
<Icon icon="paste2" />
|
||||
<div class="row">
|
||||
<Icon icon="paste2" />
|
||||
|
||||
<input
|
||||
class="filename"
|
||||
:value="filename"
|
||||
@focus="copyFilename"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input
|
||||
class="filename"
|
||||
:value="filename"
|
||||
@focus="copyFilename"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -234,45 +234,45 @@ import Release from '../tile/release.vue';
|
||||
import Releases from './releases.vue';
|
||||
|
||||
function pageTitle() {
|
||||
return this.release && this.release.title;
|
||||
return this.release && this.release.title;
|
||||
}
|
||||
|
||||
function copyFilename(event) {
|
||||
event.target.setSelectionRange(0, event.target.value.length);
|
||||
document.execCommand('copy');
|
||||
event.target.setSelectionRange(0, event.target.value.length);
|
||||
document.execCommand('copy');
|
||||
}
|
||||
|
||||
async function mounted() {
|
||||
this.release = await this.$store.dispatch('fetchReleaseById', this.$route.params.releaseId);
|
||||
this.filename = format(config.filename.pattern, {
|
||||
...this.release,
|
||||
shootId: this.release.shootId || '',
|
||||
date: this.formatDate(this.release.date, config.filename.date),
|
||||
}, {
|
||||
spreadSeparator: config.filename.separator,
|
||||
});
|
||||
this.release = await this.$store.dispatch('fetchReleaseById', this.$route.params.releaseId);
|
||||
this.filename = format(config.filename.pattern, {
|
||||
...this.release,
|
||||
shootId: this.release.shootId || '',
|
||||
date: this.formatDate(this.release.date, config.filename.date),
|
||||
}, {
|
||||
spreadSeparator: config.filename.separator,
|
||||
});
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Actor,
|
||||
Banner,
|
||||
Release,
|
||||
Releases,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
release: null,
|
||||
filename: null,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
pageTitle,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
copyFilename,
|
||||
},
|
||||
components: {
|
||||
Actor,
|
||||
Banner,
|
||||
Release,
|
||||
Releases,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
release: null,
|
||||
filename: null,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
pageTitle,
|
||||
},
|
||||
mounted,
|
||||
methods: {
|
||||
copyFilename,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -37,8 +37,6 @@ async function mounted() {
|
||||
'interracial',
|
||||
'mff',
|
||||
'mfm',
|
||||
'natural-boobs',
|
||||
'fake-boobs',
|
||||
'teen',
|
||||
'milf',
|
||||
'blowjob',
|
||||
@@ -48,6 +46,19 @@ async function mounted() {
|
||||
'facial',
|
||||
'creampie',
|
||||
],
|
||||
appearance: [
|
||||
'asian',
|
||||
'ebony',
|
||||
'latina',
|
||||
'caucasian',
|
||||
'natural-boobs',
|
||||
'fake-boobs',
|
||||
'blonde',
|
||||
'brunette',
|
||||
'redhead',
|
||||
'tattoos',
|
||||
'piercings',
|
||||
],
|
||||
oral: [
|
||||
'blowjob',
|
||||
'deepthroat',
|
||||
@@ -58,17 +69,6 @@ async function mounted() {
|
||||
'ass-eating',
|
||||
'ass-to-mouth',
|
||||
],
|
||||
appearance: [
|
||||
'asian',
|
||||
'ebony',
|
||||
'latina',
|
||||
'caucasian',
|
||||
'blonde',
|
||||
'brunette',
|
||||
'redhead',
|
||||
'tattoos',
|
||||
'piercings',
|
||||
],
|
||||
extreme: [
|
||||
'airtight',
|
||||
'double-anal',
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
v-else
|
||||
class="avatar"
|
||||
><img
|
||||
:src="`/img/avatar_${actor.gender || 'female'}.png`"
|
||||
:src="`/img/avatar_${actor.gender || 'female'}.svg`"
|
||||
class="avatar-fallback"
|
||||
></span>
|
||||
|
||||
@@ -209,9 +209,9 @@ export default {
|
||||
}
|
||||
|
||||
.avatar-fallback {
|
||||
max-height: 75%;
|
||||
max-width: 80%;
|
||||
opacity: .5;
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
opacity: .1;
|
||||
}
|
||||
|
||||
.details {
|
||||
|
||||
Reference in New Issue
Block a user