One work a listing offered.
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.
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: "..." }.
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.
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.
tags: string[]
Namespaced as the source writes them (artist:foo), not stripped — the host's tag rules compare
against these verbatim.
category: string
The source's own classification ("Doujinshi", "Manga"), for the excluded-category rule.
uploader: string
Who posted it — what a creator-scoped subscription matches on.
pages: number
Length, so the host can show and filter on download cost before anything is spent.