Rename the Arrs tab to Media Stack, now that it is one

It covers the pipeline rather than only acquisition: the arrs, the jobs that run
over the same files, and the servers that play them. The label moves; the tab id,
file and URL do not, so bookmarks and the cache key keep working.

The settings card widens with it — Play State Sync, Media Permissions, Media
Cleaner, Emby and Jellyfin were reachable only through the Settings catch-all,
which is a long way to go for a setting named after the page you are on. Match
is whole-word, so "Intermediate Sync" is not caught by "media"; section count is
unchanged at 126 with the same 5 gaps, so nothing was taken from another tab.
This commit is contained in:
Gmer4Lfe
2026-08-14 21:47:33 -04:00
parent 00328cbd0a
commit 5ad5c0df7e
4 changed files with 38 additions and 19 deletions
+1 -1
View File
@@ -225,7 +225,7 @@ $_vv_ai = vv_ai_ui_on();
if ($_vv_ai) $validTabs[] = 'ai';
if (!in_array($tab, $validTabs)) $tab = 'monitor';
$tabLabels = ['monitor' => 'Monitor', 'scheduler' => 'Scheduler', 'docker' => 'Docker', 'watchdog' => 'Watchdog', 'partnership' => 'Partnership', 'fallback' => 'FallBack', 'arrs' => 'Arrs', 'rsync' => 'Rsync', 'auth' => 'Auth Stack', 'settings' => 'Settings', 'ai' => 'AI'];
$tabLabels = ['monitor' => 'Monitor', 'scheduler' => 'Scheduler', 'docker' => 'Docker', 'watchdog' => 'Watchdog', 'partnership' => 'Partnership', 'fallback' => 'FallBack', 'arrs' => 'Media Stack', 'rsync' => 'Rsync', 'auth' => 'Auth Stack', 'settings' => 'Settings', 'ai' => 'AI'];
// Cache stamp for the stylesheet and script below. Both are served straight off the plugin
// directory at a path that never changes, so a browser holding an old copy keeps using it after
+7 -3
View File
@@ -116,8 +116,12 @@ const VV_UI_SECTION_SURFACES = [
'route' => 'Rsync tab → Rsync settings'],
['match' => 'fallback|tier', 'tab' => 'Fallback',
'route' => 'Fallback tab → Fallback settings'],
['match' => 'arr|sonarr|radarr|lidarr', 'tab' => 'Arrs',
'route' => 'Arrs tab → Arr settings'],
// The tab covers the whole media pipeline now, not only acquisition: the arrs, the jobs that
// run over the same files (play state, permissions, the cleaner), and the servers that play
// them. These sections were reachable only through the Settings catch-all, which is a long way
// to go for a setting named after the page you are already looking at.
['match' => 'arr|sonarr|radarr|lidarr|media|play state|emby|jellyfin|plex', 'tab' => 'Media Stack',
'route' => 'Media Stack tab → Media settings'],
['match' => 'docker', 'tab' => 'Docker',
'route' => 'Docker tab → Docker settings'],
@@ -179,7 +183,7 @@ const VV_UI_PAGE_ROUTES = [
'also' => ['HOSTN_DISCORD_WEBHOOK', 'HOSTN_STORAGE_MODE_INTERNAL']],
'fallback.php' => ['route' => 'Fallback tab'],
'rsync.php' => ['route' => 'Rsync tab'],
'arrs.php' => ['route' => 'Arrs tab'],
'arrs.php' => ['route' => 'Media Stack tab'],
'watchdog.php' => ['route' => 'Watchdog tab'],
'docker.php' => ['route' => 'Docker tab'],
];
+7 -3
View File
@@ -1,7 +1,7 @@
<?php
// ═══════════════════════════════════════════════════════════════════════════════════════════════
// PURPOSE
// Arrs tab. Library counts, queue state, root folders and recent cleanup/discovery activity
// Media Stack tab. Library counts, queue state, root folders and recent cleanup/discovery activity
// for every Sonarr / Radarr / Lidarr instance across all nodes.
//
// DESIGN PRINCIPLES
@@ -115,7 +115,7 @@ require_once dirname(__DIR__) . '/include/ai_chat.php';
</style>
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;padding:0 2px;">
<span style="font-size:13px;font-weight:bold;color:#888;text-transform:uppercase;letter-spacing:.06em;">Arrs</span>
<span style="font-size:13px;font-weight:bold;color:#888;text-transform:uppercase;letter-spacing:.06em;">Media Stack</span>
<span style="font-size:11px;color:#3a3a3a;" id="vv-arrs-ts"></span>
</div>
@@ -150,7 +150,11 @@ require_once dirname(__DIR__) . '/include/ai_chat.php';
// The conf sections this page is about, drawn by the shared renderer. They were reachable
// only from the Settings tab's catch-all, which is a long way to go for a setting named
// after the page you are already looking at.
vv_conf_ui_card('vv-cf-arrs', 'arr|sonarr|radarr|lidarr', 'Arr settings');
//
// The match mirrors VV_UI_SECTION_SURFACES in confform.php and has to keep mirroring it: that
// constant is what tells the assistant where to send someone, and this is what the page actually
// draws. The two disagreeing means being given directions to a card that is not there.
vv_conf_ui_card('vv-cf-arrs', 'arr|sonarr|radarr|lidarr|media|play state|emby|jellyfin|plex', 'Media settings');
?>
<script>
(function() {
+23 -12
View File
@@ -31,7 +31,7 @@ those settings genuinely have no control, and saying so is the right answer.
Reachable from:
- Scheduler tab → **Arrs Failed Stalled Recovery** → Config → *Arr Recovery Toggles*
- Arrs tab → Arr settings → *Arr Recovery Toggles*
- Media Stack tab → Media settings → *Arr Recovery Toggles*
- Settings tab → All settings → *Arr Recovery Toggles*
Saved into `host1.conf`, which does not need to be opened by hand.
@@ -244,6 +244,7 @@ Reachable from:
- Scheduler tab → **Emby To Radarr Sync** → Config → *Emby*
- Scheduler tab → **Emby To Sonarr Sync** → Config → *Emby*
- Scheduler tab → **Emby Database Repair** → Config → *Emby*
- Media Stack tab → Media settings → *Emby*
- Settings tab → All settings → *Emby*
Saved into `host1.conf`, which does not need to be opened by hand.
@@ -321,7 +322,10 @@ Saved into `host1.conf`, which does not need to be opened by hand.
## Jellyfin
Route: Settings tab → All settings → *Jellyfin*
Reachable from:
- Media Stack tab → Media settings → *Jellyfin*
- Settings tab → All settings → *Jellyfin*
Saved into `host1.conf`, which does not need to be opened by hand.
@@ -341,7 +345,7 @@ Reachable from:
- Scheduler tab → **Lidarr Duplicate Artist Cleanup** → Config → *Lidarr*
- Scheduler tab → **Playback Aware Lidarr Discovery** → Config → *Lidarr*
- Scheduler tab → **Emby To Lidarr Sync** → Config → *Lidarr*
- Arrs tab → Arr settings → *Lidarr*
- Media Stack tab → Media settings → *Lidarr*
- Settings tab → All settings → *Lidarr*
Saved into `host1.conf`, which does not need to be opened by hand.
@@ -360,6 +364,7 @@ Saved into `host1.conf`, which does not need to be opened by hand.
Reachable from:
- Scheduler tab → **Media Cleaner** → Config → *Media Cleaner*
- Media Stack tab → Media settings → *Media Cleaner*
- Settings tab → All settings → *Media Cleaner*
Saved into `host1.conf`, which does not need to be opened by hand.
@@ -376,6 +381,7 @@ Reachable from:
- Scheduler tab → **Media Shares Permissions** → Config → *Media Permissions*
- Scheduler tab → **Bulk Permissions Repair** → Config → *Media Permissions*
- Scheduler tab → **Trailer Folder Migration** → Config → *Media Permissions*
- Media Stack tab → Media settings → *Media Permissions*
- Settings tab → All settings → *Media Permissions*
Saved into `host1.conf`, which does not need to be opened by hand.
@@ -512,7 +518,7 @@ Reachable from:
- Scheduler tab → **Playback Aware Radarr Discovery** → Config → *Radarr*
- Scheduler tab → **Radarr Tmdb Removed** → Config → *Radarr*
- Scheduler tab → **Emby To Radarr Sync** → Config → *Radarr*
- Arrs tab → Arr settings → *Radarr*
- Media Stack tab → Media settings → *Radarr*
- Settings tab → All settings → *Radarr*
Saved into `host1.conf`, which does not need to be opened by hand.
@@ -601,7 +607,7 @@ Reachable from:
- Scheduler tab → **Playback Aware Sonarr Discovery** → Config → *Sonarr*
- Scheduler tab → **Sonarr Tvdb Removed** → Config → *Sonarr*
- Scheduler tab → **Emby To Sonarr Sync** → Config → *Sonarr*
- Arrs tab → Arr settings → *Sonarr*
- Media Stack tab → Media settings → *Sonarr*
- Settings tab → All settings → *Sonarr*
Saved into `host1.conf`, which does not need to be opened by hand.
@@ -758,7 +764,7 @@ Saved into `master.conf`, which does not need to be opened by hand.
| Setting | Control | Where | What it does |
|---|---|---|---|
| `AI_ASSIST_REPORTS` | a switch | in this section | tier 1 — digest / coffee report narration |
| `AI_ASSIST_WATCHDOG` | a switch | in this section | tier 2 — context on a flagged condition |
| `AI_ASSIST_WATCHDOG` | a switch | in this section | tier 2 — file a finding when a watchdog counter passes its limit (needs AI_REPAIR_ENABLED) |
| `AI_ASSIST_DISCOVERY` | a switch | in this section | tier 2 — discovery / classification judgement calls |
| `AI_ASSIST_CLEANUP` | a switch | in this section | tier 2 — orphan and stuck-import triage |
| `AI_ASSIST_ONBOARD` | a switch | in this section | tier 3 — onboarding / settings assistance |
@@ -945,7 +951,7 @@ Reachable from:
- Scheduler tab → **Radarr Cleanup** → Config → *Arr Cleanup*
- Scheduler tab → **Lidarr Cleanup** → Config → *Arr Cleanup*
- Scheduler tab → **Sonarr Cleanup** → Config → *Arr Cleanup*
- Arrs tab → Arr settings → *Arr Cleanup*
- Media Stack tab → Media settings → *Arr Cleanup*
- Settings tab → All settings → *Arr Cleanup*
Saved into `master.conf`, which does not need to be opened by hand.
@@ -1033,7 +1039,7 @@ Reachable from:
- Scheduler tab → **Radarr Classification Scan** → Config → *Arr Content Classification (radarr/sonarr_classification_scan.sh)*
- Scheduler tab → **Sonarr Classification Scan** → Config → *Arr Content Classification (radarr/sonarr_classification_scan.sh)*
- Arrs tab → Arr settings → *Arr Content Classification (radarr/sonarr_classification_scan.sh)*
- Media Stack tab → Media settings → *Arr Content Classification (radarr/sonarr_classification_scan.sh)*
- Settings tab → All settings → *Arr Content Classification (radarr/sonarr_classification_scan.sh)*
Saved into `master.conf`, which does not need to be opened by hand.
@@ -1051,14 +1057,14 @@ Saved into `master.conf`, which does not need to be opened by hand.
Reachable from:
- Scheduler tab → **Arrs Failed Stalled Recovery** → Config → *Arr Failed/Stalled Recovery*
- Arrs tab → Arr settings → *Arr Failed/Stalled Recovery*
- Media Stack tab → Media settings → *Arr Failed/Stalled Recovery*
- Settings tab → All settings → *Arr Failed/Stalled Recovery*
Saved into `master.conf`, which does not need to be opened by hand.
| Setting | Control | Where | What it does |
|---|---|---|---|
| `ARR_IMPORT_RECOVERY_AGE` | a number box, in hours | Arrs tab | hours — skip items newer than this |
| `ARR_IMPORT_RECOVERY_AGE` | a number box, in hours | Media Stack tab | hours — skip items newer than this |
| `ARR_RECOVERY_MAX_ATTEMPTS` | a number box, in consecutive | in this section | consecutive failures before an item is flagged chronic |
| `ARR_SMART_IMPORT_ENABLED` | a switch | in this section | importBlocked items: try importing a clean same-language |
| `ARR_SMART_IMPORT_PREFERRED_LANGUAGE` | a text box | in this section | only treated as a match/upgrade if the |
@@ -1068,7 +1074,7 @@ Saved into `master.conf`, which does not need to be opened by hand.
Reachable from:
- Scheduler tab → **Arr Full Rescan** → Config → *Arr Full Library Rescan*
- Arrs tab → Arr settings → *Arr Full Library Rescan*
- Media Stack tab → Media settings → *Arr Full Library Rescan*
- Settings tab → All settings → *Arr Full Library Rescan*
Saved into `master.conf`, which does not need to be opened by hand.
@@ -1081,7 +1087,7 @@ Saved into `master.conf`, which does not need to be opened by hand.
Reachable from:
- Arrs tab → Arr settings → *Arr Sync*
- Media Stack tab → Media settings → *Arr Sync*
- Settings tab → All settings → *Arr Sync*
Saved into `master.conf`, which does not need to be opened by hand.
@@ -1345,6 +1351,7 @@ Saved into `master.conf`, which does not need to be opened by hand.
Reachable from:
- Scheduler tab → **Emby Session Report** → Config → *Emby Session Report*
- Media Stack tab → Media settings → *Emby Session Report*
- Settings tab → All settings → *Emby Session Report*
Saved into `master.conf`, which does not need to be opened by hand.
@@ -1432,6 +1439,7 @@ Saved into `master.conf`, which does not need to be opened by hand.
Reachable from:
- Scheduler tab → **Media Cleaner** → Config → *Media Cleaner*
- Media Stack tab → Media settings → *Media Cleaner*
- Settings tab → All settings → *Media Cleaner*
Saved into `master.conf`, which does not need to be opened by hand.
@@ -1448,6 +1456,7 @@ Reachable from:
- Scheduler tab → **Media Shares Permissions** → Config → *Media Permissions*
- Scheduler tab → **Bulk Permissions Repair** → Config → *Media Permissions*
- Scheduler tab → **Trailer Folder Migration** → Config → *Media Permissions*
- Media Stack tab → Media settings → *Media Permissions*
- Settings tab → All settings → *Media Permissions*
Saved into `master.conf`, which does not need to be opened by hand.
@@ -1603,6 +1612,7 @@ Saved into `master.conf`, which does not need to be opened by hand.
Reachable from:
- Scheduler tab → **Play State Sync** → Config → *Play State Sync*
- Media Stack tab → Media settings → *Play State Sync*
- Settings tab → All settings → *Play State Sync*
Saved into `master.conf`, which does not need to be opened by hand.
@@ -1622,6 +1632,7 @@ Reachable from:
- Scheduler tab → **Play State Sync** → Config → *Play State Sync — Handback*
- Scheduler tab → **Fallback** → Config → *Play State Sync — Handback*
- Media Stack tab → Media settings → *Play State Sync — Handback*
- Settings tab → All settings → *Play State Sync — Handback*
Saved into `master.conf`, which does not need to be opened by hand.