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