Added release page.

This commit is contained in:
ThePendulum 2019-05-19 01:34:08 +02:00
parent 7825ae2727
commit fda6d1e475
8 changed files with 145 additions and 11 deletions

View File

@ -18,5 +18,6 @@
"react/jsx-uses-vars": 2, "react/jsx-uses-vars": 2,
"react/jsx-indent": ["error", 4], "react/jsx-indent": ["error", 4],
"react/jsx-indent-props": ["error", 4], "react/jsx-indent-props": ["error", 4],
"react/jsx-one-expression-per-line": "off",
} }
} }

View File

@ -17,6 +17,8 @@ const Home = ({ releases }) => (
<span className="scene-details"> <span className="scene-details">
<a <a
href={`/site/${release.site.id}`} href={`/site/${release.site.id}`}
target="_blank"
rel="noopener noreferrer"
className="scene-site site-link" className="scene-site site-link"
title={release.network.name} title={release.network.name}
> >
@ -33,16 +35,23 @@ const Home = ({ releases }) => (
</a> </a>
</span> </span>
<a
href={`/scene/${release.id}`}
target="_blank"
rel="noopener noreferrer"
className="scene-row scene-link"
>
<img <img
src={`/${release.site.id}/${release.id}/0.jpg`} src={`/${release.site.id}/${release.id}/0.jpg`}
alt={release.id} alt={release.id}
className="scene-thumbnail" className="scene-thumbnail"
/> />
</a>
</span> </span>
<div className="scene-info"> <div className="scene-info">
<a <a
href={`/item/${release.id}`} href={`/scene/${release.id}`}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
className="scene-row scene-link" className="scene-row scene-link"
@ -59,6 +68,8 @@ const Home = ({ releases }) => (
> >
<a <a
href={`/actor/${actor.id}`} href={`/actor/${actor.id}`}
target="_blank"
rel="noopener noreferrer"
className="actor-link" className="actor-link"
> >
{actor.name} {actor.name}
@ -80,6 +91,8 @@ const Home = ({ releases }) => (
> >
<a <a
href={`/tag/${tag.tag}`} href={`/tag/${tag.tag}`}
target="_blank"
rel="noopener noreferrer"
className="tag-link" className="tag-link"
> >
{tag.tag} {tag.tag}

View File

@ -3,10 +3,13 @@
const React = require('react'); const React = require('react');
const PropTypes = require('prop-types'); const PropTypes = require('prop-types');
const Layout = ({ children }) => ( const Layout = ({ children, title }) => (
<html lang="en"> <html lang="en">
<head> <head>
<title>Porn Radar</title> {title
? <title>Porn Radar | {title}</title>
: <title>Porn Radar</title>
}
<link href="/css/style.css" rel="stylesheet" /> <link href="/css/style.css" rel="stylesheet" />
</head> </head>
@ -25,6 +28,11 @@ const Layout = ({ children }) => (
Layout.propTypes = { Layout.propTypes = {
children: PropTypes.node.isRequired, children: PropTypes.node.isRequired,
title: PropTypes.string,
};
Layout.defaultProps = {
title: null,
}; };
module.exports = Layout; module.exports = Layout;

93
assets/views/release.jsx Normal file
View File

@ -0,0 +1,93 @@
'use strict';
const React = require('react');
const PropTypes = require('prop-types');
const moment = require('moment');
const Layout = require('./layout.jsx');
const Release = ({ release, thumbnails }) => (
<Layout title={release.title}>
<div>
<h2>{release.title}</h2>
<p>{moment(release.date).format('MMMM DD, YYYY')}</p>
<p>{release.shootId}</p>
<h3>
<a
href={`/site/${release.site.id}`}
target="_blank"
rel="noopener noreferrer"
title={release.network.name}
>
{release.site.name}
</a>
</h3>
<p>{release.network.name}</p>
<p>
<a
href={release.url}
target="_blank"
rel="noopener noreferrer"
>
View on {new URL(release.site.url).host.replace('www.', '')}
</a>
</p>
<ul>
{release.actors.map(actor => (
<li key={actor.id}>
<a
href={`/actor/${actor.id}`}
target="_blank"
rel="noopener noreferrer"
className="actor-link"
>
{actor.name}
</a>
</li>
))}
</ul>
<p>{release.description}</p>
<ul>
{release.tags.map(tag => (
<li key={tag.tag}>
<a
href={`/tag/${tag.tag}`}
target="_blank"
rel="noopener noreferrer"
className="actor-link"
>
{tag.tag}
</a>
</li>
))}
</ul>
{thumbnails.map((thumbnail, index) => (
<img
key={thumbnail}
src={`/${release.site.id}/${release.id}/${thumbnail}`}
alt={`Thumbnail ${index}`}
className="thumbnail"
/>
))}
</div>
</Layout>
);
Release.propTypes = {
release: PropTypes.object,
thumbnails: PropTypes.arrayOf(PropTypes.string),
};
Release.defaultProps = {
release: null,
thumbnails: [],
};
module.exports = Release;

View File

@ -132,3 +132,7 @@ body {
.tag-link { .tag-link {
color: #000; color: #000;
} }
.thumbnail {
width: 300px;
}

View File

@ -32,6 +32,7 @@ async function curateRelease(release) {
site: { site: {
id: release.site_id, id: release.site_id,
name: release.site_name, name: release.site_name,
url: release.site_url,
}, },
network: { network: {
id: release.network_id, id: release.network_id,
@ -45,9 +46,10 @@ function curateReleases(releases) {
return Promise.all(releases.map(async release => curateRelease(release))); return Promise.all(releases.map(async release => curateRelease(release)));
} }
async function fetchReleases() { async function fetchReleases(releaseId) {
const releases = await knex('releases') const releases = await knex('releases')
.select('releases.*', 'sites.name as site_name', 'sites.network_id', 'networks.name as network_name', 'networks.url as network_url') .where(releaseId ? { 'releases.id': releaseId } : {})
.select('releases.*', 'sites.name as site_name', 'sites.url as site_url', 'sites.network_id', 'networks.name as network_name', 'networks.url as network_url')
.leftJoin('sites', 'releases.site_id', 'sites.id') .leftJoin('sites', 'releases.site_id', 'sites.id')
.leftJoin('networks', 'sites.network_id', 'networks.id') .leftJoin('networks', 'sites.network_id', 'networks.id')
.orderBy('date', 'desc') .orderBy('date', 'desc')

View File

@ -1,5 +1,9 @@
'use strict'; 'use strict';
const config = require('config');
const fs = require('fs').promises;
const path = require('path');
const { fetchReleases } = require('../releases'); const { fetchReleases } = require('../releases');
async function fetchReleasesApi(req, res) { async function fetchReleasesApi(req, res) {
@ -8,6 +12,14 @@ async function fetchReleasesApi(req, res) {
res.render('home', { releases }); res.render('home', { releases });
} }
async function fetchReleaseApi(req, res) {
const [release] = await fetchReleases(req.params.id);
const thumbnails = await fs.readdir(path.join(config.thumbnailPath, release.site.id.toString(), release.id.toString()));
res.render('release', { release, thumbnails });
}
module.exports = { module.exports = {
fetchReleases: fetchReleasesApi, fetchReleases: fetchReleasesApi,
fetchRelease: fetchReleaseApi,
}; };

View File

@ -6,7 +6,7 @@ const express = require('express');
const Router = require('express-promise-router'); const Router = require('express-promise-router');
const { createEngine } = require('express-react-views'); const { createEngine } = require('express-react-views');
const { fetchReleases } = require('./releases'); const { fetchReleases, fetchRelease } = require('./releases');
function initServer() { function initServer() {
const app = express(); const app = express();
@ -20,6 +20,7 @@ function initServer() {
app.engine('jsx', createEngine()); app.engine('jsx', createEngine());
router.get('/', fetchReleases); router.get('/', fetchReleases);
router.get('/scene/:id', fetchRelease);
app.use(router); app.use(router);