interface DiscoveredCandidate

One work a listing offered.

Properties

source: string

This work's source URL, already normalised through this plugin's own canonicalizeSource so the host's duplicate check is a plain comparison. An un-normalised value silently fails to match an identical work already held, with nothing reporting the mismatch.

optional
title: string | Record<string, string>

The work's title, by language. Keys are language tags ("ja", "en", …) plus "origin" for the title as the source itself writes it.

A map rather than one string because the same work legitimately has several titles, and a reader of Japanese wants a different one from a reader of English. Naming the languages in the contract (title_jpn and friends) would mean changing it again for the next source, so the source decides which keys it can fill.

A bare string is still accepted and read as { origin: "..." }.

optional
posted_at: string | number | Date

When the source published it, as the listing states it.

May be a date string ("YYYY-MM-DD HH:MM", RFC 3339, ...), a numeric string, Unix seconds, a JavaScript millisecond timestamp, or a Date. The dispatcher normalises numeric values and Date objects to a Unix-seconds string before the host receives them; date strings are parsed host-side. Declaring it here is what lets the host offer "published more than N hours ago" as a filter on any source carrying a date, rather than on the ones it was taught about individually. Omit it rather than guessing: a wrong value silently holds a work back, or releases one early.

optional
rating: number

0–5. Absent means not yet rated, which is not the same as rated zero — a work published minutes ago usually has no rating at all, and the host treats the two differently rather than judging it at the moment the answer is least knowable.

optional
tags: string[]

Namespaced as the source writes them (artist:foo), not stripped — the host's tag rules compare against these verbatim.

optional
category: string

The source's own classification ("Doujinshi", "Manga"), for the excluded-category rule.

optional
uploader: string

Who posted it — what a creator-scoped subscription matches on.

optional
pages: number

Length, so the host can show and filter on download cost before anything is spent.

Usage

import { type DiscoveredCandidate } from "crates/lanrurugi-plugin/dispatcher/plugin-sdk.ts";