Switched to tabs. Adding missing actor entries when scraping actors, with batch ID.

This commit is contained in:
2020-05-14 04:26:05 +02:00
parent f1eb29c713
commit 11eb66f834
178 changed files with 16594 additions and 16929 deletions

View File

@@ -1,59 +1,61 @@
import { graphql, get } from '../api';
import {
releasePosterFragment,
releaseActorsFragment,
releaseTagsFragment,
releasePosterFragment,
releaseActorsFragment,
releaseTagsFragment,
} from '../fragments';
import { curateRelease } from '../curate';
import getDateRange from '../get-date-range';
function curateActor(actor) {
if (!actor) {
return null;
}
if (!actor) {
return null;
}
const curatedActor = {
...actor,
height: actor.heightMetric && {
metric: actor.heightMetric,
imperial: actor.heightImperial,
},
weight: actor.weightMetric && {
metric: actor.weightMetric,
imperial: actor.weightImperial,
},
origin: actor.birthCountry && {
city: actor.birthCity,
state: actor.birthState,
country: actor.birthCountry,
},
residence: actor.residenceCountry && {
city: actor.residenceCity,
state: actor.residenceState,
country: actor.residenceCountry,
},
};
const curatedActor = {
...actor,
height: actor.heightMetric && {
metric: actor.heightMetric,
imperial: actor.heightImperial,
},
weight: actor.weightMetric && {
metric: actor.weightMetric,
imperial: actor.weightImperial,
},
origin: actor.birthCountry && {
city: actor.birthCity,
state: actor.birthState,
country: actor.birthCountry,
},
residence: actor.residenceCountry && {
city: actor.residenceCity,
state: actor.residenceState,
country: actor.residenceCountry,
},
scrapedAt: new Date(actor.createdAt),
updatedAt: new Date(actor.updatedAt),
};
if (actor.avatar) {
curatedActor.avatar = actor.avatar.media;
}
if (actor.avatar) {
curatedActor.avatar = actor.avatar.media;
}
if (actor.releases) {
curatedActor.releases = actor.releases.map(release => curateRelease(release.release));
}
if (actor.releases) {
curatedActor.releases = actor.releases.map(release => curateRelease(release.release));
}
if (actor.photos) {
curatedActor.photos = actor.photos.map(photo => photo.media);
}
if (actor.photos) {
curatedActor.photos = actor.photos.map(photo => photo.media);
}
return curatedActor;
return curatedActor;
}
function initActorActions(store, _router) {
async function fetchActorBySlug({ _commit }, { actorSlug, limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
async function fetchActorBySlug({ _commit }, { actorSlug, limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
const { actors: [actor] } = await graphql(`
const { actors: [actor] } = await graphql(`
query Actor(
$actorSlug: String!
$limit:Int = 1000,
@@ -90,6 +92,8 @@ function initActorActions(store, _router) {
tattoos
piercings
description
createdAt
updatedAt
network {
id
name
@@ -184,27 +188,27 @@ function initActorActions(store, _router) {
}
}
`, {
actorSlug,
limit,
after,
before,
orderBy: orderBy === 'DATE_DESC' ? 'RELEASE_BY_RELEASE_ID__DATE_DESC' : 'RELEASE_BY_RELEASE_ID__DATE_ASC',
exclude: store.state.ui.filter,
});
actorSlug,
limit,
after,
before,
orderBy: orderBy === 'DATE_DESC' ? 'RELEASE_BY_RELEASE_ID__DATE_DESC' : 'RELEASE_BY_RELEASE_ID__DATE_ASC',
exclude: store.state.ui.filter,
});
return curateActor(actor);
}
return curateActor(actor);
}
async function fetchActors({ _commit }, {
limit = 100,
letter,
gender,
}) {
const genderFilter = gender === null
? 'isNull: true'
: `equalTo: "${gender}"`;
async function fetchActors({ _commit }, {
limit = 100,
letter,
gender,
}) {
const genderFilter = gender === null
? 'isNull: true'
: `equalTo: "${gender}"`;
const { actors } = await graphql(`
const { actors } = await graphql(`
query Actors(
$limit: Int,
$letter: String! = "",
@@ -249,28 +253,28 @@ function initActorActions(store, _router) {
}
}
`, {
limit,
letter,
});
limit,
letter,
});
return actors.map(actor => curateActor(actor));
}
return actors.map(actor => curateActor(actor));
}
async function fetchActorReleases({ _commit }, actorId) {
const releases = await get(`/actors/${actorId}/releases`, {
filter: store.state.ui.filter,
after: store.getters.after,
before: store.getters.before,
});
async function fetchActorReleases({ _commit }, actorId) {
const releases = await get(`/actors/${actorId}/releases`, {
filter: store.state.ui.filter,
after: store.getters.after,
before: store.getters.before,
});
return releases;
}
return releases;
}
return {
fetchActorBySlug,
fetchActors,
fetchActorReleases,
};
return {
fetchActorBySlug,
fetchActors,
fetchActorReleases,
};
}
export default initActorActions;

View File

@@ -3,11 +3,11 @@ import mutations from './mutations';
import actions from './actions';
function initActorsStore(store, router) {
return {
state,
mutations,
actions: actions(store, router),
};
return {
state,
mutations,
actions: actions(store, router),
};
}
export default initActorsStore;

View File

@@ -1,71 +1,71 @@
import config from 'config';
async function get(endpoint, query = {}) {
const curatedQuery = Object.entries(query).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}); // remove empty values
const q = new URLSearchParams(curatedQuery).toString();
const curatedQuery = Object.entries(query).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}); // remove empty values
const q = new URLSearchParams(curatedQuery).toString();
const res = await fetch(`${config.api.url}${endpoint}?${q}`, {
method: 'GET',
mode: 'cors',
credentials: 'same-origin',
});
const res = await fetch(`${config.api.url}${endpoint}?${q}`, {
method: 'GET',
mode: 'cors',
credentials: 'same-origin',
});
if (res.ok) {
return res.json();
}
if (res.ok) {
return res.json();
}
const errorMsg = await res.text();
const errorMsg = await res.text();
throw new Error(errorMsg);
throw new Error(errorMsg);
}
async function post(endpoint, data) {
const res = await fetch(`${config.api.url}${endpoint}`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
credentials: 'same-origin',
body: JSON.stringify(data),
});
const res = await fetch(`${config.api.url}${endpoint}`, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
credentials: 'same-origin',
body: JSON.stringify(data),
});
if (res.ok) {
return res.json();
}
if (res.ok) {
return res.json();
}
const errorMsg = await res.text();
const errorMsg = await res.text();
throw new Error(errorMsg);
throw new Error(errorMsg);
}
async function graphql(query, variables = null) {
const res = await fetch('/graphql', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
credentials: 'same-origin',
body: JSON.stringify({
query,
variables,
}),
});
const res = await fetch('/graphql', {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
credentials: 'same-origin',
body: JSON.stringify({
query,
variables,
}),
});
if (res.ok) {
const { data } = await res.json();
if (res.ok) {
const { data } = await res.json();
return data;
}
return data;
}
const errorMsg = await res.text();
const errorMsg = await res.text();
throw new Error(errorMsg);
throw new Error(errorMsg);
}
export {
get,
post,
graphql,
get,
post,
graphql,
};

View File

@@ -3,11 +3,11 @@ import mutations from './mutations';
import actions from './actions';
function initAuthStore(store, router) {
return {
state,
mutations,
actions: actions(store, router),
};
return {
state,
mutations,
actions: actions(store, router),
};
}
export default initAuthStore;

View File

@@ -1,4 +1,4 @@
export default {
authenticated: false,
user: null,
authenticated: false,
user: null,
};

View File

@@ -1,10 +1,10 @@
export default {
api: {
url: `${window.location.origin}/api`,
},
filename: {
pattern: '{site.name} - {title} ({actors.$n.name}, {date} {shootId})',
separator: ', ',
date: 'DD-MM-YYYY',
},
api: {
url: `${window.location.origin}/api`,
},
filename: {
pattern: '{site.name} - {title} ({actors.$n.name}, {date} {shootId})',
separator: ', ',
date: 'DD-MM-YYYY',
},
};

View File

@@ -1,94 +1,94 @@
import dayjs from 'dayjs';
function curateActor(actor, release) {
const curatedActor = {
...actor,
origin: actor.originCountry && {
country: actor.originCountry,
},
};
const curatedActor = {
...actor,
origin: actor.originCountry && {
country: actor.originCountry,
},
};
if (actor.avatar) curatedActor.avatar = actor.avatar.media;
if (actor.avatar) curatedActor.avatar = actor.avatar.media;
if (release && release.date && curatedActor.birthdate) {
curatedActor.ageThen = dayjs(release.date).diff(actor.birthdate, 'year');
}
if (release && release.date && curatedActor.birthdate) {
curatedActor.ageThen = dayjs(release.date).diff(actor.birthdate, 'year');
}
return curatedActor;
return curatedActor;
}
function curateRelease(release) {
const curatedRelease = {
...release,
actors: [],
poster: release.poster && release.poster.media,
tags: release.tags ? release.tags.map(({ tag }) => tag) : [],
};
const curatedRelease = {
...release,
actors: [],
poster: release.poster && release.poster.media,
tags: release.tags ? release.tags.map(({ tag }) => tag) : [],
};
if (release.site) curatedRelease.network = release.site.network;
if (release.scenes) curatedRelease.scenes = release.scenes.map(({ scene }) => curateRelease(scene));
if (release.movies) curatedRelease.movies = release.movies.map(({ movie }) => curateRelease(movie));
if (release.photos) curatedRelease.photos = release.photos.map(({ media }) => media);
if (release.covers) curatedRelease.covers = release.covers.map(({ media }) => media);
if (release.trailer) curatedRelease.trailer = release.trailer.media;
if (release.teaser) curatedRelease.teaser = release.teaser.media;
if (release.actors) curatedRelease.actors = release.actors.map(({ actor }) => curateActor(actor, curatedRelease));
if (release.movieTags && release.movieTags.length > 0) curatedRelease.tags = release.movieTags.map(({ tag }) => tag);
if (release.movieActors && release.movieActors.length > 0) curatedRelease.actors = release.movieActors.map(({ actor }) => curateActor(actor, curatedRelease));
if (release.site) curatedRelease.network = release.site.network;
if (release.scenes) curatedRelease.scenes = release.scenes.map(({ scene }) => curateRelease(scene));
if (release.movies) curatedRelease.movies = release.movies.map(({ movie }) => curateRelease(movie));
if (release.photos) curatedRelease.photos = release.photos.map(({ media }) => media);
if (release.covers) curatedRelease.covers = release.covers.map(({ media }) => media);
if (release.trailer) curatedRelease.trailer = release.trailer.media;
if (release.teaser) curatedRelease.teaser = release.teaser.media;
if (release.actors) curatedRelease.actors = release.actors.map(({ actor }) => curateActor(actor, curatedRelease));
if (release.movieTags && release.movieTags.length > 0) curatedRelease.tags = release.movieTags.map(({ tag }) => tag);
if (release.movieActors && release.movieActors.length > 0) curatedRelease.actors = release.movieActors.map(({ actor }) => curateActor(actor, curatedRelease));
return curatedRelease;
return curatedRelease;
}
function curateSite(site, network) {
const curatedSite = {
id: site.id,
name: site.name,
slug: site.slug,
url: site.url,
independent: site.independent,
};
const curatedSite = {
id: site.id,
name: site.name,
slug: site.slug,
url: site.url,
independent: site.independent,
};
if (site.releases) curatedSite.releases = site.releases.map(release => curateRelease(release));
if (site.network || network) curatedSite.network = site.network || network;
if (site.tags) curatedSite.tags = site.tags.map(({ tag }) => tag);
if (site.releases) curatedSite.releases = site.releases.map(release => curateRelease(release));
if (site.network || network) curatedSite.network = site.network || network;
if (site.tags) curatedSite.tags = site.tags.map(({ tag }) => tag);
return curatedSite;
return curatedSite;
}
function curateNetwork(network, releases) {
const curatedNetwork = {
id: network.id,
name: network.name,
slug: network.slug,
url: network.url,
networks: [],
};
const curatedNetwork = {
id: network.id,
name: network.name,
slug: network.slug,
url: network.url,
networks: [],
};
if (network.parent) curatedNetwork.parent = curateNetwork(network.parent);
if (network.sites) curatedNetwork.sites = network.sites.map(site => curateSite(site, curatedNetwork));
if (network.networks) curatedNetwork.networks = network.networks.map(subNetwork => curateNetwork(subNetwork));
if (network.studios) curatedNetwork.studios = network.studios;
if (releases) curatedNetwork.releases = releases.map(release => curateRelease(release));
if (network.parent) curatedNetwork.parent = curateNetwork(network.parent);
if (network.sites) curatedNetwork.sites = network.sites.map(site => curateSite(site, curatedNetwork));
if (network.networks) curatedNetwork.networks = network.networks.map(subNetwork => curateNetwork(subNetwork));
if (network.studios) curatedNetwork.studios = network.studios;
if (releases) curatedNetwork.releases = releases.map(release => curateRelease(release));
return curatedNetwork;
return curatedNetwork;
}
function curateTag(tag) {
const curatedTag = {
...tag,
};
const curatedTag = {
...tag,
};
if (tag.releases) curatedTag.releases = tag.releases.map(({ release }) => curateRelease(release));
if (tag.photos) curatedTag.photos = tag.photos.map(({ media }) => media);
if (tag.poster) curatedTag.poster = tag.poster.media;
if (tag.releases) curatedTag.releases = tag.releases.map(({ release }) => curateRelease(release));
if (tag.photos) curatedTag.photos = tag.photos.map(({ media }) => media);
if (tag.poster) curatedTag.poster = tag.poster.media;
return curatedTag;
return curatedTag;
}
export {
curateActor,
curateRelease,
curateSite,
curateNetwork,
curateTag,
curateActor,
curateRelease,
curateSite,
curateNetwork,
curateTag,
};

View File

@@ -278,14 +278,14 @@ const releaseFragment = `
`;
export {
releaseActorsFragment,
releaseFields,
releaseTagsFragment,
releasePosterFragment,
releasePhotosFragment,
releaseTrailerFragment,
releasesFragment,
releaseFragment,
siteFragment,
sitesFragment,
releaseActorsFragment,
releaseFields,
releaseTagsFragment,
releasePosterFragment,
releasePhotosFragment,
releaseTrailerFragment,
releasesFragment,
releaseFragment,
siteFragment,
sitesFragment,
};

View File

@@ -1,30 +1,30 @@
import dayjs from 'dayjs';
const dateRanges = {
latest: () => ({
after: '1900-01-01',
before: dayjs(new Date()).add(1, 'day').format('YYYY-MM-DD'),
orderBy: 'DATE_DESC',
}),
upcoming: () => ({
after: dayjs(new Date()).format('YYYY-MM-DD'),
before: '2100-01-01',
orderBy: 'DATE_ASC',
}),
new: () => ({
after: '1900-01-01',
before: '2100-01-01',
orderBy: 'CREATED_AT_DESC',
}),
all: () => ({
after: '1900-01-01',
before: '2100-01-01',
orderBy: 'DATE_DESC',
}),
latest: () => ({
after: '1900-01-01',
before: dayjs(new Date()).add(1, 'day').format('YYYY-MM-DD'),
orderBy: 'DATE_DESC',
}),
upcoming: () => ({
after: dayjs(new Date()).format('YYYY-MM-DD'),
before: '2100-01-01',
orderBy: 'DATE_ASC',
}),
new: () => ({
after: '1900-01-01',
before: '2100-01-01',
orderBy: 'CREATED_AT_DESC',
}),
all: () => ({
after: '1900-01-01',
before: '2100-01-01',
orderBy: 'DATE_DESC',
}),
};
function getDateRange(range) {
return dateRanges[range]();
return dateRanges[range]();
}
export default getDateRange;

View File

@@ -14,48 +14,48 @@ import Container from '../components/container/container.vue';
import Icon from '../components/icon/icon.vue';
function init() {
const store = initStore(router);
const store = initStore(router);
initUiObservers(store, router);
initUiObservers(store, router);
if (window.env.sfw) {
store.dispatch('setSfw', true);
}
if (window.env.sfw) {
store.dispatch('setSfw', true);
}
Vue.mixin({
components: {
Icon,
},
watch: {
pageTitle(title) {
if (title) {
document.title = `traxxx - ${title}`;
return;
}
Vue.mixin({
components: {
Icon,
},
watch: {
pageTitle(title) {
if (title) {
document.title = `traxxx - ${title}`;
return;
}
document.title = 'traxxx';
},
},
methods: {
formatDate: (date, format) => dayjs(date).format(format),
isAfter: (dateA, dateB) => dayjs(dateA).isAfter(dateB),
isBefore: (dateA, dateB) => dayjs(dateA).isBefore(dateB),
},
});
document.title = 'traxxx';
},
},
methods: {
formatDate: (date, format) => dayjs(date).format(format),
isAfter: (dateA, dateB) => dayjs(dateA).isAfter(dateB),
isBefore: (dateA, dateB) => dayjs(dateA).isBefore(dateB),
},
});
Vue.use(VTooltip);
Vue.use(VueLazyLoad, {
throttleWait: 0,
});
Vue.use(VTooltip);
Vue.use(VueLazyLoad, {
throttleWait: 0,
});
new Vue({ // eslint-disable-line no-new
el: '#container',
store,
router,
render(createElement) {
return createElement(Container);
},
});
new Vue({ // eslint-disable-line no-new
el: '#container',
store,
router,
render(createElement) {
return createElement(Container);
},
});
}
init();

View File

@@ -4,10 +4,10 @@ import { curateNetwork } from '../curate';
import getDateRange from '../get-date-range';
function initNetworksActions(store, _router) {
async function fetchNetworkBySlug({ _commit }, { networkSlug, limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
async function fetchNetworkBySlug({ _commit }, { networkSlug, limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
const { network, releases } = await graphql(`
const { network, releases } = await graphql(`
query Network(
$networkSlug: String!
$limit:Int = 1000,
@@ -107,21 +107,21 @@ function initNetworksActions(store, _router) {
}
}
`, {
networkSlug,
limit,
after,
before,
orderBy,
afterTime: store.getters.after,
beforeTime: store.getters.before,
exclude: store.state.ui.filter,
});
networkSlug,
limit,
after,
before,
orderBy,
afterTime: store.getters.after,
beforeTime: store.getters.before,
exclude: store.state.ui.filter,
});
return curateNetwork(network, releases);
}
return curateNetwork(network, releases);
}
async function fetchNetworks({ _commit }) {
const { networks } = await graphql(`
async function fetchNetworks({ _commit }) {
const { networks } = await graphql(`
query Networks {
networks(orderBy: NAME_ASC) {
id
@@ -133,13 +133,13 @@ function initNetworksActions(store, _router) {
}
`);
return networks.map(network => curateNetwork(network));
}
return networks.map(network => curateNetwork(network));
}
return {
fetchNetworkBySlug,
fetchNetworks,
};
return {
fetchNetworkBySlug,
fetchNetworks,
};
}
export default initNetworksActions;

View File

@@ -3,11 +3,11 @@ import mutations from './mutations';
import actions from './actions';
function initNetworksStore(store, router) {
return {
state,
mutations,
actions: actions(store, router),
};
return {
state,
mutations,
actions: actions(store, router),
};
}
export default initNetworksStore;

View File

@@ -4,10 +4,10 @@ import { curateRelease } from '../curate';
import getDateRange from '../get-date-range';
function initReleasesActions(store, _router) {
async function fetchReleases({ _commit }, { limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
async function fetchReleases({ _commit }, { limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
const { releases } = await graphql(`
const { releases } = await graphql(`
query Releases(
$limit:Int = 1000,
$after:Date = "1900-01-01",
@@ -18,18 +18,18 @@ function initReleasesActions(store, _router) {
${releasesFragment}
}
`, {
limit,
after,
before,
orderBy,
exclude: store.state.ui.filter,
});
limit,
after,
before,
orderBy,
exclude: store.state.ui.filter,
});
return releases.map(release => curateRelease(release));
}
return releases.map(release => curateRelease(release));
}
async function searchReleases({ _commit }, { query, limit = 20 }) {
const res = await graphql(`
async function searchReleases({ _commit }, { query, limit = 20 }) {
const res = await graphql(`
query SearchReleases(
$query: String!
$limit: Int = 20
@@ -88,34 +88,34 @@ function initReleasesActions(store, _router) {
}
}
`, {
query,
limit,
});
query,
limit,
});
if (!res) return [];
if (!res) return [];
return res.releases.map(release => curateRelease(release));
}
return res.releases.map(release => curateRelease(release));
}
async function fetchReleaseById({ _commit }, releaseId) {
// const release = await get(`/releases/${releaseId}`);
async function fetchReleaseById({ _commit }, releaseId) {
// const release = await get(`/releases/${releaseId}`);
const { release } = await graphql(`
const { release } = await graphql(`
query Release($releaseId:Int!) {
${releaseFragment}
}
`, {
releaseId: Number(releaseId),
});
releaseId: Number(releaseId),
});
return curateRelease(release);
}
return curateRelease(release);
}
return {
fetchReleases,
fetchReleaseById,
searchReleases,
};
return {
fetchReleases,
fetchReleaseById,
searchReleases,
};
}
export default initReleasesActions;

View File

@@ -1,14 +1,14 @@
import Vue from 'vue';
function setCache(state, { target, releases }) {
Vue.set(state.cache, target, releases);
Vue.set(state.cache, target, releases);
}
function deleteCache(state, target) {
Vue.delete(state.cache, target);
Vue.delete(state.cache, target);
}
export default {
setCache,
deleteCache,
setCache,
deleteCache,
};

View File

@@ -3,11 +3,11 @@ import mutations from './mutations';
import actions from './actions';
function initReleasesStore(store, router) {
return {
state,
mutations,
actions: actions(store, router),
};
return {
state,
mutations,
actions: actions(store, router),
};
}
export default initReleasesStore;

View File

@@ -1,3 +1,3 @@
export default {
cache: {},
cache: {},
};

View File

@@ -16,139 +16,139 @@ import NotFound from '../components/errors/404.vue';
Vue.use(VueRouter);
const routes = [
{
path: '/',
redirect: {
name: 'latest',
},
},
{
path: '/home',
redirect: {
name: 'latest',
},
},
{
path: '/latest',
component: Home,
name: 'latest',
},
{
path: '/upcoming',
component: Home,
name: 'upcoming',
},
{
path: '/new',
component: Home,
name: 'new',
},
{
path: '/scene/:releaseId/:releaseSlug?',
component: Release,
name: 'scene',
},
{
path: '/movie/:releaseId/:releaseSlug?',
component: Release,
name: 'movie',
},
{
path: '/actor/:actorSlug',
name: 'actor',
redirect: from => ({
name: 'actorRange',
params: {
...from.params,
range: 'latest',
},
}),
},
{
path: '/actor/:actorSlug/:range',
component: Actor,
name: 'actorRange',
},
{
path: '/site/:siteSlug',
component: Site,
name: 'site',
redirect: from => ({
name: 'siteRange',
params: {
...from.params,
range: 'latest',
},
}),
},
{
path: '/site/:siteSlug/:range',
component: Site,
name: 'siteRange',
},
{
path: '/network/:networkSlug',
component: Network,
name: 'network',
redirect: from => ({
name: 'networkRange',
params: {
...from.params,
range: 'latest',
},
}),
},
{
path: '/network/:networkSlug/:range',
component: Network,
name: 'networkRange',
},
{
path: '/tag/:tagSlug',
component: Tag,
name: 'tag',
redirect: from => ({
name: 'tagRange',
params: {
...from.params,
range: 'latest',
},
}),
},
{
path: '/tag/:tagSlug/:range',
component: Tag,
name: 'tagRange',
},
{
path: '/actors/:gender?/:letter?',
component: Actors,
name: 'actors',
},
{
path: '/networks',
component: Networks,
name: 'networks',
},
{
path: '/tags',
component: Tags,
name: 'tags',
},
{
path: '/search',
component: Search,
name: 'search',
},
{
path: '*',
component: NotFound,
},
{
path: '/',
redirect: {
name: 'latest',
},
},
{
path: '/home',
redirect: {
name: 'latest',
},
},
{
path: '/latest',
component: Home,
name: 'latest',
},
{
path: '/upcoming',
component: Home,
name: 'upcoming',
},
{
path: '/new',
component: Home,
name: 'new',
},
{
path: '/scene/:releaseId/:releaseSlug?',
component: Release,
name: 'scene',
},
{
path: '/movie/:releaseId/:releaseSlug?',
component: Release,
name: 'movie',
},
{
path: '/actor/:actorSlug',
name: 'actor',
redirect: from => ({
name: 'actorRange',
params: {
...from.params,
range: 'latest',
},
}),
},
{
path: '/actor/:actorSlug/:range',
component: Actor,
name: 'actorRange',
},
{
path: '/site/:siteSlug',
component: Site,
name: 'site',
redirect: from => ({
name: 'siteRange',
params: {
...from.params,
range: 'latest',
},
}),
},
{
path: '/site/:siteSlug/:range',
component: Site,
name: 'siteRange',
},
{
path: '/network/:networkSlug',
component: Network,
name: 'network',
redirect: from => ({
name: 'networkRange',
params: {
...from.params,
range: 'latest',
},
}),
},
{
path: '/network/:networkSlug/:range',
component: Network,
name: 'networkRange',
},
{
path: '/tag/:tagSlug',
component: Tag,
name: 'tag',
redirect: from => ({
name: 'tagRange',
params: {
...from.params,
range: 'latest',
},
}),
},
{
path: '/tag/:tagSlug/:range',
component: Tag,
name: 'tagRange',
},
{
path: '/actors/:gender?/:letter?',
component: Actors,
name: 'actors',
},
{
path: '/networks',
component: Networks,
name: 'networks',
},
{
path: '/tags',
component: Tags,
name: 'tags',
},
{
path: '/search',
component: Search,
name: 'search',
},
{
path: '*',
component: NotFound,
},
];
const router = new VueRouter({
mode: 'history',
routes,
mode: 'history',
routes,
});
export default router;

View File

@@ -4,10 +4,10 @@ import { curateSite } from '../curate';
import getDateRange from '../get-date-range';
function initSitesActions(store, _router) {
async function fetchSiteBySlug({ _commit }, { siteSlug, limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
async function fetchSiteBySlug({ _commit }, { siteSlug, limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
const { site } = await graphql(`
const { site } = await graphql(`
query Site(
$siteSlug: String!,
$limit:Int = 100,
@@ -37,20 +37,20 @@ function initSitesActions(store, _router) {
}
}
`, {
siteSlug,
limit,
after,
before,
orderBy,
isNew: store.getters.isNew,
exclude: store.state.ui.filter,
});
siteSlug,
limit,
after,
before,
orderBy,
isNew: store.getters.isNew,
exclude: store.state.ui.filter,
});
return curateSite(site);
}
return curateSite(site);
}
async function fetchSites({ _commit }, { limit = 100 }) {
const { sites } = await graphql(`
async function fetchSites({ _commit }, { limit = 100 }) {
const { sites } = await graphql(`
query Sites(
$actorSlug: String!
$limit:Int = 100,
@@ -64,16 +64,16 @@ function initSitesActions(store, _router) {
}
}
`, {
limit,
after: store.getters.after,
before: store.getters.before,
});
limit,
after: store.getters.after,
before: store.getters.before,
});
return sites;
}
return sites;
}
async function searchSites({ _commit }, { query, limit = 20 }) {
const { sites } = await graphql(`
async function searchSites({ _commit }, { query, limit = 20 }) {
const { sites } = await graphql(`
query SearchSites(
$query: String!
$limit:Int = 20,
@@ -93,18 +93,18 @@ function initSitesActions(store, _router) {
}
}
`, {
query,
limit,
});
query,
limit,
});
return sites;
}
return sites;
}
return {
fetchSiteBySlug,
fetchSites,
searchSites,
};
return {
fetchSiteBySlug,
fetchSites,
searchSites,
};
}
export default initSitesActions;

View File

@@ -3,11 +3,11 @@ import mutations from './mutations';
import actions from './actions';
function initSitesStore(store, router) {
return {
state,
mutations,
actions: actions(store, router),
};
return {
state,
mutations,
actions: actions(store, router),
};
}
export default initSitesStore;

View File

@@ -10,19 +10,19 @@ import initActorsStore from './actors/actors';
import initTagsStore from './tags/tags';
function initStore(router) {
Vue.use(Vuex);
Vue.use(Vuex);
const store = new Vuex.Store();
const store = new Vuex.Store();
store.registerModule('ui', initUiStore(store, router));
store.registerModule('auth', initAuthStore(store, router));
store.registerModule('releases', initReleasesStore(store, router));
store.registerModule('actors', initActorsStore(store, router));
store.registerModule('sites', initSitesStore(store, router));
store.registerModule('networks', initNetworksStore(store, router));
store.registerModule('tags', initTagsStore(store, router));
store.registerModule('ui', initUiStore(store, router));
store.registerModule('auth', initAuthStore(store, router));
store.registerModule('releases', initReleasesStore(store, router));
store.registerModule('actors', initActorsStore(store, router));
store.registerModule('sites', initSitesStore(store, router));
store.registerModule('networks', initNetworksStore(store, router));
store.registerModule('tags', initTagsStore(store, router));
return store;
return store;
}
export default initStore;

View File

@@ -1,15 +1,15 @@
import { graphql, get } from '../api';
import {
releaseFields,
releaseFields,
} from '../fragments';
import { curateTag } from '../curate';
import getDateRange from '../get-date-range';
function initTagsActions(store, _router) {
async function fetchTagBySlug({ _commit }, { tagSlug, limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
async function fetchTagBySlug({ _commit }, { tagSlug, limit = 100, range = 'latest' }) {
const { before, after, orderBy } = getDateRange(range);
const { tagBySlug } = await graphql(`
const { tagBySlug } = await graphql(`
query Tag(
$tagSlug:String!
$limit:Int = 1000,
@@ -85,24 +85,24 @@ function initTagsActions(store, _router) {
}
}
`, {
tagSlug,
limit,
after,
before,
orderBy: orderBy === 'DATE_DESC' ? 'RELEASE_BY_RELEASE_ID__DATE_DESC' : 'RELEASE_BY_RELEASE_ID__DATE_ASC',
exclude: store.state.ui.filter,
});
tagSlug,
limit,
after,
before,
orderBy: orderBy === 'DATE_DESC' ? 'RELEASE_BY_RELEASE_ID__DATE_DESC' : 'RELEASE_BY_RELEASE_ID__DATE_ASC',
exclude: store.state.ui.filter,
});
return curateTag(tagBySlug, store);
}
return curateTag(tagBySlug, store);
}
async function fetchTags({ _commit }, {
limit = 100,
slugs = [],
_group,
_priority,
}) {
const { tags } = await graphql(`
async function fetchTags({ _commit }, {
limit = 100,
slugs = [],
_group,
_priority,
}) {
const { tags } = await graphql(`
query Tags(
$slugs: [String!] = [],
$limit: Int = 100
@@ -133,28 +133,28 @@ function initTagsActions(store, _router) {
}
}
`, {
slugs,
limit,
});
slugs,
limit,
});
return tags.map(tag => curateTag(tag, store.state.ui.sfw));
}
return tags.map(tag => curateTag(tag, store.state.ui.sfw));
}
async function fetchTagReleases({ _commit }, tagId) {
const releases = await get(`/tags/${tagId}/releases`, {
filter: store.state.ui.filter,
after: store.getters.after,
before: store.getters.before,
});
async function fetchTagReleases({ _commit }, tagId) {
const releases = await get(`/tags/${tagId}/releases`, {
filter: store.state.ui.filter,
after: store.getters.after,
before: store.getters.before,
});
return releases;
}
return releases;
}
return {
fetchTagBySlug,
fetchTags,
fetchTagReleases,
};
return {
fetchTagBySlug,
fetchTags,
fetchTagReleases,
};
}
export default initTagsActions;

View File

@@ -3,11 +3,11 @@ import mutations from './mutations';
import actions from './actions';
function initTagsStore(store, router) {
return {
state,
mutations,
actions: actions(store, router),
};
return {
state,
mutations,
actions: actions(store, router),
};
}
export default initTagsStore;

View File

@@ -1,35 +1,35 @@
function initUiActions(_store, _router) {
function setFilter({ commit }, filter) {
commit('setFilter', filter);
localStorage.setItem('filter', filter);
}
function setFilter({ commit }, filter) {
commit('setFilter', filter);
localStorage.setItem('filter', filter);
}
function setRange({ commit }, range) {
commit('setRange', range);
}
function setRange({ commit }, range) {
commit('setRange', range);
}
function setBatch({ commit }, batch) {
commit('setBatch', batch);
localStorage.setItem('batch', batch);
}
function setBatch({ commit }, batch) {
commit('setBatch', batch);
localStorage.setItem('batch', batch);
}
function setTheme({ commit }, theme) {
commit('setTheme', theme);
localStorage.setItem('theme', theme);
}
function setTheme({ commit }, theme) {
commit('setTheme', theme);
localStorage.setItem('theme', theme);
}
async function setSfw({ commit }, sfw) {
commit('setSfw', sfw);
localStorage.setItem('sfw', sfw);
}
async function setSfw({ commit }, sfw) {
commit('setSfw', sfw);
localStorage.setItem('sfw', sfw);
}
return {
setFilter,
setRange,
setBatch,
setSfw,
setTheme,
};
return {
setFilter,
setRange,
setBatch,
setSfw,
setTheme,
};
}
export default initUiActions;

View File

@@ -1,47 +1,47 @@
import dayjs from 'dayjs';
const dateRanges = {
latest: () => ({
after: '1900-01-01',
before: dayjs(new Date()).add(1, 'day').format('YYYY-MM-DD'),
orderBy: 'DATE_DESC',
}),
upcoming: () => ({
after: dayjs(new Date()).format('YYYY-MM-DD'),
before: '2100-01-01',
orderBy: 'DATE_ASC',
}),
new: () => ({
after: '1900-01-01',
before: '2100-01-01',
orderBy: 'CREATED_AT_DESC',
}),
all: () => ({
after: '1900-01-01',
before: '2100-01-01',
orderBy: 'DATE_DESC',
}),
latest: () => ({
after: '1900-01-01',
before: dayjs(new Date()).add(1, 'day').format('YYYY-MM-DD'),
orderBy: 'DATE_DESC',
}),
upcoming: () => ({
after: dayjs(new Date()).format('YYYY-MM-DD'),
before: '2100-01-01',
orderBy: 'DATE_ASC',
}),
new: () => ({
after: '1900-01-01',
before: '2100-01-01',
orderBy: 'CREATED_AT_DESC',
}),
all: () => ({
after: '1900-01-01',
before: '2100-01-01',
orderBy: 'DATE_DESC',
}),
};
function rangeDates(state) {
return dateRanges[state.range]();
return dateRanges[state.range]();
}
function before(state) {
return dateRanges[state.range]().before;
return dateRanges[state.range]().before;
}
function after(state) {
return dateRanges[state.range]().after;
return dateRanges[state.range]().after;
}
function orderBy(state) {
return dateRanges[state.range]().orderBy;
return dateRanges[state.range]().orderBy;
}
export default {
rangeDates,
before,
after,
orderBy,
rangeDates,
before,
after,
orderBy,
};

View File

@@ -1,27 +1,27 @@
function setFilter(state, filter) {
state.filter = filter;
state.filter = filter;
}
function setRange(state, range) {
state.range = range;
state.range = range;
}
function setBatch(state, batch) {
state.batch = batch;
state.batch = batch;
}
function setSfw(state, sfw) {
state.sfw = sfw;
state.sfw = sfw;
}
function setTheme(state, theme) {
state.theme = theme;
state.theme = theme;
}
export default {
setFilter,
setRange,
setBatch,
setSfw,
setTheme,
setFilter,
setRange,
setBatch,
setSfw,
setTheme,
};

View File

@@ -1,25 +1,25 @@
function initUiObservers(store, _router) {
document.addEventListener('keypress', (event) => {
if (event.target.tagName === 'INPUT') {
return;
}
document.addEventListener('keypress', (event) => {
if (event.target.tagName === 'INPUT') {
return;
}
if (event.key === 's') {
store.dispatch('setSfw', true);
}
if (event.key === 's') {
store.dispatch('setSfw', true);
}
if (event.key === 'n') {
store.dispatch('setSfw', false);
}
if (event.key === 'n') {
store.dispatch('setSfw', false);
}
if (event.key === 'd') {
store.dispatch('setTheme', 'dark');
}
if (event.key === 'd') {
store.dispatch('setTheme', 'dark');
}
if (event.key === 'l') {
store.dispatch('setTheme', 'light');
}
});
if (event.key === 'l') {
store.dispatch('setTheme', 'light');
}
});
}
export default initUiObservers;

View File

@@ -4,9 +4,9 @@ const storedSfw = localStorage.getItem('sfw');
const storedTheme = localStorage.getItem('theme');
export default {
filter: storedFilter ? storedFilter.split(',') : ['gay', 'transsexual'],
range: 'latest',
batch: storedBatch || 'all',
sfw: storedSfw === 'true' || false,
theme: storedTheme || 'light',
filter: storedFilter ? storedFilter.split(',') : ['gay', 'transsexual'],
range: 'latest',
batch: storedBatch || 'all',
sfw: storedSfw === 'true' || false,
theme: storedTheme || 'light',
};

View File

@@ -4,12 +4,12 @@ import getters from './getters';
import actions from './actions';
function initUiStore(store, router) {
return {
state,
mutations,
getters,
actions: actions(store, router),
};
return {
state,
mutations,
getters,
actions: actions(store, router),
};
}
export default initUiStore;