• Search for manga by title with rate limiting and caching.

    Parameters

    • title: string

      The manga title to search for.

    • Optionaltoken: string

      Optional authentication token.

    • config: Partial<SearchServiceConfig> = {}

      Optional search service configuration.

    • OptionalabortSignal: AbortSignal

      Optional abort signal to cancel the search.

    • OptionalspecificPage: number

    Returns Promise<MangaSearchResponse>

    A promise resolving to an array of MangaMatch objects.

    export async function searchMangaByTitle(
    title: string,
    token?: string,
    config: Partial<SearchServiceConfig> = {},
    abortSignal?: AbortSignal,
    specificPage?: number,
    ): Promise<MangaSearchResponse> {
    const searchConfig = { ...DEFAULT_SEARCH_CONFIG, ...config };
    const cacheKey = generateCacheKey(title);

    // Handle cache operations
    if (searchConfig.bypassCache && cacheKey) {
    handleCacheBypass(title, cacheKey);
    } else if (!searchConfig.bypassCache) {
    const cachedResult = processCachedResults(title, cacheKey);
    if (cachedResult) {
    return cachedResult;
    }
    } else if (searchConfig.exactMatchingOnly) {
    console.log(
    `🔍 MANUAL SEARCH: Ensuring exact matching is correctly configured`,
    );
    searchConfig.exactMatchingOnly = true;
    }

    // Execute the search
    const searchQuery = title;
    await acquireRateLimit();

    const { results, lastPageInfo } = await executeSearchLoop(
    searchQuery,
    searchConfig,
    token,
    abortSignal,
    specificPage,
    );

    // Process and filter results
    const rankedResults = processSearchResults(results, title, searchConfig);
    let filteredResults = applyContentFiltering(
    rankedResults,
    title,
    searchConfig,
    );
    filteredResults = handleNoResultsFallback(
    filteredResults,
    results,
    searchConfig,
    );

    // Handle Comick fallback if needed
    const { results: finalResults, comickSourceMap } =
    await executeComickFallback(title, token, filteredResults, searchConfig);

    // Build and return final response
    return buildFinalResponse(finalResults, title, comickSourceMap, lastPageInfo);
    }