Scraping from Cherry Pimps when available. Showing cover in movie tile.

This commit is contained in:
DebaucheryLibrarian 2020-08-02 03:44:14 +02:00
parent 767437d9aa
commit b4f0501765
6 changed files with 63 additions and 18 deletions

View File

@ -43,6 +43,6 @@ export default {
.tiles { .tiles {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, 12rem); grid-template-columns: repeat(auto-fill, 15rem);
} }
</style> </style>

View File

@ -1,5 +1,19 @@
<template> <template>
<div class="tile"> <div class="tile">
<div class="cover">
<img
v-if="movie.covers[0]"
:src="`/media/${movie.covers[0].thumbnail}`"
class="front"
>
<img
v-if="movie.covers[1]"
:src="`/media/${movie.covers[1].thumbnail}`"
class="back"
>
</div>
<div class="details">{{ movie.entity.name }}</div> <div class="details">{{ movie.entity.name }}</div>
<h3 class="title">{{ movie.title }}</h3> <h3 class="title">{{ movie.title }}</h3>
</div> </div>
@ -18,8 +32,11 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.tile { .tile {
display: flex;
flex-direction: column;
background: var(--background); background: var(--background);
box-shadow: 0 0 3px var(--darken); box-shadow: 0 0 3px var(--darken);
font-size: 0;
} }
.details { .details {
@ -30,6 +47,26 @@ export default {
font-weight: bold; font-weight: bold;
} }
.cover {
img {
width: 100%;
}
.back {
display: none;
}
&:hover {
.back {
display: block;
}
.front {
display: none;
}
}
}
.title { .title {
padding: 1rem; padding: 1rem;
margin: 0; margin: 0;

View File

@ -70,6 +70,13 @@ function initReleasesActions(store, _router) {
name name
slug slug
} }
covers: moviesCoversByReleaseId {
media {
id
path
thumbnail
}
}
} }
totalCount totalCount
} }

View File

@ -644,7 +644,7 @@ exports.up = knex => Promise.resolve()
.defaultTo(knex.fn.now()); .defaultTo(knex.fn.now());
})) }))
.then(() => knex.schema.createTable('movies_covers', (table) => { .then(() => knex.schema.createTable('movies_covers', (table) => {
table.integer('movie_id', 16) table.integer('release_id', 16)
.notNullable() .notNullable()
.references('id') .references('id')
.inTable('movies'); .inTable('movies');
@ -654,7 +654,7 @@ exports.up = knex => Promise.resolve()
.references('id') .references('id')
.inTable('media'); .inTable('media');
table.unique(['movie_id', 'media_id']); table.unique(['release_id', 'media_id']);
})) }))
.then(() => knex.schema.createTable('movies_trailers', (table) => { .then(() => knex.schema.createTable('movies_trailers', (table) => {
table.integer('movie_id', 16) table.integer('movie_id', 16)

View File

@ -31,28 +31,34 @@ function scrapeAll(scenes, site) {
}).filter(Boolean); }).filter(Boolean);
} }
function scrapeScene({ q, qd, qa }, url, _site, baseRelease) { function scrapeScene({ query, html }, url, _site, baseRelease) {
const release = { url }; const release = { url };
const { pathname } = new URL(url); const { pathname } = new URL(url);
release.entryId = pathname.match(/\/\d+/)[0].slice(1); release.entryId = pathname.match(/\/\d+/)[0].slice(1);
release.title = q('.trailer-block_title', true); release.title = query.q('.trailer-block_title', true);
release.description = q('.info-block:nth-child(3) .text', true); release.description = query.q('.info-block:nth-child(3) .text', true);
release.date = qd('.info-block_data .text', 'MMMM D, YYYY', /\w+ \d{1,2}, \d{4}/); release.date = query.date('.info-block_data .text', 'MMMM D, YYYY', /\w+ \d{1,2}, \d{4}/);
const duration = baseRelease?.duration || Number(q('.info-block_data .text', true).match(/(\d+)\s+min/)?.[1]) * 60; const duration = baseRelease?.duration || Number(query.q('.info-block_data .text', true).match(/(\d+)\s+min/)?.[1]) * 60;
if (duration) release.duration = duration; if (duration) release.duration = duration;
release.actors = qa('.info-block_data a[href*="/models"]', true); release.actors = query.all('.info-block_data a[href*="/models"]', true);
release.tags = qa('.info-block a[href*="/categories"]', true); release.tags = query.all('.info-block a[href*="/categories"]', true);
const posterEl = q('.update_thumb'); const posterEl = query.q('.update_thumb');
const poster = posterEl.getAttribute('src0_3x') || posterEl.getAttribute('src0_2x') || posterEl.dataset.src; const poster = posterEl?.getAttribute('src0_3x') || posterEl?.getAttribute('src0_2x') || posterEl?.dataset.src;
if (poster && baseRelease?.poster) release.photos = [poster]; if (poster && baseRelease?.poster) release.photos = [poster];
else if (poster) release.poster = poster; else if (poster) release.poster = poster;
const trailer = html.match(/video src="(.*?)"/);
if (trailer) {
release.trailer = trailer[1];
}
return release; return release;
} }

View File

@ -23,8 +23,6 @@ function curateReleaseEntry(release, batchId, existingRelease, type = 'scene') {
limit: config.titleSlugLength, limit: config.titleSlugLength,
}); });
console.log(release);
const curatedRelease = { const curatedRelease = {
title: release.title, title: release.title,
entry_id: release.entryId || null, entry_id: release.entryId || null,
@ -47,7 +45,7 @@ function curateReleaseEntry(release, batchId, existingRelease, type = 'scene') {
if (type === 'scene') { if (type === 'scene') {
curatedRelease.shoot_id = release.shootId || null; curatedRelease.shoot_id = release.shootId || null;
curatedRelease.productionDate = Number(release.productionDate) ? release.productionDate : null; curatedRelease.production_date = Number(release.productionDate) ? release.productionDate : null;
curatedRelease.duration = release.duration; curatedRelease.duration = release.duration;
} }
@ -260,10 +258,7 @@ async function storeReleases(releases) {
async function storeMovies(movies) { async function storeMovies(movies) {
const [batchId] = await knex('batches').insert({ comment: null }).returning('id'); const [batchId] = await knex('batches').insert({ comment: null }).returning('id');
console.log(movies);
const curatedMovieEntries = movies.map(release => curateReleaseEntry(release, batchId, null, 'movie')); const curatedMovieEntries = movies.map(release => curateReleaseEntry(release, batchId, null, 'movie'));
console.log(curatedMovieEntries);
const storedMovies = await knex.batchInsert('movies', curatedMovieEntries).returning('*'); const storedMovies = await knex.batchInsert('movies', curatedMovieEntries).returning('*');
const moviesWithId = attachReleaseIds(movies, storedMovies); const moviesWithId = attachReleaseIds(movies, storedMovies);