diff --git a/assets/components/releases/movie-tile.vue b/assets/components/releases/movie-tile.vue index ba7bba2f..8e8cd1ee 100644 --- a/assets/components/releases/movie-tile.vue +++ b/assets/components/releases/movie-tile.vue @@ -1,5 +1,7 @@ diff --git a/assets/components/releases/tile-details.vue b/assets/components/releases/tile-details.vue index 605d3985..16a8c2f2 100644 --- a/assets/components/releases/tile-details.vue +++ b/assets/components/releases/tile-details.vue @@ -171,17 +171,11 @@ export default { */ .details .favicon { - width: 1.75rem; - padding: .25rem .5rem .25rem .25rem; - } - - .date, - .site { - font-size: .75rem; + padding: .35rem .5rem .35rem .5rem; } .date { - padding: .25rem .5rem; + padding: .35rem .5rem; } .site { diff --git a/assets/js/releases/actions.js b/assets/js/releases/actions.js index 32453f19..be144a3a 100644 --- a/assets/js/releases/actions.js +++ b/assets/js/releases/actions.js @@ -130,6 +130,7 @@ function initReleasesActions(store, router) { movie(id: $movieId) { id title + description slug url date diff --git a/src/scrapers/evilangel.js b/src/scrapers/evilangel.js index 562acaa6..c016cf24 100644 --- a/src/scrapers/evilangel.js +++ b/src/scrapers/evilangel.js @@ -1,10 +1,11 @@ 'use strict'; -const { fetchApiLatest, fetchApiUpcoming, fetchScene, fetchApiProfile } = require('./gamma'); +const { fetchApiLatest, fetchApiUpcoming, fetchScene, fetchMovie, fetchApiProfile } = require('./gamma'); module.exports = { fetchLatest: fetchApiLatest, fetchProfile: fetchApiProfile, fetchScene, + fetchMovie, fetchUpcoming: fetchApiUpcoming, }; diff --git a/src/scrapers/gamma.js b/src/scrapers/gamma.js index 9e5c94a3..578d7976 100644 --- a/src/scrapers/gamma.js +++ b/src/scrapers/gamma.js @@ -320,6 +320,57 @@ async function scrapeScene(html, url, site, baseRelease, mobileHtml) { return release; } +async function fetchMovieTrailer(release) { + if (!release.entryId) { + return null; + } + + const url = `https://www.evilangel.com/en/dvdtrailer/${release.entryId}`; + const res = await qu.get(url); + + if (!res.ok) { + return null; + } + + const trailerHost = res.html.match(/"host":\s*"(.*\.com)"/)?.[1].replace(/\\\//g, '/'); + const trailerPath = res.html.match(/"url":\s*"(.*\.mp4)"/)?.[1].replace(/\\\//g, '/'); + + if (trailerHost && trailerPath) { + return qu.prefixUrl(trailerPath, trailerHost); + } + + return null; +} + +async function scrapeMovie({ query, html }, window, url, entity, options) { + const release = {}; + const data = window.dataLayer[0]?.dvdDetails; + + // const options = html.match(/options = {.*};/); + + release.entryId = new URL(url).pathname.match(/\/(\d+)(\/|$)/)?.[1]; + + release.covers = [ + query.img('.frontCoverImg', 'href'), + query.img('.backCoverImg', 'href'), + ]; + + release.description = query.cnt('.descriptionText'); + release.date = qu.extractDate(data.dvdReleaseDate); + release.title = data.dvdName; + + release.actors = data.dvdActors.map(actor => ({ name: actor.actorName, entryId: actor.actorId })); + release.tags = query.cnts('.dvdCol a'); + + release.scenes = scrapeAll(html, entity, entity.url); + + if (options.includeTrailers) { + release.trailer = await fetchMovieTrailer(release); + } + + return release; +} + function scrapeActorSearch(html, url, actorName) { const { document } = new JSDOM(html).window; const actorLink = document.querySelector(`a[title="${actorName}" i]`); @@ -575,6 +626,20 @@ async function fetchScene(url, site, baseRelease) { return null; } +async function fetchMovie(url, channel, baseRelease, options) { + const res = await qu.get(url, null, null, { + extract: { + runScripts: 'dangerously', + }, + }); + + if (res.ok) { + return scrapeMovie(res.item, res.window, url, channel, options); + } + + return res.status; +} + async function fetchActorScenes(actorName, apiUrl, siteSlug) { const res = await http.post(apiUrl, { requests: [ @@ -668,6 +733,7 @@ module.exports = { fetchApiProfile, fetchApiUpcoming, fetchLatest, + fetchMovie, fetchProfile, fetchScene, fetchUpcoming,