From c2a008afbec00cdfdf8c782c2bad7b29c26ae3dc Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Sat, 27 Feb 2021 18:05:06 +0100 Subject: [PATCH] Added mimetype check to teasers and trailers. Added chapters to MindGeek scraper, fixed scene ID extraction getting stuck on numbers in domain name. Ordering chapters by timestamp. --- assets/js/fragments.js | 2 +- src/deep.js | 4 ++-- src/media.js | 4 ++++ src/releases.js | 2 +- src/scrapers/mindgeek.js | 14 +++++++++++++- src/store-releases.js | 26 +++++++++++++++----------- 6 files changed, 36 insertions(+), 16 deletions(-) diff --git a/assets/js/fragments.js b/assets/js/fragments.js index 5524b710..083a74e1 100644 --- a/assets/js/fragments.js +++ b/assets/js/fragments.js @@ -268,7 +268,7 @@ const releaseFragment = ` ${releaseTrailerFragment} ${releaseTeaserFragment} ${siteFragment} - chapters { + chapters(orderBy: TIME_ASC) { id index time diff --git a/src/deep.js b/src/deep.js index 56104297..e0619738 100644 --- a/src/deep.js +++ b/src/deep.js @@ -116,9 +116,9 @@ async function scrapeRelease(baseRelease, entitiesBySlug, type = 'scene') { ? await fetchScene(layoutScraper, baseRelease.url, entity, baseRelease, options, null) : await layoutScraper.fetchMovie(baseRelease.url, entity, baseRelease, options, null); - if (typeof scrapedRelease !== 'object' || Array.isArray(scrapedRelease)) { + if (!scrapedRelease || typeof scrapedRelease !== 'object' || Array.isArray(scrapedRelease)) { // scraper is unable to fetch the releases and returned a HTTP code or null - throw new Error(`Scraper returned ${scrapedRelease} when fetching latest from '${entity.name}' (${entity.parent?.name})`); + throw new Error(`Scraper returned '${scrapedRelease}' when fetching latest from '${entity.name}' (${entity.parent?.name})`); } // object-merge-advance will use null as explicit false on hard merged keys, even when null as explicit falls is disabled diff --git a/src/media.js b/src/media.js index f360137d..67c65e31 100644 --- a/src/media.js +++ b/src/media.js @@ -487,6 +487,10 @@ async function storeFile(media, options) { throw new Error(`Media for '${media.role}' must be an image, but '${media.meta.mimetype}' was detected`); } + if (['teasers', 'trailers'].includes(media.role) && media.meta.type !== 'video') { + throw new Error(`Media for '${media.role}' must be a video, but '${media.meta.mimetype}' was detected in ${media.src}`); + } + const [stat] = await Promise.all([ fsPromises.stat(media.file.path), fsPromises.mkdir(path.join(config.media.path, filedir), { recursive: true }), diff --git a/src/releases.js b/src/releases.js index a4668aa8..9f93471c 100644 --- a/src/releases.js +++ b/src/releases.js @@ -45,7 +45,7 @@ const releaseFields = ` slug } } - chapters @include (if: $full) { + chapters(orderBy: TIME_ASC) @include(if: $full) { id index time diff --git a/src/scrapers/mindgeek.js b/src/scrapers/mindgeek.js index 6e98522a..7c40c778 100644 --- a/src/scrapers/mindgeek.js +++ b/src/scrapers/mindgeek.js @@ -84,6 +84,12 @@ function scrapeLatestX(data, site, filterChannel) { if (teaser) release.teaser = teaser; if (trailer) release.trailer = trailer; + release.chapters = data.timeTags?.map(chapter => ({ + time: chapter.startTime, + duration: chapter.endTime - chapter.startTime, + tags: [chapter.name], + })); + return release; } @@ -114,6 +120,12 @@ function scrapeScene(data, url, _site, networkName) { if (teaser) release.teaser = teaser; if (trailer) release.trailer = trailer; + release.chapters = data.timeTags?.map(chapter => ({ + time: chapter.startTime, + duration: chapter.endTime - chapter.startTime, + tags: [chapter.name], + })); + const siteName = data.collections[0]?.name || data.brand; release.channel = slugify(siteName, ''); @@ -279,7 +291,7 @@ async function fetchScene(url, site, baseScene, options) { return baseScene; } - const entryId = url.match(/\d+/)[0]; + const entryId = new URL(url).pathname.match(/\/(\d+)/)?.[1]; const { session, instanceToken } = await getSession(site, options.parameters); const res = await http.get(`https://site-api.project1service.com/v2/releases/${entryId}`, { diff --git a/src/store-releases.js b/src/store-releases.js index 082cc7b6..d85c9d91 100644 --- a/src/store-releases.js +++ b/src/store-releases.js @@ -250,17 +250,21 @@ async function updateReleasesSearch(releaseIds) { } async function storeChapters(releases) { - const chapters = releases.map(release => release.chapters?.map((chapter, index) => ({ - releaseId: release.id, - index: index + 1, - time: chapter.time, - duration: chapter.duration, - title: chapter.title, - description: chapter.description, - poster: chapter.poster, - photos: chapter.photos, - tags: chapter.tags, - }))).flat().filter(Boolean); + const chapters = releases + .map(release => release.chapters?.map((chapter, index) => ({ + releaseId: release.id, + index: index + 1, + time: chapter.time, + duration: chapter.duration, + title: chapter.title, + description: chapter.description, + poster: chapter.poster, + photos: chapter.photos, + tags: chapter.tags, + }))) + .flat() + .filter(Boolean) + .sort((chapterA, chapterB) => chapterA.time - chapterB.time); const curatedChapterEntries = chapters.map(chapter => ({ index: chapter.index,