feat: prioritise and blacklist media and overview in setting page of progress in adding info
🏗️ Build Plugin / build (push) Successful in 1m16s
Latest Release / latest-release (push) Successful in 27s
🧪 Test Plugin / test (push) Successful in 20s
🚀 Release Plugin / build-and-release (push) Successful in 24s

This commit is contained in:
2026-07-04 21:08:59 +02:00
parent bb02c0f9b9
commit f6762fcf29
17 changed files with 1211 additions and 16 deletions
+37 -4
View File
@@ -37,6 +37,11 @@ Then install "JRay" from the plugin catalog and restart Jellyfin.
- **Work discovery API** — a remote worker can poll for a random batch of library
items that still need processing, so the backlog spreads naturally across
workers without server-side task tracking.
- **Prioritise / ignore rules** — steer that backlog by genre, series, or
individual item: ignore what you never want extracted (e.g. anime), or push a
series to the front of the queue.
- **Coverage overview** — see at a glance how much of your library has actor
data, broken down by genre and by media type (film vs TV).
- **Extensible "context at time t" envelope** — the per-timestamp response is
designed to grow (locations, trivia, …) without breaking existing clients.
- **In-memory caching** — loaded truth files are cached with a configurable TTL.
@@ -107,7 +112,12 @@ the `X-Emby-Token: <token>` header or `Authorization: MediaBrowser Token="<token
| `GET /Items/{itemId}/Timeline` | user | Full truth file for an item, or `404` if none. |
| `PUT /Items/{itemId}/Truth` | admin | Push managed truth data (schema v1). `204` on success, `400` on bad schema. |
| `DELETE /Items/{itemId}/Truth` | admin | Remove managed truth data (idempotent, `204`). Falls back to sidecar. |
| `GET /Tasks/Pending?limit=10` | admin | Random sample of items still needing truth data (default 10, max 100). |
| `GET /Tasks/Pending?limit=10` | admin | Random sample of items still needing truth data (default 10, max 100); honours prioritise/ignore rules. |
| `GET /Policy/Rules` | admin | List prioritise/ignore rules. |
| `PUT /Policy/Rules` | admin | Add or replace a rule. `204`, or `400` if `value` is empty. |
| `DELETE /Policy/Rules?scope=&value=` | admin | Remove a rule (idempotent, `204`). |
| `GET /Coverage` | admin | Library coverage totals, plus breakdowns by media type and genre. |
| `GET /Coverage/Genres` \| `/Series` \| `/Items?search=` | admin | Option lists for the config page's rule editor. |
| `GET /ClientScript` | anon | The pause-overlay script injected into the web client. |
- **user** — any authenticated Jellyfin user token.
@@ -225,6 +235,21 @@ Configure JRay in Jellyfin Dashboard → Plugins → JRay:
client's `index.html`. Disabling it removes any previously injected script
(default `on`).
The config page also shows a **coverage overview** (how much of your library has
actor data, by genre and media type) and a **prioritise / ignore rules** editor.
Rules steer the work-discovery API (`/Tasks/Pending`) only — they don't affect
the overlay or read endpoints:
- **Ignore** — matching items are never offered to extraction workers. Use it to
skip content you don't want processed (e.g. a whole genre like anime, a
specific series, or one movie). Ignored items are excluded from the coverage
"percent done" so they don't count against you.
- **Prioritise** — matching items jump to the front of the work queue.
A rule targets a **genre**, a **series**, or a single **item**; the most specific
matching rule wins (item > series > genre). Setting a rule for a target that
already has one replaces it, so nothing can be both prioritised and ignored.
## Building the Plugin
### Prerequisites
@@ -268,20 +293,28 @@ Jellyfin.Plugin.JRay/
├── Controllers/
│ ├── ActorsController.cs # /Timeline and /jray?t= read endpoints
│ ├── TruthController.cs # PUT/DELETE managed truth data
│ ├── TasksController.cs # /Tasks/Pending work discovery
│ ├── TasksController.cs # /Tasks/Pending work discovery (policy-aware)
│ ├── PolicyController.cs # /Policy/Rules prioritise/ignore CRUD
│ ├── CoverageController.cs # /Coverage overview + genre/series/item pickers
│ └── WebController.cs # /ClientScript overlay script
├── Models/
│ ├── TruthFile.cs # Root truth-file schema (schema_version 1)
│ ├── TruthActor.cs # Per-actor entry with scene windows
│ ├── ActorAtTime.cs # Actor entry in the "context at t" envelope
│ ├── JRayContext.cs # Extensible "context at time t" envelope
── PendingExtractionItem.cs # Item descriptor for the work-discovery API
── PendingExtractionItem.cs # Item descriptor for the work-discovery API
│ ├── MediaPolicyRule.cs # A prioritise/ignore rule (+ PolicyScope/PolicyAction)
│ ├── CoverageReport.cs # Coverage overview (+ CoverageCounts / breakdown rows)
│ └── PickerOption.cs # value/label option for the config-page pickers
├── Services/
│ ├── Interfaces/
│ │ ├── ITruthDataService.cs
│ │ ── IManagedTruthStore.cs
│ │ ── IManagedTruthStore.cs
│ │ └── IMediaPolicyStore.cs
│ ├── TruthDataService.cs # Resolves + caches truth (managed > sidecar)
│ ├── ManagedTruthStore.cs # Storage for pushed/managed truth data
│ ├── MediaPolicyStore.cs # Persists prioritise/ignore rules (policy.json)
│ ├── PolicyResolver.cs # Resolves an item's effective rule (item>series>genre)
│ └── WebClientPatchService.cs # Injects/removes overlay script in index.html
├── Web/
│ └── jray-overlay.js # Pause-overlay client script (embedded resource)