chore: bump to v1.3.0; update CHANGELOG, README, ARCHITECTURE docs
Some checks failed
Docs Check / Mermaid diagram parse check (push) Failing after 44s
Docs Check / Markdown lint (push) Successful in 1m7s
Build and Push Docker Image / build (push) Successful in 1m15s
Licence Check / Dependency licence compatibility (push) Successful in 1m37s
CI / Security audit (push) Successful in 2m2s
CI / Tests & coverage (push) Successful in 2m27s

This commit is contained in:
2026-05-17 23:29:02 +01:00
parent a6fcde58cf
commit aef21d1b50
4 changed files with 86 additions and 3 deletions

View File

@@ -314,6 +314,7 @@ For each connected user the server:
| See download/target paths | ✗ | ✓ |
| See Sonarr/Radarr links | ✗ | ✓ |
| View status panel | ✗ | ✓ |
| Blocklist & search (import-pending) | ✗ | ✓ |
### Tag Matching
@@ -413,9 +414,16 @@ Each matched download produces an object with:
| `matchedUserTag` | string / null | Tag label matching the requesting user, or `null` |
| `tagBadges` | `{label, matchedUser}[]` / undefined | (Admin `showAll` only) Each tag classified against full Emby user list |
| `importIssues` | string[] / null | Import warning/error messages |
| `availableForUpgrade` | boolean / undefined | (History) `true` when outcome is `failed` but the content is already on disk (failed upgrade attempt) |
| `downloadPath` | string / null | (Admin) Download client path |
| `targetPath` | string / null | (Admin) *arr target path |
| `arrLink` | string / null | (Admin) Link to *arr web UI |
| `arrQueueId` | number / null | (Admin, import-pending only) Sonarr/Radarr queue record id |
| `arrType` | `'sonarr'`/`'radarr'` / null | (Admin, import-pending only) Which *arr service owns this queue entry |
| `arrInstanceUrl` | string / null | (Admin, import-pending only) Base URL of the *arr instance |
| `arrInstanceKey` | string / null | (Admin, import-pending only) API key for the *arr instance |
| `arrContentId` | number / null | (Admin, import-pending only) `episodeId` (Sonarr) or `movieId` (Radarr) for triggering a new search |
| `arrContentType` | `'episode'`/`'movie'` / null | (Admin, import-pending only) Content type for the search command |
---
@@ -594,6 +602,48 @@ Admin-only per-user download counts (fetches live from APIs, not cached).
---
### `POST /api/dashboard/blocklist-search`
Admin-only. Removes a Sonarr/Radarr queue item with `blocklist=true` (preventing the same release being grabbed again), then immediately triggers an `EpisodeSearch` or `MoviesSearch` command.
Requires CSRF token (`X-CSRF-Token` header).
**Request Body:**
```json
{
"arrQueueId": 1234,
"arrType": "sonarr",
"arrInstanceUrl": "https://sonarr.example.com",
"arrInstanceKey": "your-api-key",
"arrContentId": 5678,
"arrContentType": "episode"
}
```
| Field | Required | Description |
|-------|:--------:|-------------|
| `arrQueueId` | Yes | Sonarr/Radarr queue record `id` |
| `arrType` | Yes | `"sonarr"` or `"radarr"` |
| `arrInstanceUrl` | Yes | Base URL of the *arr instance |
| `arrInstanceKey` | Yes | API key for the *arr instance |
| `arrContentId` | Yes | `episodeId` (Sonarr) or `movieId` (Radarr) |
| `arrContentType` | Yes | `"episode"` or `"movie"` |
**Response (200):** `{ "ok": true }`
**Response (400):** Missing or invalid fields.
**Response (403):** Non-admin user.
**Response (502):** Upstream *arr call failed.
**Side Effects:**
- Calls `DELETE /api/v3/queue/{id}?removeFromClient=true&blocklist=true` on the *arr instance
- Calls `POST /api/v3/command` with `EpisodeSearch`/`MoviesSearch` on the *arr instance
- Triggers a background `pollAllServices()` so the next SSE push reflects the removed item
---
### `GET /api/history/recent`
Returns recently completed (imported or failed) downloads from Sonarr/Radarr history for the authenticated user, filtered to the last `days` days.
@@ -675,14 +725,19 @@ stateDiagram-v2
|----------|---------|
| `checkAuthentication()` | On load: check session → show dashboard or login |
| `handleLogin()` | Authenticate, fade login → splash → dashboard |
| `goHome()` | Navigate to default view: switch to Active Downloads tab, close status panel, reset showAll |
| `startSSE()` | Open `EventSource` to `/stream`; handles incoming data + first-message loading hide |
| `stopSSE()` | Close `EventSource` and cancel reconnect timer |
| `renderDownloads()` | Diff-based card rendering (create/update/remove) |
| `createDownloadCard()` | Build DOM for a single download card; renders tag badges |
| `createDownloadCard()` | Build DOM for a single download card; renders tag badges, import-issue badge, blocklist button |
| `updateDownloadCard()` | Update existing card in-place (progress, speed, etc.) |
| `handleBlocklistSearch()` | Confirm dialog → POST `/blocklist-search` → update button state |
| `toggleStatusPanel()` | Show/hide admin status panel |
| `renderStatusPanel()` | Build status HTML (server, polling, SSE clients, cache) |
| `initThemeSwitcher()` | Light / Dark / Mono theme support |
| `loadHistory()` | Fetch `/api/history/recent`, store raw items, call `renderHistory()` |
| `renderHistory()` | Filter items by `ignoreAvailable` flag, render history cards |
| `createHistoryCard()` | Build DOM for a single history card with outcome/upgrade badges |
### Themes
@@ -1133,10 +1188,12 @@ classDiagram
+GET /user-summary
+GET /status
+GET /cover-art
+POST /blocklist-search
buildDownloadPayload()
extractUserTag()
buildTagBadges()
getEmbyUsers()
getImportIssues()
}
class RequireAuth["requireAuth.js (Middleware)"] {
+requireAuth(req, res, next)