diff --git a/src/scrapers/gamma.js b/src/scrapers/gamma.js index 50a1f4a6..da338d6d 100644 --- a/src/scrapers/gamma.js +++ b/src/scrapers/gamma.js @@ -24,6 +24,19 @@ function getApiUrl(appId, apiKey) { }; } +function getAvatarFallbacks(avatar) { + if (!avatar) { + return null; + } + + return [ + avatar.replace(/\d+x\d+/, '500x750'), + avatar.replace(/\d+x\d+/, '240x360'), + avatar.replace(/\d+x\d+/, '200x300'), + avatar, + ]; +} + async function fetchApiCredentials(referer, site) { if (site?.parameters?.appId && site?.parameters?.apiKey) { return getApiUrl(site.parameters.appId, site.parameters.apiKey); @@ -450,7 +463,8 @@ async function fetchMovieTrailer(release) { async function scrapeMovie({ query, el }, window, url, entity, options) { const release = {}; - const data = window.dataLayer[0]?.dvdDetails; + const rawData = window.dataLayer[0]?.dvdDetails; + const data = rawData.dvdId && rawData; // dvdDetails is mostly empty in some cache states release.entryId = new URL(url).pathname.match(/\/(\d+)(\/|$)/)?.[1]; @@ -460,12 +474,19 @@ async function scrapeMovie({ query, el }, window, url, entity, options) { ]; release.description = query.cnt('.descriptionText'); - release.date = qu.extractDate(data.dvdReleaseDate); - release.title = data.dvdName; + release.date = qu.extractDate(data?.dvdReleaseDate) || query.date('.updatedOn', 'YYYY-MM-DD'); + release.title = data?.dvdName || query.cnt('.dvdTitle'); + release.director = query.el('.directedBy a', 'title'); + + release.actors = data?.dvdActors.map((actor) => ({ name: actor.actorName, entryId: actor.actorId })) + || query.all('.actorCarousel a[href*="/pornstar"]').map((actorEl) => ({ + entryId: query.url(actorEl, null).match(/\/(\d+)/)?.[1], + name: query.cnt(actorEl, 'span'), + href: query.url(actorEl, null, 'href', { origin: entity.url }), + avatar: getAvatarFallbacks(query.img(actorEl)), + })); - release.actors = data.dvdActors.map((actor) => ({ name: actor.actorName, entryId: actor.actorId })); release.tags = query.cnts('.dvdCol a'); - release.scenes = scrapeAll(qu.initAll(el, 'div[data-itemtype*=scene], li[data-itemtype*=scene]'), entity, entity.url); if (options.includeTrailers) { @@ -510,7 +531,7 @@ async function fetchActorReleases(profileUrl, getActorReleasesUrl, page = 1, acc } async function scrapeProfile({ query }, url, actorName, _siteSlug, getActorReleasesUrl, withReleases, context) { - const avatar = query.el('img.actorPicture'); + const avatar = query.img('img.actorPicture'); const hair = query.cnt('.actorProfile .attribute_hair_color'); const height = query.cnt('.actorProfile .attribute_height'); const weight = query.cnt('.actorProfile .attribute_weight'); @@ -523,12 +544,7 @@ async function scrapeProfile({ query }, url, actorName, _siteSlug, getActorRelea if (avatar) { // larger sizes usually available, provide fallbacks - const avatars = [ - avatar.src.replace(/\d+x\d+/, '500x750'), - avatar.src.replace(/\d+x\d+/, '240x360'), - avatar.src.replace(/\d+x\d+/, '200x300'), - avatar.src, - ]; + const avatars = getAvatarFallbacks(avatar); profile.avatar = avatars; }