Better and cleaner game search
parent
63a7a9a3a0
commit
d24593a04a
|
@ -13,7 +13,8 @@ module.exports = Object.freeze({
|
||||||
ONLY_GAMES_THREAD_OPTION: 'select[name="nodes[]"] > option[value="2"]',
|
ONLY_GAMES_THREAD_OPTION: 'select[name="nodes[]"] > option[value="2"]',
|
||||||
PASSWORD_INPUT: 'input[name="password"]',
|
PASSWORD_INPUT: 'input[name="password"]',
|
||||||
SEARCH_BUTTON: "form.block > * button.button--icon--search",
|
SEARCH_BUTTON: "form.block > * button.button--icon--search",
|
||||||
SEARCH_FORM_TEXTBOX: 'input[name="keywords"]',
|
SEARCH_FORM_TEXTBOX: 'input[name="keywords"][type="search"]',
|
||||||
|
SEARCH_ONLY_GAMES_OPTION: 'select[name="c[nodes][]"] > option[value="1"]',
|
||||||
STATUS_ID_SELECTOR: 'div[id^="btn-prefix_4_"]>span',
|
STATUS_ID_SELECTOR: 'div[id^="btn-prefix_4_"]>span',
|
||||||
THREAD_POSTS:
|
THREAD_POSTS:
|
||||||
"article.message-body:first-child > div.bbWrapper:first-of-type",
|
"article.message-body:first-child > div.bbWrapper:first-of-type",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
module.exports = Object.freeze({
|
module.exports = Object.freeze({
|
||||||
F95_BASE_URL: "https://f95zone.to",
|
F95_BASE_URL: "https://f95zone.to",
|
||||||
F95_SEARCH_URL: "https://f95zone.to/search",
|
F95_SEARCH_URL: "https://f95zone.to/search/?type=post",
|
||||||
F95_LATEST_UPDATES: "https://f95zone.to/latest",
|
F95_LATEST_UPDATES: "https://f95zone.to/latest",
|
||||||
F95_LOGIN_URL: "https://f95zone.to/login",
|
F95_LOGIN_URL: "https://f95zone.to/login",
|
||||||
F95_WATCHED_THREADS: "https://f95zone.to/watched/threads",
|
F95_WATCHED_THREADS: "https://f95zone.to/watched/threads",
|
||||||
|
|
|
@ -25,9 +25,9 @@ module.exports.getGameInfo = async function (browser, url) {
|
||||||
|
|
||||||
// Verify the correctness of the URL
|
// Verify the correctness of the URL
|
||||||
const exists = await urlHelper.urlExists(url);
|
const exists = await urlHelper.urlExists(url);
|
||||||
if (!exists) throw new URIError(url + " is not a valid URL");
|
if (!exists) throw new URIError(`${url} is not a valid URL`);
|
||||||
if (!urlHelper.isF95URL(url))
|
if (!urlHelper.isF95URL(url))
|
||||||
throw new Error(url + " is not a valid F95Zone URL");
|
throw new Error(`${url} is not a valid F95Zone URL`);
|
||||||
|
|
||||||
const page = await preparePage(browser); // Set new isolated page
|
const page = await preparePage(browser); // Set new isolated page
|
||||||
await page.setCookie(...shared.cookies); // Set cookies to avoid login
|
await page.setCookie(...shared.cookies); // Set cookies to avoid login
|
||||||
|
@ -45,7 +45,6 @@ module.exports.getGameInfo = async function (browser, url) {
|
||||||
info = await parsePrefixes(page, info); // Fill status/engines/isMod
|
info = await parsePrefixes(page, info); // Fill status/engines/isMod
|
||||||
const structuredText = await getMainPostStructuredText(page);
|
const structuredText = await getMainPostStructuredText(page);
|
||||||
const overview = getOverview(structuredText, info.isMod);
|
const overview = getOverview(structuredText, info.isMod);
|
||||||
|
|
||||||
const parsedInfos = parseConversationPage(structuredText);
|
const parsedInfos = parseConversationPage(structuredText);
|
||||||
const previewSource = getGamePreviewSource(page);
|
const previewSource = getGamePreviewSource(page);
|
||||||
const changelog = getLastChangelog(page);
|
const changelog = getLastChangelog(page);
|
||||||
|
@ -283,10 +282,8 @@ async function getGameTags(page) {
|
||||||
* @returns {Promise<GameInfo>} GameInfo object passed in to which the identified information has been added
|
* @returns {Promise<GameInfo>} GameInfo object passed in to which the identified information has been added
|
||||||
*/
|
*/
|
||||||
async function parsePrefixes(page, info) {
|
async function parsePrefixes(page, info) {
|
||||||
const MOD_PREFIX = "MOD";
|
|
||||||
|
|
||||||
// The 'Ongoing' status is not specified, only 'Abandoned'/'OnHold'/'Complete'
|
// The 'Ongoing' status is not specified, only 'Abandoned'/'OnHold'/'Complete'
|
||||||
info.status = "Ongoing";
|
info.status = "ONGOING";
|
||||||
for (const handle of await page.$$(selectorK.GAME_TITLE_PREFIXES)) {
|
for (const handle of await page.$$(selectorK.GAME_TITLE_PREFIXES)) {
|
||||||
const value = await page.evaluate(
|
const value = await page.evaluate(
|
||||||
/* istanbul ignore next */
|
/* istanbul ignore next */
|
||||||
|
@ -298,10 +295,10 @@ async function parsePrefixes(page, info) {
|
||||||
const prefix = value.toUpperCase().replace("[", "").replace("]", "").trim();
|
const prefix = value.toUpperCase().replace("[", "").replace("]", "").trim();
|
||||||
|
|
||||||
// Getting infos...
|
// Getting infos...
|
||||||
if (shared.statuses.includes(prefix)) info.status = capitalize(prefix);
|
if (shared.statuses.includes(prefix)) info.status = prefix;
|
||||||
else if (shared.engines.includes(prefix)) info.engine = capitalize(prefix);
|
else if (shared.engines.includes(prefix)) info.engine = prefix;
|
||||||
// This is not a game but a mod
|
// This is not a game but a mod
|
||||||
else if (prefix === MOD_PREFIX) info.isMod = true;
|
else if (prefix === "MOD" || prefix === "CHEAT MOD") info.isMod = true;
|
||||||
}
|
}
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
@ -467,11 +464,4 @@ function extractGameHostingData(platform, text) {
|
||||||
return downloadData;
|
return downloadData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Capitalize a string
|
|
||||||
* @param {String} string
|
|
||||||
*/
|
|
||||||
function capitalize(string) {
|
|
||||||
return string.toLowerCase().charAt(0).toUpperCase() + string.slice(1);
|
|
||||||
}
|
|
||||||
//#endregion Private methods
|
//#endregion Private methods
|
||||||
|
|
|
@ -18,7 +18,7 @@ const { isF95URL } = require("./url-helper.js");
|
||||||
* @returns {Promise<String[]>} List of URL of possible games obtained from the preliminary research on the F95 portal
|
* @returns {Promise<String[]>} List of URL of possible games obtained from the preliminary research on the F95 portal
|
||||||
*/
|
*/
|
||||||
module.exports.getSearchGameResults = async function (browser, gamename) {
|
module.exports.getSearchGameResults = async function (browser, gamename) {
|
||||||
shared.logger.info("Searching " + gamename + " on F95Zone");
|
shared.logger.info(`Searching ${gamename} on F95Zone`);
|
||||||
|
|
||||||
const page = await preparePage(browser); // Set new isolated page
|
const page = await preparePage(browser); // Set new isolated page
|
||||||
await page.setCookie(...shared.cookies); // Set cookies to avoid login
|
await page.setCookie(...shared.cookies); // Set cookies to avoid login
|
||||||
|
@ -30,11 +30,13 @@ module.exports.getSearchGameResults = async function (browser, gamename) {
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
page.waitForSelector(selectorK.SEARCH_FORM_TEXTBOX),
|
page.waitForSelector(selectorK.SEARCH_FORM_TEXTBOX),
|
||||||
page.waitForSelector(selectorK.TITLE_ONLY_CHECKBOX),
|
page.waitForSelector(selectorK.TITLE_ONLY_CHECKBOX),
|
||||||
|
page.waitForSelector(selectorK.SEARCH_ONLY_GAMES_OPTION),
|
||||||
page.waitForSelector(selectorK.SEARCH_BUTTON),
|
page.waitForSelector(selectorK.SEARCH_BUTTON),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await page.type(selectorK.SEARCH_FORM_TEXTBOX, gamename); // Type the game we desire
|
await page.type(selectorK.SEARCH_FORM_TEXTBOX, gamename); // Type the game we desire
|
||||||
await page.click(selectorK.TITLE_ONLY_CHECKBOX); // Select only the thread with the game in the titles
|
await page.click(selectorK.TITLE_ONLY_CHECKBOX); // Select only the thread with the game in the titles
|
||||||
|
await page.click(selectorK.SEARCH_ONLY_GAMES_OPTION); // Search only games and mod
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
page.click(selectorK.SEARCH_BUTTON), // Execute search
|
page.click(selectorK.SEARCH_BUTTON), // Execute search
|
||||||
page.waitForNavigation({
|
page.waitForNavigation({
|
||||||
|
@ -52,7 +54,7 @@ module.exports.getSearchGameResults = async function (browser, gamename) {
|
||||||
const gameUrl = await getOnlyGameThreads(page, element);
|
const gameUrl = await getOnlyGameThreads(page, element);
|
||||||
if (gameUrl !== null) results.push(gameUrl);
|
if (gameUrl !== null) results.push(gameUrl);
|
||||||
}
|
}
|
||||||
shared.logger.info("Find " + results.length + " conversations");
|
shared.logger.info(`Find ${results.length} conversations`);
|
||||||
await page.close(); // Close the page
|
await page.close(); // Close the page
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
|
|
|
@ -1,25 +1,15 @@
|
||||||
const {
|
const F95API = require("../app/index.js");
|
||||||
debug,
|
|
||||||
login,
|
|
||||||
getGameData,
|
|
||||||
loadF95BaseData,
|
|
||||||
getUserData,
|
|
||||||
logout,
|
|
||||||
} = require("../app/index.js");
|
|
||||||
|
|
||||||
debug(true);
|
F95API.debug(true);
|
||||||
main();
|
main();
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
const loginResult = await login("MillenniumEarl", "f9vTcRNuvxj4YpK");
|
const loginResult = await F95API.login("MillenniumEarl", "f9vTcRNuvxj4YpK");
|
||||||
|
|
||||||
if (loginResult.success) {
|
if (loginResult.success) {
|
||||||
await loadF95BaseData();
|
await F95API.loadF95BaseData();
|
||||||
const gameData = await getGameData("kingdom of deception", false);
|
const gameData = await F95API.getGameData("a struggle with sin", false);
|
||||||
console.log(gameData);
|
console.log(gameData);
|
||||||
|
|
||||||
// let userData = await getUserData();
|
|
||||||
// console.log(userData);
|
|
||||||
}
|
}
|
||||||
logout();
|
F95API.logout();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue