Compare commits
2 Commits
704a5ee8db
...
old
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4839a3b94c | ||
|
|
d8b641e461 |
1
.gitignore
vendored
@@ -3,7 +3,6 @@ dist/
|
|||||||
log/
|
log/
|
||||||
media/
|
media/
|
||||||
html/
|
html/
|
||||||
tmp/*
|
|
||||||
public/js/*
|
public/js/*
|
||||||
public/css/*
|
public/css/*
|
||||||
config/*
|
config/*
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
class="favicon"
|
class="favicon"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
:src="`/img/logos/${actor.entity.slug}/favicon_light.png`"
|
:src="`/img/logos/${actor.entity.slug}/favicon_dark.png`"
|
||||||
class="favicon-icon"
|
class="favicon-icon"
|
||||||
>
|
>
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
|
|||||||
@@ -50,9 +50,9 @@ function ratioFilter(banner) {
|
|||||||
|
|
||||||
function entityCampaign() {
|
function entityCampaign() {
|
||||||
const bannerCampaigns = this.entity.campaigns
|
const bannerCampaigns = this.entity.campaigns
|
||||||
.concat(this.entity.children?.flatMap((child) => child.campaigns))
|
.concat(this.entity.children?.flatMap(child => child.campaigns))
|
||||||
.concat(this.entity.parent?.campaigns)
|
.concat(this.entity.parent?.campaigns)
|
||||||
.filter((campaignX) => campaignX && this.ratioFilter(campaignX.banner));
|
.filter(campaignX => campaignX && this.ratioFilter(campaignX.banner));
|
||||||
|
|
||||||
if (bannerCampaigns.length > 0) {
|
if (bannerCampaigns.length > 0) {
|
||||||
const randomCampaign = bannerCampaigns[Math.floor(Math.random() * bannerCampaigns.length)];
|
const randomCampaign = bannerCampaigns[Math.floor(Math.random() * bannerCampaigns.length)];
|
||||||
@@ -66,7 +66,7 @@ function entityCampaign() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function tagCampaign() {
|
function tagCampaign() {
|
||||||
const campaignBanners = this.tag.banners.filter((banner) => banner.campaigns.length > 0 && this.ratioFilter(banner));
|
const campaignBanners = this.tag.banners.filter(banner => banner.campaigns.length > 0 && this.ratioFilter(banner));
|
||||||
const banner = campaignBanners[Math.floor(Math.random() * campaignBanners.length)];
|
const banner = campaignBanners[Math.floor(Math.random() * campaignBanners.length)];
|
||||||
|
|
||||||
if (banner?.campaigns.length > 0) {
|
if (banner?.campaigns.length > 0) {
|
||||||
@@ -83,25 +83,17 @@ function tagCampaign() {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function genericCampaign() {
|
function campaign() {
|
||||||
const randomCampaign = await this.$store.dispatch('fetchRandomCampaign', { minRatio: this.minRatio, maxRatio: this.maxRatio });
|
|
||||||
|
|
||||||
this.campaign = randomCampaign;
|
|
||||||
this.$emit('campaign', randomCampaign);
|
|
||||||
|
|
||||||
return randomCampaign;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function mounted() {
|
|
||||||
if (this.entity) {
|
if (this.entity) {
|
||||||
await this.entityCampaign();
|
return this.entityCampaign();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.tag) {
|
if (this.tag) {
|
||||||
await this.tagCampaign();
|
return this.tagCampaign();
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.genericCampaign();
|
this.$emit('campaign', null); // allow parent to toggle campaigns depending on availability
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -132,15 +124,11 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
emits: ['campaign'],
|
emits: ['campaign'],
|
||||||
data() {
|
computed: {
|
||||||
return {
|
campaign,
|
||||||
campaign: null,
|
|
||||||
};
|
|
||||||
},
|
},
|
||||||
mounted,
|
|
||||||
methods: {
|
methods: {
|
||||||
entityCampaign,
|
entityCampaign,
|
||||||
genericCampaign,
|
|
||||||
ratioFilter,
|
ratioFilter,
|
||||||
tagCampaign,
|
tagCampaign,
|
||||||
},
|
},
|
||||||
@@ -151,6 +139,7 @@ export default {
|
|||||||
.campaign {
|
.campaign {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
|
flex-grow: 1;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|||||||
51
assets/components/container/container.vue
Normal file → Executable file
@@ -8,35 +8,40 @@
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<transition name="slide">
|
<transition name="slide">
|
||||||
<Sidebar
|
<Sidebar v-if="showSidebar" />
|
||||||
v-if="showSidebar"
|
|
||||||
@toggle-sidebar="(state) => toggleSidebar(state)"
|
|
||||||
@show-filters="(state) => toggleFilters(state)"
|
|
||||||
/>
|
|
||||||
</transition>
|
</transition>
|
||||||
|
|
||||||
<Header
|
<Header />
|
||||||
@toggle-sidebar="(state) => toggleSidebar(state)"
|
|
||||||
@show-filters="(state) => toggleFilters(state)"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<p
|
<p
|
||||||
v-if="config.showDisclaimer"
|
v-if="config.showDisclaimer"
|
||||||
class="disclaimer"
|
class="disclaimer"
|
||||||
>{{ config.disclaimer }}</p>
|
v-html="config.disclaimer"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<p
|
||||||
|
v-if="config.showAnnouncement"
|
||||||
|
class="announcement"
|
||||||
|
v-html="config.announcement"
|
||||||
|
/>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
ref="content"
|
ref="content"
|
||||||
class="content"
|
class="content"
|
||||||
@scroll="scroll"
|
@scroll="scroll"
|
||||||
>
|
>
|
||||||
<router-view @scroll="scrollToTop" />
|
<RouterView @scroll="scrollToTop" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Filters
|
<Filters
|
||||||
v-if="showFilters"
|
v-if="showFilters"
|
||||||
@close="toggleFilters(false)"
|
@close="toggleFilters(false)"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<Settings
|
||||||
|
v-if="showSettings"
|
||||||
|
@close="toggleSettings(false)"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -45,6 +50,7 @@ import Warning from './warning.vue';
|
|||||||
import Header from '../header/header.vue';
|
import Header from '../header/header.vue';
|
||||||
import Sidebar from '../sidebar/sidebar.vue';
|
import Sidebar from '../sidebar/sidebar.vue';
|
||||||
import Filters from '../filters/filters.vue';
|
import Filters from '../filters/filters.vue';
|
||||||
|
import Settings from '../settings/settings.vue';
|
||||||
|
|
||||||
function toggleSidebar(state) {
|
function toggleSidebar(state) {
|
||||||
this.showSidebar = typeof state === 'boolean' ? state : !this.showSidebar;
|
this.showSidebar = typeof state === 'boolean' ? state : !this.showSidebar;
|
||||||
@@ -55,6 +61,11 @@ function toggleFilters(state) {
|
|||||||
this.showSidebar = false;
|
this.showSidebar = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toggleSettings(state) {
|
||||||
|
this.showSettings = state;
|
||||||
|
this.showSidebar = false;
|
||||||
|
}
|
||||||
|
|
||||||
async function setConsent(consent, includeQueer) {
|
async function setConsent(consent, includeQueer) {
|
||||||
if (consent) {
|
if (consent) {
|
||||||
this.showWarning = false;
|
this.showWarning = false;
|
||||||
@@ -88,6 +99,9 @@ function scrollToTop() {
|
|||||||
function mounted() {
|
function mounted() {
|
||||||
document.addEventListener('click', this.blur);
|
document.addEventListener('click', this.blur);
|
||||||
window.addEventListener('resize', this.resize);
|
window.addEventListener('resize', this.resize);
|
||||||
|
|
||||||
|
this.events.on('toggleSettings', this.toggleSettings);
|
||||||
|
this.events.on('toggleSidebar', this.toggleSidebar);
|
||||||
}
|
}
|
||||||
|
|
||||||
function beforeUnmount() {
|
function beforeUnmount() {
|
||||||
@@ -101,12 +115,14 @@ export default {
|
|||||||
Sidebar,
|
Sidebar,
|
||||||
Warning,
|
Warning,
|
||||||
Filters,
|
Filters,
|
||||||
|
Settings,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
showSidebar: false,
|
showSidebar: false,
|
||||||
showWarning: localStorage.getItem('consent') !== window.env.sessionId,
|
showWarning: localStorage.getItem('consent') !== window.env.sessionId,
|
||||||
showFilters: false,
|
showFilters: false,
|
||||||
|
showSettings: false,
|
||||||
selected: null,
|
selected: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@@ -115,6 +131,7 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
toggleSidebar,
|
toggleSidebar,
|
||||||
toggleFilters,
|
toggleFilters,
|
||||||
|
toggleSettings,
|
||||||
setConsent,
|
setConsent,
|
||||||
blur,
|
blur,
|
||||||
resize,
|
resize,
|
||||||
@@ -184,13 +201,21 @@ export default {
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.disclaimer {
|
.disclaimer,
|
||||||
|
.announcement {
|
||||||
padding: .5rem 1rem;
|
padding: .5rem 1rem;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: var(--text-light);
|
color: var(--text-light);
|
||||||
background: var(--warn);
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
box-shadow: inset 0 0 3px var(--darken-weak);
|
box-shadow: inset 0 0 3px var(--darken-weak);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.disclaimer {
|
||||||
|
background: var(--warn);
|
||||||
|
}
|
||||||
|
|
||||||
|
.announcement {
|
||||||
|
background: var(--notice);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -108,7 +108,6 @@
|
|||||||
:fetch-releases="fetchEntity"
|
:fetch-releases="fetchEntity"
|
||||||
:items-total="totalCount"
|
:items-total="totalCount"
|
||||||
:items-per-page="limit"
|
:items-per-page="limit"
|
||||||
:available-tags="entity.tags"
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div class="releases">
|
<div class="releases">
|
||||||
|
|||||||
@@ -102,8 +102,6 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.name {
|
.name {
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
color: var(--text-light);
|
color: var(--text-light);
|
||||||
font-size: 1.25rem;
|
font-size: 1.25rem;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="home">
|
<div class="home">
|
||||||
<div class="content-inner">
|
<div class="content-inner">
|
||||||
<div class="campaign-container">
|
|
||||||
<Campaign
|
|
||||||
:min-ratio="6"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<FilterBar
|
<FilterBar
|
||||||
ref="filter"
|
ref="filter"
|
||||||
:fetch-releases="fetchReleases"
|
:fetch-releases="fetchReleases"
|
||||||
@@ -38,7 +32,6 @@
|
|||||||
import FilterBar from '../filters/filter-bar.vue';
|
import FilterBar from '../filters/filter-bar.vue';
|
||||||
import Releases from '../releases/releases.vue';
|
import Releases from '../releases/releases.vue';
|
||||||
import Pagination from '../pagination/pagination.vue';
|
import Pagination from '../pagination/pagination.vue';
|
||||||
import Campaign from '../campaigns/campaign.vue';
|
|
||||||
|
|
||||||
async function fetchReleases(scroll = true) {
|
async function fetchReleases(scroll = true) {
|
||||||
this.done = false;
|
this.done = false;
|
||||||
@@ -66,7 +59,6 @@ async function mounted() {
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
Campaign,
|
|
||||||
FilterBar,
|
FilterBar,
|
||||||
Releases,
|
Releases,
|
||||||
Pagination,
|
Pagination,
|
||||||
@@ -99,12 +91,4 @@ export default {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.campaign-container {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: .75rem 1rem .25rem 1rem;
|
|
||||||
background: var(--background-dim);
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
beforeMount() {
|
beforeMount() {
|
||||||
this.svg = require(`../../img/icons/${this.icon}.svg`).default; // eslint-disable-line global-require, import/no-dynamic-require
|
this.svg = require(`../../img/icons/${this.icon}.svg`).default;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -11,31 +11,16 @@
|
|||||||
class="empty"
|
class="empty"
|
||||||
>No results for "{{ $route.query.query }}"</span>
|
>No results for "{{ $route.query.query }}"</span>
|
||||||
|
|
||||||
<template v-else>
|
<div
|
||||||
<h2 class="heading">Popular</h2>
|
v-else
|
||||||
|
class="entity-tiles"
|
||||||
<div
|
>
|
||||||
class="entity-tiles"
|
<Entity
|
||||||
>
|
v-for="entity in entities"
|
||||||
<Entity
|
:key="entity.parent ? `entity-tile-${entity.parent.slug}-${entity.slug}` : `entity-tile-${entity.slug}`"
|
||||||
v-for="entity in popularEntities"
|
:entity="entity"
|
||||||
:key="entity.parent ? `entity-tile-${entity.parent.slug}-${entity.slug}` : `entity-tile-${entity.slug}`"
|
/>
|
||||||
:entity="entity"
|
</div>
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h2 class="heading">All networks</h2>
|
|
||||||
|
|
||||||
<div
|
|
||||||
class="entity-tiles"
|
|
||||||
>
|
|
||||||
<Entity
|
|
||||||
v-for="entity in entities"
|
|
||||||
:key="entity.parent ? `entity-tile-${entity.parent.slug}-${entity.slug}` : `entity-tile-${entity.slug}`"
|
|
||||||
:entity="entity"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Footer />
|
<Footer />
|
||||||
@@ -73,45 +58,6 @@ async function searchEntities() {
|
|||||||
this.done = true;
|
this.done = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function popularEntities() {
|
|
||||||
const entitiesBySlug = Object.fromEntries(this.entities.map((entity) => [entity.slug, entity]));
|
|
||||||
|
|
||||||
return [
|
|
||||||
'21sextury',
|
|
||||||
'amateurallure',
|
|
||||||
'analvids',
|
|
||||||
'bamvisions',
|
|
||||||
'bang',
|
|
||||||
'bangbros',
|
|
||||||
'blowpass',
|
|
||||||
'brazzers',
|
|
||||||
'burningangel',
|
|
||||||
'digitalplayground',
|
|
||||||
'dogfartnetwork',
|
|
||||||
'dorcel',
|
|
||||||
'elegantangel',
|
|
||||||
'evilangel',
|
|
||||||
'fakehub',
|
|
||||||
'girlsway',
|
|
||||||
'hookuphotshot',
|
|
||||||
'hussiepass',
|
|
||||||
'insex',
|
|
||||||
'julesjordan',
|
|
||||||
'kellymadison',
|
|
||||||
'kink',
|
|
||||||
'mofos',
|
|
||||||
'naughtyamerica',
|
|
||||||
'newsensations',
|
|
||||||
'pervcity',
|
|
||||||
'pornpros',
|
|
||||||
'private',
|
|
||||||
'realitykings',
|
|
||||||
'twistys',
|
|
||||||
'vixen',
|
|
||||||
'xempire',
|
|
||||||
].map((slug) => entitiesBySlug[slug]).filter(Boolean);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function mounted() {
|
async function mounted() {
|
||||||
this.pageTitle = 'Channels';
|
this.pageTitle = 'Channels';
|
||||||
|
|
||||||
@@ -136,7 +82,6 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
channelCount,
|
channelCount,
|
||||||
popularEntities,
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
$route: fetchEntities,
|
$route: fetchEntities,
|
||||||
@@ -185,10 +130,6 @@ export default {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.heading {
|
|
||||||
margin: 1rem 0 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media(max-width: $breakpoint2) {
|
@media(max-width: $breakpoint2) {
|
||||||
.entity-tiles {
|
.entity-tiles {
|
||||||
grid-gap: .5rem;
|
grid-gap: .5rem;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div class="media-container">
|
<div class="media-container">
|
||||||
<div
|
<div
|
||||||
class="media"
|
class="media"
|
||||||
:class="{ center: (release.photos?.length || 0) + (release.scenesPhotos?.length || 0) < 2, preview: !me }"
|
:class="{ center: release.photos.length < 2, preview: !me }"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
v-if="release.trailer || release.teaser"
|
v-if="release.trailer || release.teaser"
|
||||||
@@ -71,28 +71,24 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template v-if="release.covers?.length > 0">
|
<template v-if="release.covers && release.covers.length > 0">
|
||||||
<div
|
<a
|
||||||
v-for="cover in release.covers"
|
v-for="cover in release.covers"
|
||||||
:key="`cover-${cover.id}`"
|
:key="`cover-${cover.id}`"
|
||||||
class="item-container"
|
:href="getPath(cover)"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<a
|
<img
|
||||||
:href="getPath(cover)"
|
:src="getPath(cover, 'thumbnail')"
|
||||||
target="_blank"
|
:style="{ 'background-image': getBgPath(cover, 'lazy') }"
|
||||||
rel="noopener noreferrer"
|
:width="cover.thumbnailWidth"
|
||||||
|
:height="cover.thumbnailHeight"
|
||||||
|
class="item cover"
|
||||||
|
loading="lazy"
|
||||||
|
@load="$emit('load', $event)"
|
||||||
>
|
>
|
||||||
<img
|
</a>
|
||||||
:src="getPath(cover, 'thumbnail')"
|
|
||||||
:style="{ 'background-image': getBgPath(cover, 'lazy') }"
|
|
||||||
:width="cover.thumbnailWidth"
|
|
||||||
:height="cover.thumbnailHeight"
|
|
||||||
class="item cover"
|
|
||||||
loading="lazy"
|
|
||||||
@load="$emit('load', $event)"
|
|
||||||
>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@@ -168,8 +164,8 @@ function poster() {
|
|||||||
function photos() {
|
function photos() {
|
||||||
const clips = this.release.clips || [];
|
const clips = this.release.clips || [];
|
||||||
const clipPostersById = clips.reduce((acc, clip) => ({ ...acc, [clip.poster.id]: clip.poster }), {});
|
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 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(uniqueClipPosters);
|
||||||
|
|
||||||
if (this.release.trailer || (this.release.teaser && this.release.teaser.mime !== 'image/gif')) {
|
if (this.release.trailer || (this.release.teaser && this.release.teaser.mime !== 'image/gif')) {
|
||||||
// poster will be on trailer video
|
// poster will be on trailer video
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
<div class="content-inner">
|
<div class="content-inner">
|
||||||
<SearchBar :placeholder="`Search ${totalCount} movies`" />
|
<SearchBar :placeholder="`Search ${totalCount} movies`" />
|
||||||
|
|
||||||
|
<TagFilter
|
||||||
|
class="filters-filter"
|
||||||
|
:filter="filter"
|
||||||
|
:available-tags="availableTags"
|
||||||
|
/>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
ref="tiles"
|
ref="tiles"
|
||||||
class="tiles"
|
class="tiles"
|
||||||
@@ -30,6 +36,7 @@
|
|||||||
import MovieTile from './movie-tile.vue';
|
import MovieTile from './movie-tile.vue';
|
||||||
import SearchBar from '../search/bar.vue';
|
import SearchBar from '../search/bar.vue';
|
||||||
import Pagination from '../pagination/pagination.vue';
|
import Pagination from '../pagination/pagination.vue';
|
||||||
|
import TagFilter from '../filters/tag-filter.vue';
|
||||||
|
|
||||||
async function fetchMovies() {
|
async function fetchMovies() {
|
||||||
if (this.$route.query.query) {
|
if (this.$route.query.query) {
|
||||||
@@ -73,6 +80,7 @@ export default {
|
|||||||
MovieTile,
|
MovieTile,
|
||||||
SearchBar,
|
SearchBar,
|
||||||
Pagination,
|
Pagination,
|
||||||
|
TagFilter,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -21,14 +21,14 @@
|
|||||||
<Details :release="release" />
|
<Details :release="release" />
|
||||||
|
|
||||||
<button
|
<button
|
||||||
v-if="release.photos?.length > 0 || release.scenesPhotos?.length > 0"
|
v-if="release.photos.length > 0"
|
||||||
class="album-toggle"
|
class="album-toggle"
|
||||||
@click="$router.push({ hash: '#album' })"
|
@click="$router.push({ hash: '#album' })"
|
||||||
><Icon icon="grid3" />View album</button>
|
><Icon icon="grid3" />View album</button>
|
||||||
|
|
||||||
<Album
|
<Album
|
||||||
v-if="showAlbum"
|
v-if="showAlbum"
|
||||||
:items="[release.poster, ...(release.photos || []), ...(release.scenesPhotos || [])]"
|
:items="[release.poster, ...release.photos]"
|
||||||
:title="release.title"
|
:title="release.title"
|
||||||
:path="config.media.mediaPath"
|
:path="config.media.mediaPath"
|
||||||
@close="$router.replace({ hash: undefined })"
|
@close="$router.replace({ hash: undefined })"
|
||||||
@@ -79,23 +79,22 @@
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="release.movies?.length > 0 || release.series?.length > 0"
|
v-if="release.movies && release.movies.length > 0"
|
||||||
class="row"
|
class="row"
|
||||||
>
|
>
|
||||||
<span class="row-label">Part of</span>
|
<span class="row-label">Part of</span>
|
||||||
|
|
||||||
<div class="movies">
|
<div class="movies">
|
||||||
<router-link
|
<router-link
|
||||||
v-for="movie in [...release.movies, ...release.series]"
|
v-for="movie in release.movies"
|
||||||
:key="`movie-${movie.id}`"
|
:key="`movie-${movie.id}`"
|
||||||
:to="{ name: movie.type || 'movie', params: { releaseId: movie.id, releaseSlug: movie.slug } }"
|
:to="{ name: 'movie', params: { releaseId: movie.id, releaseSlug: movie.slug } }"
|
||||||
class="movie"
|
class="movie"
|
||||||
>
|
>
|
||||||
<span class="movie-title">{{ movie.title }}</span>
|
<span class="movie-title">{{ movie.title }}</span>
|
||||||
|
|
||||||
<img
|
<img
|
||||||
v-if="movie.covers.length > 0 || movie.poster"
|
v-if="movie.covers.length > 0"
|
||||||
:src="getPath(movie.covers[0] || movie.poster, 'thumbnail')"
|
:src="getPath(movie.covers[0], 'thumbnail')"
|
||||||
class="movie-cover"
|
class="movie-cover"
|
||||||
>
|
>
|
||||||
</router-link>
|
</router-link>
|
||||||
@@ -203,19 +202,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
|
||||||
v-if="release.qualities"
|
|
||||||
class="row"
|
|
||||||
>
|
|
||||||
<span class="row-label">Available qualities</span>
|
|
||||||
|
|
||||||
<span
|
|
||||||
v-for="quality in release.qualities"
|
|
||||||
:key="quality"
|
|
||||||
class="quality"
|
|
||||||
>{{ quality }}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="release.comment"
|
v-if="release.comment"
|
||||||
class="row"
|
class="row"
|
||||||
@@ -257,10 +243,6 @@ async function fetchRelease(scroll = true) {
|
|||||||
this.release = await this.$store.dispatch('fetchMovieById', this.$route.params.releaseId);
|
this.release = await this.$store.dispatch('fetchMovieById', this.$route.params.releaseId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.$route.name === 'serie') {
|
|
||||||
this.release = await this.$store.dispatch('fetchSerieById', this.$route.params.releaseId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (scroll && this.$refs.content) {
|
if (scroll && this.$refs.content) {
|
||||||
this.$refs.content.scrollTop = 0;
|
this.$refs.content.scrollTop = 0;
|
||||||
}
|
}
|
||||||
@@ -300,7 +282,7 @@ function pageTitle() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function showAlbum() {
|
function showAlbum() {
|
||||||
return (this.release.photos?.length > 0 || this.release.scenesPhotos?.length > 0) && this.$route.hash === '#album';
|
return this.release.photos?.length > 0 && this.$route.hash === '#album';
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -483,16 +465,6 @@ export default {
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
.quality {
|
|
||||||
&::after {
|
|
||||||
content: 'p, ';
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child::after {
|
|
||||||
content: 'p',
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.releases {
|
.releases {
|
||||||
margin: 0 0 .5rem 0;
|
margin: 0 0 .5rem 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ const tagSlugsByCategory = {
|
|||||||
'titty-fucking',
|
'titty-fucking',
|
||||||
'fisting',
|
'fisting',
|
||||||
'anal-fisting',
|
'anal-fisting',
|
||||||
|
'fisting-dp',
|
||||||
],
|
],
|
||||||
group: [
|
group: [
|
||||||
'mfm',
|
'mfm',
|
||||||
@@ -107,31 +108,6 @@ const tagSlugsByCategory = {
|
|||||||
'bukkake',
|
'bukkake',
|
||||||
'fake-cum',
|
'fake-cum',
|
||||||
],
|
],
|
||||||
roleplay: [
|
|
||||||
'family',
|
|
||||||
'parody',
|
|
||||||
'schoolgirl',
|
|
||||||
'nurse',
|
|
||||||
'maid',
|
|
||||||
'nun',
|
|
||||||
],
|
|
||||||
extreme: [
|
|
||||||
'dp',
|
|
||||||
'airtight',
|
|
||||||
'dap',
|
|
||||||
'dvp',
|
|
||||||
'triple-penetration',
|
|
||||||
'tap',
|
|
||||||
'tvp',
|
|
||||||
],
|
|
||||||
fetish: [
|
|
||||||
'bdsm',
|
|
||||||
'femdom',
|
|
||||||
'bondage',
|
|
||||||
'free-use',
|
|
||||||
'latex',
|
|
||||||
'blindfold',
|
|
||||||
],
|
|
||||||
toys: [
|
toys: [
|
||||||
'toys',
|
'toys',
|
||||||
'toy-anal',
|
'toy-anal',
|
||||||
@@ -142,6 +118,32 @@ const tagSlugsByCategory = {
|
|||||||
'double-dildo-anal',
|
'double-dildo-anal',
|
||||||
'double-dildo-dp',
|
'double-dildo-dp',
|
||||||
],
|
],
|
||||||
|
roleplay: [
|
||||||
|
'family',
|
||||||
|
'parody',
|
||||||
|
'schoolgirl',
|
||||||
|
'nurse',
|
||||||
|
'maid',
|
||||||
|
'nun',
|
||||||
|
],
|
||||||
|
fetish: [
|
||||||
|
'bdsm',
|
||||||
|
'femdom',
|
||||||
|
'bondage',
|
||||||
|
'free-use',
|
||||||
|
'latex',
|
||||||
|
'blindfold',
|
||||||
|
],
|
||||||
|
extreme: [
|
||||||
|
'dp',
|
||||||
|
'airtight',
|
||||||
|
'dap',
|
||||||
|
'dvp',
|
||||||
|
'da-tp',
|
||||||
|
'dv-tp',
|
||||||
|
'tap',
|
||||||
|
'tvp',
|
||||||
|
],
|
||||||
misc: [
|
misc: [
|
||||||
'gaping',
|
'gaping',
|
||||||
'squirting',
|
'squirting',
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ export default {
|
|||||||
selectableTags: [
|
selectableTags: [
|
||||||
'airtight',
|
'airtight',
|
||||||
'anal',
|
'anal',
|
||||||
'bdsm',
|
|
||||||
'blowbang',
|
'blowbang',
|
||||||
'blowjob',
|
'blowjob',
|
||||||
'creampie',
|
'creampie',
|
||||||
|
|||||||
@@ -65,23 +65,19 @@ function curateActor(actor, release) {
|
|||||||
return curatedActor;
|
return curatedActor;
|
||||||
}
|
}
|
||||||
|
|
||||||
function curateRelease(release, type = 'scene') {
|
function curateRelease(release) {
|
||||||
const curatedRelease = {
|
const curatedRelease = {
|
||||||
...release,
|
...release,
|
||||||
type: release.type || type,
|
|
||||||
actors: [],
|
actors: [],
|
||||||
poster: release.poster && release.poster.media,
|
poster: release.poster && release.poster.media,
|
||||||
tags: release.tags ? release.tags.map((tag) => tag.tag || tag) : [],
|
tags: release.tags ? release.tags.map((tag) => tag.tag || tag) : [],
|
||||||
};
|
};
|
||||||
|
|
||||||
curatedRelease.scenes = release.scenes?.filter(Boolean).map(({ scene }) => curateRelease(scene, 'scene')) || [];
|
if (release.scenes) curatedRelease.scenes = release.scenes.filter(Boolean).map(({ scene }) => curateRelease(scene));
|
||||||
curatedRelease.movies = release.movies?.filter(Boolean).map(({ movie }) => curateRelease(movie, 'movie')) || [];
|
if (release.movies) curatedRelease.movies = release.movies.filter(Boolean).map(({ movie }) => curateRelease(movie));
|
||||||
curatedRelease.series = release.series?.filter(Boolean).map(({ serie }) => curateRelease(serie, 'serie')) || [];
|
if (release.chapters) curatedRelease.chapters = release.chapters.filter(Boolean).map((chapter) => curateRelease(chapter));
|
||||||
curatedRelease.chapters = release.chapters?.filter(Boolean).map((chapter) => curateRelease(chapter)) || [];
|
if (release.photos) curatedRelease.photos = release.photos.filter(Boolean).map((photo) => photo.media || photo);
|
||||||
curatedRelease.photos = release.photos?.filter(Boolean).map((photo) => photo.media || photo) || [];
|
if (release.covers) curatedRelease.covers = release.covers.filter(Boolean).map(({ media }) => media);
|
||||||
curatedRelease.scenesPhotos = release.scenesPhotos?.filter(Boolean).map((photo) => photo.media || photo) || [];
|
|
||||||
curatedRelease.covers = release.covers?.filter(Boolean).map(({ media }) => media) || [];
|
|
||||||
|
|
||||||
if (release.trailer) curatedRelease.trailer = release.trailer.media;
|
if (release.trailer) curatedRelease.trailer = release.trailer.media;
|
||||||
if (release.teaser) curatedRelease.teaser = release.teaser.media;
|
if (release.teaser) curatedRelease.teaser = release.teaser.media;
|
||||||
if (release.actors) curatedRelease.actors = release.actors.filter(Boolean).map((actor) => curateActor(actor.actor || actor, curatedRelease));
|
if (release.actors) curatedRelease.actors = release.actors.filter(Boolean).map((actor) => curateActor(actor.actor || actor, curatedRelease));
|
||||||
@@ -109,7 +105,6 @@ function curateEntity(entity, parent, releases) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (entity.tags) curatedEntity.tags = entity.tags.map(({ tag }) => tag);
|
if (entity.tags) curatedEntity.tags = entity.tags.map(({ tag }) => tag);
|
||||||
if (entity.sceneTags) curatedEntity.sceneTags = entity.sceneTags;
|
|
||||||
|
|
||||||
if (entity.children) {
|
if (entity.children) {
|
||||||
if (entity.children.nodes) {
|
if (entity.children.nodes) {
|
||||||
|
|||||||
@@ -41,11 +41,6 @@ function initEntitiesActions(store, router) {
|
|||||||
slug
|
slug
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sceneTags {
|
|
||||||
id
|
|
||||||
name
|
|
||||||
slug
|
|
||||||
}
|
|
||||||
children: childEntitiesConnection(
|
children: childEntitiesConnection(
|
||||||
orderBy: [PRIORITY_DESC, NAME_ASC],
|
orderBy: [PRIORITY_DESC, NAME_ASC],
|
||||||
filter: {
|
filter: {
|
||||||
@@ -101,7 +96,7 @@ function initEntitiesActions(store, router) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
effectiveDate: {
|
date: {
|
||||||
lessThan: $before,
|
lessThan: $before,
|
||||||
greaterThan: $after
|
greaterThan: $after
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -367,7 +367,6 @@ const releaseFields = `
|
|||||||
date
|
date
|
||||||
datePrecision
|
datePrecision
|
||||||
slug
|
slug
|
||||||
qualities
|
|
||||||
shootId
|
shootId
|
||||||
productionDate
|
productionDate
|
||||||
comment
|
comment
|
||||||
@@ -443,29 +442,6 @@ const releasesFragment = `
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const mediaFields = `
|
|
||||||
id
|
|
||||||
index
|
|
||||||
path
|
|
||||||
thumbnail
|
|
||||||
lazy
|
|
||||||
isS3
|
|
||||||
comment
|
|
||||||
sfw: sfwMedia {
|
|
||||||
id
|
|
||||||
thumbnail
|
|
||||||
lazy
|
|
||||||
path
|
|
||||||
comment
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
const mediaFragment = `
|
|
||||||
media {
|
|
||||||
${mediaFields}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
const releaseFragment = `
|
const releaseFragment = `
|
||||||
release(id: $releaseId) {
|
release(id: $releaseId) {
|
||||||
id
|
id
|
||||||
@@ -476,7 +452,6 @@ const releaseFragment = `
|
|||||||
duration
|
duration
|
||||||
createdAt
|
createdAt
|
||||||
shootId
|
shootId
|
||||||
qualities
|
|
||||||
productionDate
|
productionDate
|
||||||
createdBatchId
|
createdBatchId
|
||||||
productionLocation
|
productionLocation
|
||||||
@@ -561,19 +536,6 @@ const releaseFragment = `
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
series: seriesScenesBySceneId {
|
|
||||||
serie {
|
|
||||||
id
|
|
||||||
title
|
|
||||||
slug
|
|
||||||
covers: seriesCoversBySerieId(orderBy: MEDIA_BY_MEDIA_ID__INDEX_ASC) {
|
|
||||||
${mediaFragment}
|
|
||||||
}
|
|
||||||
poster: seriesPosterBySerieId {
|
|
||||||
${mediaFragment}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isFavorited
|
isFavorited
|
||||||
isStashed(includeFavorites: false)
|
isStashed(includeFavorites: false)
|
||||||
stashes: stashesScenesBySceneId(
|
stashes: stashesScenesBySceneId(
|
||||||
@@ -662,8 +624,6 @@ export {
|
|||||||
actorFields,
|
actorFields,
|
||||||
actorStashesFields,
|
actorStashesFields,
|
||||||
campaignsFragment,
|
campaignsFragment,
|
||||||
mediaFields,
|
|
||||||
mediaFragment,
|
|
||||||
movieFields,
|
movieFields,
|
||||||
releaseActorsFragment,
|
releaseActorsFragment,
|
||||||
releaseFields,
|
releaseFields,
|
||||||
|
|||||||
@@ -7,22 +7,22 @@ const dateRanges = {
|
|||||||
latest: () => ({
|
latest: () => ({
|
||||||
after: '1900-01-01',
|
after: '1900-01-01',
|
||||||
before: dayjs.utc().toDate(),
|
before: dayjs.utc().toDate(),
|
||||||
orderBy: ['EFFECTIVE_DATE_DESC'],
|
orderBy: ['DATE_DESC'],
|
||||||
}),
|
}),
|
||||||
upcoming: () => ({
|
upcoming: () => ({
|
||||||
after: dayjs.utc().toDate(),
|
after: dayjs.utc().toDate(),
|
||||||
before: '2100-01-01',
|
before: '2100-01-01',
|
||||||
orderBy: ['EFFECTIVE_DATE_DESC'],
|
orderBy: ['DATE_DESC'],
|
||||||
}),
|
}),
|
||||||
new: () => ({
|
new: () => ({
|
||||||
after: '1900-01-01 00:00:00',
|
after: '1900-01-01 00:00:00',
|
||||||
before: '2100-01-01',
|
before: '2100-01-01',
|
||||||
orderBy: ['CREATED_AT_DESC', 'EFFECTIVE_DATE_ASC'],
|
orderBy: ['CREATED_AT_DESC', 'DATE_ASC'],
|
||||||
}),
|
}),
|
||||||
all: () => ({
|
all: () => ({
|
||||||
after: '1900-01-01',
|
after: '1900-01-01',
|
||||||
before: '2100-01-01',
|
before: '2100-01-01',
|
||||||
orderBy: ['EFFECTIVE_DATE_DESC'],
|
orderBy: ['DATE_DESC'],
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import {
|
|||||||
releaseFragment,
|
releaseFragment,
|
||||||
releaseFields,
|
releaseFields,
|
||||||
movieFields,
|
movieFields,
|
||||||
mediaFragment,
|
|
||||||
mediaFields,
|
|
||||||
} from '../fragments';
|
} from '../fragments';
|
||||||
import { curateRelease } from '../curate';
|
import { curateRelease } from '../curate';
|
||||||
import getDateRange from '../get-date-range';
|
import getDateRange from '../get-date-range';
|
||||||
@@ -143,16 +141,16 @@ function initReleasesActions(store, router) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchCollectionById({ _commit }, movieId, type = 'movie') {
|
async function fetchMovieById({ _commit }, movieId) {
|
||||||
// const release = await get(`/releases/${releaseId}`);
|
// const release = await get(`/releases/${releaseId}`);
|
||||||
|
|
||||||
const result = await graphql(`
|
const { movie } = await graphql(`
|
||||||
query Movie(
|
query Movie(
|
||||||
$movieId: Int!
|
$movieId: Int!
|
||||||
$hasAuth: Boolean!
|
$hasAuth: Boolean!
|
||||||
$userId: Int
|
$userId: Int
|
||||||
) {
|
) {
|
||||||
${type}(id: $movieId) {
|
movie(id: $movieId) {
|
||||||
id
|
id
|
||||||
title
|
title
|
||||||
description
|
description
|
||||||
@@ -184,7 +182,7 @@ function initReleasesActions(store, router) {
|
|||||||
isS3
|
isS3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
poster: ${type === 'series' ? 'seriesPosterBySerieId' : 'moviesPoster'} {
|
poster: moviesPoster {
|
||||||
media {
|
media {
|
||||||
id
|
id
|
||||||
path
|
path
|
||||||
@@ -197,7 +195,7 @@ function initReleasesActions(store, router) {
|
|||||||
isS3
|
isS3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
covers: ${type === 'series' ? 'seriesCoversBySerieId' : 'moviesCovers'}(orderBy: MEDIA_BY_MEDIA_ID__INDEX_ASC) {
|
covers: moviesCovers(orderBy: MEDIA_BY_MEDIA_ID__INDEX_ASC) {
|
||||||
media {
|
media {
|
||||||
id
|
id
|
||||||
path
|
path
|
||||||
@@ -210,14 +208,14 @@ function initReleasesActions(store, router) {
|
|||||||
isS3
|
isS3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trailer: ${type === 'series' ? 'seriesTrailerBySerieId' : 'moviesTrailer'} {
|
trailer: moviesTrailer {
|
||||||
media {
|
media {
|
||||||
id
|
id
|
||||||
path
|
path
|
||||||
isS3
|
isS3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scenes: ${type === 'series' ? 'seriesScenesBySerieId' : 'moviesScenes'} {
|
scenes: moviesScenes {
|
||||||
scene {
|
scene {
|
||||||
${releaseFields}
|
${releaseFields}
|
||||||
}
|
}
|
||||||
@@ -227,11 +225,25 @@ function initReleasesActions(store, router) {
|
|||||||
slug
|
slug
|
||||||
name
|
name
|
||||||
}
|
}
|
||||||
photos: ${type === 'series' ? 'seriesPhotosBySerieId' : 'moviesPhotos'} {
|
photos {
|
||||||
${mediaFragment}
|
id
|
||||||
}
|
index
|
||||||
scenesPhotos {
|
path
|
||||||
${mediaFields}
|
thumbnail
|
||||||
|
lazy
|
||||||
|
width
|
||||||
|
height
|
||||||
|
thumbnailWidth
|
||||||
|
thumbnailHeight
|
||||||
|
isS3
|
||||||
|
comment
|
||||||
|
sfw: sfwMedia {
|
||||||
|
id
|
||||||
|
thumbnail
|
||||||
|
lazy
|
||||||
|
path
|
||||||
|
comment
|
||||||
|
}
|
||||||
}
|
}
|
||||||
entity {
|
entity {
|
||||||
id
|
id
|
||||||
@@ -247,7 +259,7 @@ function initReleasesActions(store, router) {
|
|||||||
hasLogo
|
hasLogo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stashes: ${type === 'series' ? 'stashesSeriesBySerieId' : 'stashesMovies'}(
|
stashes: stashesMovies(
|
||||||
filter: {
|
filter: {
|
||||||
stash: {
|
stash: {
|
||||||
userId: {
|
userId: {
|
||||||
@@ -271,20 +283,12 @@ function initReleasesActions(store, router) {
|
|||||||
userId: store.state.auth.user?.id,
|
userId: store.state.auth.user?.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!result[type]) {
|
if (!movie) {
|
||||||
router.replace('/not-found');
|
router.replace('/not-found');
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return curateRelease(result[type]);
|
return curateRelease(movie);
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchMovieById(context, movieId) {
|
|
||||||
return fetchCollectionById(context, movieId, 'movie');
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchSerieById(context, serieId) {
|
|
||||||
return fetchCollectionById(context, serieId, 'series');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -292,7 +296,6 @@ function initReleasesActions(store, router) {
|
|||||||
fetchReleaseById,
|
fetchReleaseById,
|
||||||
fetchMovies,
|
fetchMovies,
|
||||||
fetchMovieById,
|
fetchMovieById,
|
||||||
fetchSerieById,
|
|
||||||
searchMovies,
|
searchMovies,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,11 +71,6 @@ const routes = [
|
|||||||
component: Release,
|
component: Release,
|
||||||
name: 'movie',
|
name: 'movie',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: '/serie/:releaseId/:releaseSlug?',
|
|
||||||
component: Release,
|
|
||||||
name: 'serie',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: '/actor/:actorId/:actorSlug',
|
path: '/actor/:actorId/:actorSlug',
|
||||||
name: 'actor',
|
name: 'actor',
|
||||||
|
|||||||
@@ -227,46 +227,6 @@ function initUiActions(store, _router) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchRandomCampaign(context, { minRatio, maxRatio }) {
|
|
||||||
const { randomCampaign } = await graphql(`
|
|
||||||
query Campaign(
|
|
||||||
$minRatio: BigFloat
|
|
||||||
$maxRatio: BigFloat
|
|
||||||
) {
|
|
||||||
randomCampaign: getRandomCampaign(minRatio: $minRatio, maxRatio: $maxRatio) {
|
|
||||||
url
|
|
||||||
affiliate {
|
|
||||||
url
|
|
||||||
}
|
|
||||||
banner {
|
|
||||||
id
|
|
||||||
type
|
|
||||||
ratio
|
|
||||||
entity {
|
|
||||||
type
|
|
||||||
slug
|
|
||||||
parent {
|
|
||||||
type
|
|
||||||
slug
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
entity {
|
|
||||||
slug
|
|
||||||
}
|
|
||||||
parent {
|
|
||||||
slug
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`, {
|
|
||||||
minRatio,
|
|
||||||
maxRatio,
|
|
||||||
});
|
|
||||||
|
|
||||||
return randomCampaign;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchStats() {
|
async function fetchStats() {
|
||||||
const {
|
const {
|
||||||
scenes,
|
scenes,
|
||||||
@@ -313,7 +273,6 @@ function initUiActions(store, _router) {
|
|||||||
setBatch,
|
setBatch,
|
||||||
setSfw,
|
setSfw,
|
||||||
setTheme,
|
setTheme,
|
||||||
fetchRandomCampaign,
|
|
||||||
fetchNotifications,
|
fetchNotifications,
|
||||||
fetchStats,
|
fetchStats,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -89,10 +89,6 @@ module.exports = {
|
|||||||
'uksinners',
|
'uksinners',
|
||||||
// mindgeek
|
// mindgeek
|
||||||
'pornhub',
|
'pornhub',
|
||||||
// insex
|
|
||||||
'paintoy',
|
|
||||||
'aganmedon',
|
|
||||||
'sensualpain',
|
|
||||||
],
|
],
|
||||||
networks: [
|
networks: [
|
||||||
// dummy network for testing
|
// dummy network for testing
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
exports.up = async (knex) => knex.raw(`
|
exports.up = async (knex) => knex.raw(`
|
||||||
CREATE OR REPLACE FUNCTION entities_scene_total(entity entities) RETURNS bigint AS $$
|
CREATE OR REPLACE FUNCTION entities_scene_total(entity entities) RETURNS integer AS $$
|
||||||
SELECT COUNT(id)
|
SELECT COUNT(id)
|
||||||
FROM releases
|
FROM releases
|
||||||
WHERE releases.entity_id = entity.id;
|
WHERE releases.entity_id = entity.id;
|
||||||
|
|||||||
8
migrations/20220209010315_movies_tags.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
exports.up = async (knex) => knex.raw(`
|
||||||
|
CREATE VIEW movies_tagged AS
|
||||||
|
SELECT * FROM movies;
|
||||||
|
`);
|
||||||
|
|
||||||
|
exports.down = async (knex) => knex.raw(`
|
||||||
|
DROP VIEW IF EXISTS movies_tagged;
|
||||||
|
`);
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
exports.up = async (knex) => knex.raw(`
|
|
||||||
CREATE FUNCTION entities_scene_tags(entity entities, selectable_tags text[]) RETURNS SETOF tags AS $$
|
|
||||||
SELECT tags.*
|
|
||||||
FROM releases
|
|
||||||
LEFT JOIN
|
|
||||||
releases_tags ON releases_tags.release_id = releases.id
|
|
||||||
LEFT JOIN
|
|
||||||
tags ON tags.id = releases_tags.tag_id
|
|
||||||
WHERE
|
|
||||||
releases.entity_id = entity.id
|
|
||||||
AND
|
|
||||||
CASE WHEN array_length(selectable_tags, 1) IS NOT NULL
|
|
||||||
THEN tags.slug = ANY(selectable_tags)
|
|
||||||
ELSE true
|
|
||||||
END
|
|
||||||
GROUP BY tags.id
|
|
||||||
ORDER BY tags.name;
|
|
||||||
$$ LANGUAGE SQL STABLE;
|
|
||||||
`);
|
|
||||||
|
|
||||||
exports.down = async (knex) => knex.raw(`
|
|
||||||
DROP FUNCTION IF EXISTS entities_scene_tags;
|
|
||||||
`);
|
|
||||||
@@ -1,215 +0,0 @@
|
|||||||
const config = require('config');
|
|
||||||
|
|
||||||
exports.up = async (knex) => Promise.resolve()
|
|
||||||
.then(() => knex.schema.createTable('series', (table) => {
|
|
||||||
table.increments('id', 16);
|
|
||||||
|
|
||||||
table.integer('entity_id', 12)
|
|
||||||
.references('id')
|
|
||||||
.inTable('entities')
|
|
||||||
.notNullable();
|
|
||||||
|
|
||||||
table.integer('studio_id', 12)
|
|
||||||
.references('id')
|
|
||||||
.inTable('entities');
|
|
||||||
|
|
||||||
table.text('entry_id');
|
|
||||||
table.unique(['entity_id', 'entry_id']);
|
|
||||||
|
|
||||||
table.text('url', 1000);
|
|
||||||
table.text('title');
|
|
||||||
table.text('slug');
|
|
||||||
|
|
||||||
table.timestamp('date');
|
|
||||||
table.index('date');
|
|
||||||
|
|
||||||
table.enum('date_precision', ['year', 'month', 'week', 'day', 'hour', 'minute', 'second'])
|
|
||||||
.defaultTo('day');
|
|
||||||
|
|
||||||
table.text('description');
|
|
||||||
|
|
||||||
table.boolean('deep');
|
|
||||||
table.text('deep_url', 1000);
|
|
||||||
|
|
||||||
table.text('comment');
|
|
||||||
|
|
||||||
table.integer('created_batch_id', 12)
|
|
||||||
.references('id')
|
|
||||||
.inTable('batches')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.integer('updated_batch_id', 12)
|
|
||||||
.references('id')
|
|
||||||
.inTable('batches')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
}))
|
|
||||||
.then(() => knex.schema.createTable('series_scenes', (table) => {
|
|
||||||
table.integer('serie_id', 16)
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('series')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.integer('scene_id', 16)
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('releases')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.unique(['serie_id', 'scene_id']);
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
}))
|
|
||||||
.then(() => knex.schema.createTable('series_trailers', (table) => {
|
|
||||||
table.integer('serie_id', 16)
|
|
||||||
.unique()
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('series')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.text('media_id', 21)
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('media');
|
|
||||||
}))
|
|
||||||
.then(() => knex.schema.createTable('series_posters', (table) => {
|
|
||||||
table.integer('serie_id', 16)
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('series')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.text('media_id', 21)
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('media')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.unique('serie_id');
|
|
||||||
}))
|
|
||||||
.then(() => knex.schema.createTable('series_covers', (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', 'media_id']);
|
|
||||||
}))
|
|
||||||
.then(() => knex.schema.createTable('series_search', (table) => {
|
|
||||||
table.integer('serie_id', 16)
|
|
||||||
.references('id')
|
|
||||||
.inTable('series')
|
|
||||||
.onDelete('cascade');
|
|
||||||
}))
|
|
||||||
.then(() => knex.schema.createTable('stashes_series', (table) => {
|
|
||||||
table.integer('stash_id')
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('stashes')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.integer('serie_id')
|
|
||||||
.notNullable()
|
|
||||||
.references('id')
|
|
||||||
.inTable('series')
|
|
||||||
.onDelete('cascade');
|
|
||||||
|
|
||||||
table.unique(['stash_id', 'serie_id']);
|
|
||||||
|
|
||||||
table.string('comment');
|
|
||||||
|
|
||||||
table.datetime('created_at')
|
|
||||||
.notNullable()
|
|
||||||
.defaultTo(knex.fn.now());
|
|
||||||
}))
|
|
||||||
.then(() => knex.raw(`
|
|
||||||
ALTER TABLE series_search ADD COLUMN document tsvector;
|
|
||||||
|
|
||||||
CREATE UNIQUE INDEX series_search_unique ON series_search (serie_id);
|
|
||||||
CREATE INDEX series_search_index ON series_search USING GIN (document);
|
|
||||||
|
|
||||||
CREATE FUNCTION series_actors(serie series) RETURNS SETOF actors AS $$
|
|
||||||
SELECT actors.*
|
|
||||||
FROM series_scenes
|
|
||||||
LEFT JOIN
|
|
||||||
releases ON releases.id = series_scenes.scene_id
|
|
||||||
LEFT JOIN
|
|
||||||
releases_actors ON releases_actors.release_id = releases.id
|
|
||||||
LEFT JOIN
|
|
||||||
actors ON actors.id = releases_actors.actor_id
|
|
||||||
WHERE series_scenes.serie_id = serie.id
|
|
||||||
AND actors.id IS NOT NULL
|
|
||||||
GROUP BY actors.id
|
|
||||||
ORDER BY actors.name, actors.gender
|
|
||||||
$$ LANGUAGE SQL STABLE;
|
|
||||||
|
|
||||||
CREATE FUNCTION series_tags(serie series) RETURNS SETOF tags AS $$
|
|
||||||
SELECT tags.*
|
|
||||||
FROM series_scenes
|
|
||||||
LEFT JOIN
|
|
||||||
releases ON releases.id = series_scenes.scene_id
|
|
||||||
LEFT JOIN
|
|
||||||
releases_tags ON releases_tags.release_id = releases.id
|
|
||||||
LEFT JOIN
|
|
||||||
tags ON tags.id = releases_tags.tag_id
|
|
||||||
WHERE series_scenes.serie_id = serie.id
|
|
||||||
AND tags.id IS NOT NULL
|
|
||||||
GROUP BY tags.id
|
|
||||||
ORDER BY tags.priority DESC
|
|
||||||
$$ LANGUAGE SQL STABLE;
|
|
||||||
|
|
||||||
CREATE FUNCTION series_photos(serie series) RETURNS SETOF media AS $$
|
|
||||||
SELECT media.*
|
|
||||||
FROM series_scenes
|
|
||||||
LEFT JOIN
|
|
||||||
releases ON releases.id = series_scenes.scene_id
|
|
||||||
INNER JOIN
|
|
||||||
releases_photos ON releases_photos.release_id = releases.id
|
|
||||||
LEFT JOIN
|
|
||||||
media ON media.id = releases_photos.media_id
|
|
||||||
WHERE series_scenes.serie_id = serie.id
|
|
||||||
GROUP BY media.id
|
|
||||||
ORDER BY media.index ASC
|
|
||||||
$$ LANGUAGE SQL STABLE;
|
|
||||||
|
|
||||||
GRANT ALL ON ALL TABLES IN SCHEMA public TO :visitor;
|
|
||||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO :visitor;
|
|
||||||
|
|
||||||
ALTER TABLE stashes_series ENABLE ROW LEVEL SECURITY;
|
|
||||||
|
|
||||||
CREATE POLICY stashes_policy ON stashes_series
|
|
||||||
USING (EXISTS (
|
|
||||||
SELECT *
|
|
||||||
FROM stashes
|
|
||||||
WHERE stashes.id = stashes_series.stash_id
|
|
||||||
AND (stashes.user_id = current_user_id() OR stashes.public)
|
|
||||||
));
|
|
||||||
`, {
|
|
||||||
visitor: knex.raw(config.database.query.user),
|
|
||||||
}));
|
|
||||||
|
|
||||||
exports.down = async (knex) => Promise.resolve()
|
|
||||||
.then(() => knex.raw(`
|
|
||||||
DROP FUNCTION IF EXISTS series_actors;
|
|
||||||
DROP FUNCTION IF EXISTS series_tags;
|
|
||||||
DROP FUNCTION IF EXISTS series_photos;
|
|
||||||
|
|
||||||
DROP TABLE IF EXISTS stashes_series CASCADE;
|
|
||||||
DROP TABLE IF EXISTS series_scenes CASCADE;
|
|
||||||
DROP TABLE IF EXISTS series_trailers CASCADE;
|
|
||||||
DROP TABLE IF EXISTS series_posters CASCADE;
|
|
||||||
DROP TABLE IF EXISTS series_covers CASCADE;
|
|
||||||
DROP TABLE IF EXISTS series_search CASCADE;
|
|
||||||
DROP TABLE IF EXISTS series CASCADE;
|
|
||||||
`));
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
const config = require('config');
|
|
||||||
|
|
||||||
exports.up = async (knex) => Promise.resolve()
|
|
||||||
.then(() => knex.raw(`
|
|
||||||
ALTER FUNCTION movies_photos(movie movies) RENAME TO movies_scenes_photos;
|
|
||||||
ALTER FUNCTION series_photos(serie series) RENAME TO series_scenes_photos;
|
|
||||||
`))
|
|
||||||
.then(() => knex.schema.createTable('movies_photos', (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', 'media_id']);
|
|
||||||
}))
|
|
||||||
.then(() => knex.schema.createTable('series_photos', (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', 'media_id']);
|
|
||||||
}))
|
|
||||||
.then(() => knex.raw(`
|
|
||||||
GRANT ALL ON ALL TABLES IN SCHEMA public TO :visitor;
|
|
||||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO :visitor;
|
|
||||||
`, {
|
|
||||||
visitor: knex.raw(config.database.query.user),
|
|
||||||
}));
|
|
||||||
|
|
||||||
exports.down = async (knex) => knex.raw(`
|
|
||||||
DROP TABLE IF EXISTS movies_photos CASCADE;
|
|
||||||
DROP TABLE IF EXISTS series_photos CASCADE;
|
|
||||||
|
|
||||||
ALTER FUNCTION movies_scenes_photos(movie movies) RENAME TO movies_photos;
|
|
||||||
ALTER FUNCTION series_scenes_photos(serie series) RENAME TO series_photos;
|
|
||||||
`);
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
exports.up = async (knex) => knex.schema.alterTable('releases', (table) => {
|
|
||||||
table.specificType('qualities', 'text[]');
|
|
||||||
});
|
|
||||||
|
|
||||||
exports.down = async (knex) => knex.schema.alterTable('releases', (table) => {
|
|
||||||
table.dropColumn('qualities');
|
|
||||||
});
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
exports.up = async (knex) => knex.schema.alterTable('users', (table) => {
|
|
||||||
table.datetime('last_login');
|
|
||||||
});
|
|
||||||
|
|
||||||
exports.down = async (knex) => knex.schema.alterTable('users', (table) => {
|
|
||||||
table.dropColumn('last_login');
|
|
||||||
});
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
exports.up = async (knex) => knex.raw(`
|
|
||||||
CREATE MATERIALIZED VIEW entities_stats
|
|
||||||
AS
|
|
||||||
WITH RECURSIVE relations AS (
|
|
||||||
SELECT entities.id, entities.parent_id, count(releases.id) AS releases_count, count(releases.id) AS total_count
|
|
||||||
FROM entities
|
|
||||||
LEFT JOIN releases ON releases.entity_id = entities.id
|
|
||||||
GROUP BY entities.id
|
|
||||||
|
|
||||||
UNION ALL
|
|
||||||
|
|
||||||
SELECT entities.id AS entity_id, count(releases.id) AS releases_count, count(releases.id) + relations.total_count AS total_count
|
|
||||||
FROM entities
|
|
||||||
INNER JOIN relations ON relations.id = entities.parent_id
|
|
||||||
LEFT JOIN releases ON releases.entity_id = entities.id
|
|
||||||
GROUP BY entities.id
|
|
||||||
)
|
|
||||||
|
|
||||||
SELECT relations.id AS entity_id, relations.releases_count
|
|
||||||
FROM relations;
|
|
||||||
`);
|
|
||||||
|
|
||||||
exports.down = async (knex) => knex.raw(`
|
|
||||||
DROP MATERIALIZED VIEW entities_stats;
|
|
||||||
`);
|
|
||||||
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "traxxx",
|
"name": "traxxx",
|
||||||
"version": "1.217.3",
|
"version": "1.209.4",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "traxxx",
|
"name": "traxxx",
|
||||||
"version": "1.217.3",
|
"version": "1.209.4",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@casl/ability": "^5.2.2",
|
"@casl/ability": "^5.2.2",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "traxxx",
|
"name": "traxxx",
|
||||||
"version": "1.217.3",
|
"version": "1.209.4",
|
||||||
"description": "All the latest porn releases in one place",
|
"description": "All the latest porn releases in one place",
|
||||||
"main": "src/app.js",
|
"main": "src/app.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 191 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 9.5 KiB After Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,40 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 8192 696.7" style="enable-background:new 0 0 8192 696.7;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:#FFFFFF;}
|
|
||||||
</style>
|
|
||||||
<g>
|
|
||||||
<path class="st0" d="M378.2,11.5c103,0,155.7,10.1,203.2,33.6c47.5,24.4,74,62.1,74,116c0,87.5-109.6,134.3-187.4,145.5v2
|
|
||||||
c134.6,12.2,237.6,68.2,237.6,170c0,72.2-46.2,120.1-118.8,153.7C524.8,660.8,431.1,673,334.7,673H6v-28.5
|
|
||||||
c103-6.1,113.6-14.2,113.6-124.1V164.2C119.6,54.2,109,46.1,13.9,40V11.5L378.2,11.5L378.2,11.5z M264.7,300.6h52.8
|
|
||||||
c113.6,0,184.8-40.7,184.8-126.2c0-93.6-85.8-124.1-166.3-124.1c-34.4,0-52.8,2-60.7,5.1c-10.6,4.1-10.6,21.4-10.6,45.7
|
|
||||||
L264.7,300.6L264.7,300.6z M264.7,337.2v181.1c0,95.6,15.8,116,100.3,114c87.1,0,176.9-37.6,176.9-142.5
|
|
||||||
c0-103.8-97.7-152.6-232.4-152.6L264.7,337.2L264.7,337.2z"/>
|
|
||||||
<path class="st0" d="M1438.2,561c0,74.2,7.9,79.4,89.8,83.5V673h-318.1v-28.5c81.9-4.1,89.8-9.1,89.8-83.5V331.1
|
|
||||||
c0-75.3-7.9-79.4-89.8-83.5v-28.5h318v28.5c-81.9,4.1-89.8,8.1-89.8,83.5L1438.2,561L1438.2,561z"/>
|
|
||||||
<path class="st0" d="M2380.7,11.5c99,0,174.2,12.2,227,40.7c56.7,30.5,89.8,75.3,89.8,143.5c0,129.2-133.4,195.3-261.4,207.6
|
|
||||||
c-21.1,2-44.8,2-60.7,2l-88.4-18.4v133.3c0,109.9,10.6,118.1,132,124.1v28.5h-388.1v-28.4c100.3-6.1,110.9-14.2,110.9-124.1V164.2
|
|
||||||
c0-109.9-10.6-118.1-105.6-124.1V11.5L2380.7,11.5L2380.7,11.5z M2287,347.3c21.1,6.1,46.2,12.2,80.5,12.2
|
|
||||||
c55.4,0,169-28.5,169-162.8c0-104.8-74-146.6-184.8-146.6c-63.4,0-64.6,6.1-64.6,36.6V347.3z"/>
|
|
||||||
<path class="st0" d="M3690.2,412.4V331c0-75.3-7.9-79.4-93.8-83.5V219h322.1v28.5c-81.9,4.1-89.8,8.1-89.8,83.5v229.9
|
|
||||||
c0,74.2,7.9,79.4,89.8,83.5v28.5h-322.1v-28.4c85.8-4.1,93.8-9.1,93.8-83.5V453.1h-269.3V561c0,74.2,7.9,79.4,85.8,83.5V673h-315.5
|
|
||||||
v-28.5c83.2-4.1,91.1-9.1,91.1-83.5V331.1c0-75.3-7.9-79.4-93.8-83.5v-28.5h322.1v28.5c-81.9,4.1-89.8,8.1-89.8,83.5v81.4
|
|
||||||
L3690.2,412.4L3690.2,412.4z"/>
|
|
||||||
<path class="st0" d="M5085.4,438.9c0,160.8-159.7,246.2-327.4,246.2c-219.1,0-330-120.1-330-228.9c0-168.9,175.5-249.3,330-249.3
|
|
||||||
C4958.7,207,5085.4,310.7,5085.4,438.9z M4767.3,648.5c84.4,0,162.4-51.9,162.4-187.2c0-108.9-64.6-217.8-183.5-217.8
|
|
||||||
c-87.1,0-162.4,70.2-162.4,189.3C4583.8,557,4656.4,648.5,4767.3,648.5z"/>
|
|
||||||
<path class="st0" d="M5816.7,561c0,74.2,7.9,79.4,89.8,83.5V673h-314.1v-28.5c83.2-4.1,91.1-9.1,91.1-83.5V331.1
|
|
||||||
c0-75.3-7.9-79.4-87.1-83.5v-28.5h330c60.7,0,110.9,6.1,149.2,23.4c36.9,17.3,66,50.9,66,95.6c0,60-55.4,97.7-128,116
|
|
||||||
c15.8,21.4,58.1,70.2,85.8,100.7c31.7,35.6,56.7,57,72.6,68.2c18.5,12.2,43.6,23.4,66,29.5l-4,26.5h-52.8
|
|
||||||
c-117.5-1-153.2-26.5-188.8-63.1c-31.7-32.6-66-82.5-88.4-111c-15.8-21.4-26.4-25.5-66-25.5h-21.3V561z M5816.7,447h42.3
|
|
||||||
c29,0,62.1-3,85.8-14.2c36.9-17.3,52.8-47.9,52.8-83.5c0-65.1-58.1-94.6-124-94.6c-54.2,0-56.7,1-56.7,29.5L5816.7,447L5816.7,447z
|
|
||||||
"/>
|
|
||||||
<path class="st0" d="M6948,561c0,74.2,7.9,79.4,89.8,83.5V673h-318.1v-28.5c81.9-4.1,89.8-9.1,89.8-83.5V331.1
|
|
||||||
c0-75.3-7.9-79.4-89.8-83.5v-28.5h318.1v28.5c-81.9,4.1-89.8,8.1-89.8,83.5L6948,561L6948,561z"/>
|
|
||||||
<path class="st0" d="M7886.5,644.5l25-2c36.9-3,43.6-10.1,21.1-54l-31.7-61.1h-180.9c-5.2,11.2-19.8,43.7-31.7,73.2
|
|
||||||
c-11.9,30.5-4,38.6,33,41.7l30.4,2v28.5h-238.9v-28.4c55.4-5.1,79.2-7.1,116.1-74.2l196.7-355.2l48.8-8.1l199.3,375.5
|
|
||||||
c30.4,56,56.7,58,112.2,62.1V673h-299.7v-28.5H7886.5z M7734.7,488.8h147.8l-72.6-144.5h-4L7734.7,488.8z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |