Jellyfin treats a rating string it cannot parse the same as no rating at all: the item takes the unrated path and stays visible to every profile, including one with an age ceiling set. This library carried eighteen such items. Six were Singapore adult ratings (M18, NC16, R21) that no age ceiling would have caught, and two (TP, L) mean "all ages" and were being withheld from children for the opposite reason. The task remaps those strings to their US equivalents using published board equivalences, and locks the repaired value against provider refresh. Ratings are never inferred from genre or synopsis; an unmapped string is reported as a warning instead. A wrong guess there fails open, which is the one outcome parental controls exist to prevent. The audience tag backs a per-user Allowed Tags whitelist. That check fails closed, so new content is invisible to the filtered account until it is tagged, which is why the work has to recur rather than run once. A ledger records every id the task has tagged; an id present in the ledger but no longer carrying the tag was untagged deliberately and is never tagged again. Running in-process as a scheduled task means no API key, no credential file and no container. It also sidesteps three defects in the 12.0 REST item-update path, which assigns Name, Overview, ProductionYear, OfficialRating and CustomRating unconditionally, silently unlocks an item when LockData is omitted, and rejects its own serialized Trickplay block on the way back in.
1.8 KiB
Changelog
All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.0 - 2026-09-19
Added
-
Rating repair. A rating string Jellyfin cannot parse is not merely untidy: it takes the same code path as "unrated", which stays visible to every profile including one with an age ceiling set. Foreign board ratings are remapped to their documented US equivalents (GP to PG, TP and L to TV-G, B to TV-PG, B-15 and VM14 and M to TV-14, NC16 and M18 and R21 to TV-MA, Passed to Approved, and the plain typo PG13 to PG-13). The repaired value is added to the item's locked fields so a later provider refresh cannot undo it.
-
Ratings are never inferred from genre, synopsis or any other content signal. A wrong guess fails open, which is the single failure mode parental controls exist to prevent. Anything unmappable is reported as a warning for a human to map, and left alone.
-
Audience tagging. Applies a configurable tag (default
grandma) to titles that pass a genre and rating rule, so a user account can be narrowed with Allowed Tags. Because Allowed Tags fails closed, new content is invisible to that account until tagged, which is why this runs on a schedule rather than once. -
A curation ledger at
tagged-ids.txtin the plugin data folder. An item whose id is in the ledger but which no longer carries the tag was untagged by a person on purpose, and is never tagged again. Without it every run would silently undo manual curation. -
Runs as a Jellyfin scheduled task, daily at 05:00 by default, configurable from the Scheduled Tasks screen.