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

    Main entry point coordinating cache checking, AniList API search with pagination, result ranking/filtering, fallback sources (Comick, MangaDex), and confidence scoring.

    Note: Custom accept rules only apply when kenmeiManga context is provided (automatic matching flows). Manual searches that do not provide kenmeiManga will not have accept rules applied, only skip rules are skipped (they don't apply to manual searches). This is by design: accept rules require Kenmei context to evaluate properly.

    Parameters

    • title: string

      Manga title to search for

    • Optionaltoken: string

      Optional authentication token

    • config: Partial<SearchServiceConfig> = {}

      Optional search service configuration

    • OptionalabortSignal: AbortSignal

      Optional abort signal to cancel search

    • OptionalspecificPage: number

      Optional specific page number (disables pagination)

    • OptionalkenmeiManga: KenmeiManga

      Optional Kenmei manga context for custom rule evaluation

    Returns Promise<MangaSearchResponse>

    Promise resolving to manga search response with matches

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

    // Check cache first
    const cachedResult = handleCacheCheck(
    title,
    cacheKey,
    kenmeiManga,
    searchConfig.bypassCache ?? false,
    );
    if (cachedResult) {
    return cachedResult;
    }

    if (searchConfig.exactMatchingOnly) {
    console.debug(
    `[MangaSearchService] 🔍 MANUAL SEARCH: Ensuring exact matching is correctly configured`,
    );
    searchConfig.exactMatchingOnly = true;
    }

    // Execute the search
    const { filteredResults, lastPageInfo } = await executeAndProcessSearch(
    title,
    searchConfig,
    token,
    abortSignal,
    specificPage,
    kenmeiManga,
    );

    // Extra searches logic
    const extraResults = await performExtraSearches(
    title,
    searchConfig,
    token,
    abortSignal,
    specificPage,
    kenmeiManga,
    filteredResults,
    );

    // Handle fallback sources
    const { finalResults, comickSourceMap, mangaDexSourceMap } =
    await handleFallbackSources(extraResults, title, token, searchConfig);

    storeFallbackSourceMetadata(
    title,
    comickSourceMap,
    mangaDexSourceMap,
    searchConfig,
    );

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