v0.0.7
Changelog
MatchMedia v0.0.7
match.prefer.animeis a typed-job auto-match hint only. Untyped scan/ingest never prefer, andjob.candidatesis always the full ranked list.- Displayed Score is scaled into
[0, 1]:(J + title_lift · max(func, parentCov) + exact_lift · exact) / (1 + title_lift + exact_lift). Title-in-synopsis no longer fills Score to1.0. - Auto-match adds a Score-leader path and a unique full-query-coverage path (nicknames and long official titles).
solo_min_scoreis ignored. - Alias GETs run when any job title token is missing from the primary name (
Spy×FamilyloadsSpy x Family). - When Jaccard is already
1, synopsis/parent lift is omitted so identical titles are not reordered by a blurb ([Oshi no Ko]anime vs live action). - HTTP routes ServeMedia pins (
POST /v1/scan, untypedPOST /v1/ingest, pollGET /v1/jobs?session=) andskipDefer(Jaccard) are unchanged. - The release tarball is still binary,
config/,public/, andLICENSE.
Prefer
prefer.anime(language: Japanese,kind: Animation) runs only whenjob.typeis a key undermatch.prefer(ingesttype: anime).- Rank always scores every provider hit. Prefer never deletes rows, so
selectcan still pick a Scripted TVMaze title next to a Japanese Animation hit (The 100 vs The 100 Girlfriends). - Jikan still ships static
attrs: { language: Japanese, kind: Animation }so typed anime prefer can see those hits. - A single prefer-shaped hit does not auto-match.
Ranking
Score is no longer J + (1 − J) · plot. After the same titleNorm (lowercase, strip non-alnum, no stemming):
- Jaccard
Jis still the best|q ∩ t| / |q ∪ t|over the primary title and eachtitle*attr. - Title-in-synopsis
funcis coverage of job title content tokens in the candidate synopsis (not plot-to-plot). Shared tokens in this result list are down-weighted (0.25). exactis1whentitleNormof the job equalstitleNormof the primary title (aliases do not count).- Shipped
title_lift/exact_liftare0.15/0.25. Divide by1 + title_lift + exact_liftso Score stays in[0, 1]without clamping. - When
J == 1,funcandparentCovare not added. Primary exact is(1 + exact_lift) / den(~0.89), not1.0from a synopsis token.
Sort is unchanged: content-token overlap, then Score, then title prefix, then Jaccard, then year.
Auto-match
job.candidates stays the full list. Auto-matched if:
- best
max(Jaccard, Score) >= match.min_scoreand (one candidate, or that strength gap to second is>= match.min_margin), or - best Score
>= match.min_scoreand the Score gap to second is>= match.min_margin, or - typed prefer, at least two prefer hits, best of those has
queryCov == 1, and the Score gap to the next prefer hit is>= match.min_margin, or - the job has a content token and exactly one work has
queryCov == 1and that row is ranked first.
Path 4 is for short nicknames (Anohana) and solo official titles with extra words (Apothecary Diaries, Berserk Memorial Edition). Provider clones that share the covering title (best-Jaccard primary/alias) and year count as one work (TVMaze + Jikan Banished). Season 2 or The Office US/UK stay manual. Girls vs Girls und Panzer still two works.
defer: true providers still run only if the fast pass is thin (fewer than match.min_hits or best Jaccard below match.min_score). A Jaccard auto-match on the fast pass skips defer. Unique queryCov is applied on the final ranked list so a weak TVMaze substring does not lock in before Jikan.
Aliases
- Skip the extra
titlesGET only when the primary title already covers every job title token, not only content tokens (plot_stop/ length < 3). - Stored aliases still must share a content token. Bookworm / Erased subset skips are unchanged.
Spy X Familyvs TVMazeSpy×Familynow fetches AKASpy x Family, so Jaccard can be1via the alias.
Config
version:is0.0.7.- New tunables:
match.title_lift(shipped0.15),match.exact_lift(shipped0.25). Unset still defaults to those values. match.solo_min_scoreis removed from shipped YAML and ignored if an overlay still has it.- Leave
match.min_score/min_margin/match.workers, cooldown YAML, and providerdefer/min_interval_ms/provider_timeout_msas shipped in 0.0.6.
Upgrade notes
- HTTP contract is unchanged. Rematch existing sessions if you want the new Score, prefer-not-filtering, and unique
queryCovon old jobs (ranker: setis the same key; Score numbers are not). - Overlay
data/config.yamlmust not rely on prefer deleting non-anime rows, or on Score1.0from title-in-synopsis. Dropsolo_min_scoreif present. - Scan jobs still have empty
type. Western TV + anime-shaped hits stay on the same picker (The 100). Typed CSVtype: animestill uses prefer for auto-match only. - Exact primary titles display ~0.89, not
1.0. Auto-match still usesmax(Jaccard, Score), so Jaccard1still matches. - Unique
queryCovcan auto-match a unique official title belowmin_score. Two seasons or two years of the same covering title staymanual.