Add scripts used for fetching URLs based on query type
parent
8cb92ebd3c
commit
973318706c
|
@ -0,0 +1,41 @@
|
|||
"use strict";
|
||||
|
||||
// Modules from file
|
||||
import HandiworkSearchQuery from "../classes/query/handiwork-search-query";
|
||||
import LatestSearchQuery from "../classes/query/latest-search-query";
|
||||
import ThreadSearchQuery from "../classes/query/thread-search-query";
|
||||
import fetchLatestHandiworkURLs from "./fetch-latest.js";
|
||||
import fetchThreadHandiworkURLs from "./fetch-thread.js";
|
||||
|
||||
/**
|
||||
* Gets the URLs of the handiworks that match the passed parameters.
|
||||
* You *must* be logged.
|
||||
* @param {LatestSearchQuery} query
|
||||
* Query used for the search
|
||||
* @param {Number} limit
|
||||
* Maximum number of items to get. Default: 30
|
||||
* @returns {Promise<String[]>} URLs of the handiworks
|
||||
*/
|
||||
export default async function fetchHandiworkURLs(query: HandiworkSearchQuery, limit: number = 30): Promise<string[]> {
|
||||
// Local variables
|
||||
let urls: string[] = null;
|
||||
const searchType = query.selectSearchType();
|
||||
|
||||
// Convert the query
|
||||
if (searchType === "latest") {
|
||||
// Cast the query
|
||||
const castedQuery = query.cast<LatestSearchQuery>();
|
||||
|
||||
// Fetch the urls
|
||||
urls = await fetchLatestHandiworkURLs(castedQuery, limit);
|
||||
}
|
||||
else {
|
||||
// Cast the query
|
||||
const castedQuery = query.cast<ThreadSearchQuery>();
|
||||
|
||||
// Fetch the urls
|
||||
urls = await fetchThreadHandiworkURLs(castedQuery, limit);
|
||||
}
|
||||
|
||||
return urls;
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
"use strict";
|
||||
|
||||
// Modules from files
|
||||
import fetchHandiworkURLs from "./fetch-handiwork.js";
|
||||
import fetchLatestHandiworkURLs from "./fetch-latest.js";
|
||||
import fetchThreadHandiworkURLs from "./fetch-thread.js";
|
||||
import HandiworkSearchQuery from "../classes/query/handiwork-search-query.js";
|
||||
import LatestSearchQuery from "../classes/query/latest-search-query.js";
|
||||
import ThreadSearchQuery from "../classes/query/thread-search-query.js";
|
||||
|
||||
//#region Public methods
|
||||
export default async function executeQuery(query: LatestSearchQuery, limit: number): Promise<string[]>
|
||||
|
||||
export default async function executeQuery(query: ThreadSearchQuery, limit: number): Promise<string[]>
|
||||
|
||||
export default async function executeQuery(query: HandiworkSearchQuery, limit: number): Promise<string[]>
|
||||
|
||||
/**
|
||||
* @param query Query used for the search
|
||||
* @param limit Maximum number of items to get. Default: 30
|
||||
* @returns URLs of the fetched games
|
||||
*/
|
||||
export default async function executeQuery(query: any, limit: number = 30): Promise<string[]> {
|
||||
// Local variables
|
||||
const searchMap = {
|
||||
"latest": fetchLatestHandiworkURLs,
|
||||
"thread": fetchThreadHandiworkURLs,
|
||||
"handiwork": fetchHandiworkURLs,
|
||||
}
|
||||
|
||||
// Find the key for the mapping dict
|
||||
const key = query instanceof LatestSearchQuery ?
|
||||
"latest" :
|
||||
(query instanceof ThreadSearchQuery ?
|
||||
"thread" :
|
||||
"handiwork");
|
||||
|
||||
// Fetch and return the urls
|
||||
return await searchMap[key](query, limit);
|
||||
}
|
||||
//#endregion
|
|
@ -0,0 +1,75 @@
|
|||
"use strict";
|
||||
|
||||
// Public modules from npm
|
||||
import cheerio from "cheerio";
|
||||
|
||||
// Modules from file
|
||||
import { fetchHTML } from "../network-helper.js";
|
||||
import shared from "../shared.js";
|
||||
import { selectors as f95Selector } from "../constants/css-selector.js";
|
||||
import { urls as f95urls } from "../constants/url.js";
|
||||
import ThreadSearchQuery from "../classes/query/thread-search-query.js";
|
||||
|
||||
//#region Public methods
|
||||
/**
|
||||
* Gets the URLs of the handiwork' threads that match the passed parameters.
|
||||
* You *must* be logged.
|
||||
* @param {ThreadSearchQuery} query
|
||||
* Query used for the search
|
||||
* @param {number} limit
|
||||
* Maximum number of items to get. Default: 30
|
||||
* @returns {Promise<String[]>} URLs of the handiworks
|
||||
*/
|
||||
export default async function fetchThreadHandiworkURLs(query: ThreadSearchQuery, limit:number = 30): Promise<string[]> {
|
||||
// Get the query
|
||||
const url = query.createURL().toString();
|
||||
|
||||
// Fetch the results from F95 and return the handiwork urls
|
||||
return await fetchResultURLs(url, limit);
|
||||
}
|
||||
|
||||
//#endregion Public methods
|
||||
|
||||
//#region Private methods
|
||||
/**
|
||||
* Gets the URLs of the threads resulting from the F95Zone search.
|
||||
* @param {number} limit
|
||||
* Maximum number of items to get. Default: 30
|
||||
* @return {Promise<String[]>} List of URLs
|
||||
*/
|
||||
async function fetchResultURLs(url: string, limit: number = 30): Promise<string[]> {
|
||||
shared.logger.trace(`Fetching ${url}...`);
|
||||
|
||||
// Fetch HTML and prepare Cheerio
|
||||
const html = await fetchHTML(url);
|
||||
const $ = cheerio.load(html);
|
||||
|
||||
// Here we get all the DIV that are the body of the various query results
|
||||
const results = $("body").find(f95Selector.GS_RESULT_BODY);
|
||||
|
||||
// Than we extract the URLs
|
||||
const urls = results.slice(0, limit).map((idx, el) => {
|
||||
const elementSelector = $(el);
|
||||
return extractLinkFromResult(elementSelector);
|
||||
}).get();
|
||||
|
||||
return urls;
|
||||
}
|
||||
|
||||
/**
|
||||
* Look for the URL to the thread referenced by the item.
|
||||
* @param {cheerio.Cheerio} selector Element to search
|
||||
* @returns {String} URL to thread
|
||||
*/
|
||||
function extractLinkFromResult(selector: cheerio.Cheerio): string {
|
||||
shared.logger.trace("Extracting thread link from result...");
|
||||
|
||||
const partialLink = selector
|
||||
.find(f95Selector.GS_RESULT_THREAD_TITLE)
|
||||
.attr("href")
|
||||
.trim();
|
||||
|
||||
// Compose and return the URL
|
||||
return new URL(partialLink, f95urls.F95_BASE_URL).toString();
|
||||
}
|
||||
//#endregion Private methods
|
Loading…
Reference in New Issue