UNPKG

what-to-play

Version:

Score aggregator for lists of games

88 lines 3.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getData = void 0; const cheerio = require("cheerio"); const node_fetch_1 = require("node-fetch"); const querystring = require("querystring"); const platform_1 = require("./platform"); const search_1 = require("./search"); const util_1 = require("./util"); function absoluteUrl(relativeUrl) { return "https://www.metacritic.com" + relativeUrl; } async function getData(game, platforms) { const productData = await search(game); if (productData === undefined) return undefined; const { name, reviewUrl } = productData; // get metascores from product page const reviewPageText = await (0, node_fetch_1.default)(reviewUrl).then(res => res.text()); const $ = cheerio.load(reviewPageText); let metascoreMax; let bestMetascore; for (const scoreElem of $(".c-gamePlatformsSection_list .c-gamePlatformTile")) { const $scoreElem = $(scoreElem); const platform = (0, platform_1.toPlatform)($scoreElem.find("title").first().text().trim()); // only look at scores for platforms the user has asked for if (!platform || !platforms.includes(platform)) { continue; } const metascore = parseInt($scoreElem.find(".c-siteReviewScore").text().trim()); const score = { platform, metascore, url: $scoreElem.attr("href") }; // undefined compared (> or <) with undefined or with a number // always results in false if (metascore > metascoreMax || metascoreMax === undefined) { metascoreMax = metascore; bestMetascore = score; } } const $userScore = $(".c-productScoreInfo .c-productScoreInfo_scoreContent .c-productScoreInfo_scoreNumber .c-siteReviewScore_background-user"); const userscore = parseInt($userScore.text().trim()); let releaseDate; for (const elem of $(".c-productHero_score-container").find(".g-text-bold")) { const $elem = $(elem); if ($elem.text().trim() === "Released On:") { releaseDate = $elem.siblings("span").first().text().trim(); } } return { name, url: reviewUrl, metascore: bestMetascore === null || bestMetascore === void 0 ? void 0 : bestMetascore.metascore, userscore, releaseDate: releaseDate !== null && releaseDate !== void 0 ? releaseDate : "", metascoreUrl: bestMetascore === null || bestMetascore === void 0 ? void 0 : bestMetascore.url, userscoreUrl: reviewUrl, }; } exports.getData = getData; async function search(game) { const gameStr = querystring.escape(game); const searchUrl = `https://www.metacritic.com/search/${encodeURI(gameStr)}?category=13`; const searchPageText = await (0, node_fetch_1.default)(searchUrl).then(res => res.text()); const searchPage = cheerio.load(searchPageText); const searchResults = searchPage(".c-pageSiteSearch-results") .find(".c-pageSiteSearch-results-item") .toArray() .map(searchPage); const getNameForResult = (result) => result.find("p").first().text().trim(); const bestResult = (0, search_1.closestSearchResult)(game, searchResults, getNameForResult); if (!bestResult) return undefined; const name = getNameForResult(bestResult); const href = bestResult.attr("href"); if (!href) (0, util_1.bug)(); const reviewUrl = absoluteUrl(href); if (!reviewUrl) (0, util_1.bug)(); return { name, reviewUrl, }; } //# sourceMappingURL=metacritic.js.map