what-to-play
Version:
Score aggregator for lists of games
88 lines • 3.64 kB
JavaScript
;
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