arr-summary/templates/home.html
Barely Removable 08491c0c9b
All checks were successful
Deploy / deploy (push) Successful in 27s
Fix System page crash, retire "held" copy, and slim CLAUDE.md
- system.html crashed with a 500 whenever SABnzbd history loaded: the
  trend() macro compared the formatted "avg_speed" string (e.g. "900
  KB/s") against a number. Added a real numeric avg_speed_kbps field
  and pointed the macro at that instead.
- Replaced "held"/"not held" wording with "in library"/"not in
  library" on Home and Discover.
- Moved CLAUDE.md's Deployment/reverse-proxy and account-management
  sections into two on-demand skills (deploy-arr-summary,
  manage-accounts) so they only load when actually relevant, with a
  one-line pointer left in their place.
- Updated PRODUCT.md's restructure note now that meridian-marquee has
  merged to main.
- Dropped two stale/broken entries from settings.local.json's
  permission allowlist (a rule from a different machine/path, and one
  with a corrupted token).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBw1QodG8ZMYHrGeQfqyDS
2026-08-30 08:05:49 -07:00

144 lines
6.4 KiB
HTML

{% extends "_shell.html" %}
{% from "_macros.html" import service_error, bar, tile %}
{% block title %}P100 Media Centre{% endblock %}
{% block content %}
{#- The masthead. Double height, the service's own colour, and the one
place on the page bloom is allowed. -#}
<h1 class="tt-dh bloom tt-masthead">MEDIA CENTRE</h1>
{#- ── The index IS the status page ──────────────────────────────
Every destination row carries its own live figure in its own
colour, so choosing where to go and reading how things are are
the same act. This is the whole thesis in one block. -#}
<div class="tt-rows">
<a class="tt-row" href="{{ request.script_root }}/watch">
<span class="tt-row-num">101</span>
<span class="tt-row-name">Watch</span>
<span class="tt-row-body"><span class="tt-row-sub">Who is streaming right now</span></span>
{% if tautulli.status == 'ok' %}
<span class="tt-row-val {{ 'ok' if tautulli.active_streams else 'off' }}" id="tt-streams-row">
<span id="tt-streams">{{ tautulli.active_streams }}</span> STREAMING</span>
{% else %}
<span class="tt-row-val alert">OFF AIR</span>
{% endif %}
</a>
<a class="tt-row" href="{{ request.script_root }}/library">
<span class="tt-row-num">102</span>
<span class="tt-row-name">Library</span>
<span class="tt-row-body"><span class="tt-row-sub">Everything in library</span></span>
{% if sonarr.status == 'ok' or radarr.status == 'ok' %}
<span class="tt-row-val">{{ sonarr.total_series | default(0) }} SHOWS &nbsp;{{ radarr.total_movies | default(0) }} FILMS</span>
{% else %}
<span class="tt-row-val alert">OFF AIR</span>
{% endif %}
</a>
<a class="tt-row" href="{{ request.script_root }}/discover">
<span class="tt-row-num">103</span>
<span class="tt-row-name">Discover</span>
<span class="tt-row-body"><span class="tt-row-sub">Popular, and not yet in library</span></span>
<span class="tt-row-val">{{ (rt_movies | length) + (rt_tv | length) }} SUGGESTED</span>
</a>
<a class="tt-row" href="{{ request.script_root }}/requests">
<span class="tt-row-num">104</span>
<span class="tt-row-name">Requests</span>
<span class="tt-row-body"><span class="tt-row-sub">Waiting on a decision</span></span>
{% if ombi.status == 'ok' %}
<span class="tt-row-val {{ 'pending' if ombi.total_pending else 'off' }}">{{ ombi.total_pending | default(0) }} PENDING</span>
{% else %}
<span class="tt-row-val alert">OFF AIR</span>
{% endif %}
</a>
<a class="tt-row" href="{{ request.script_root }}/system">
<span class="tt-row-num">105</span>
<span class="tt-row-name">System</span>
<span class="tt-row-body"><span class="tt-row-sub">Array, disks and indexers</span></span>
{% if unraid.status == 'ok' %}
{%- set pct = unraid.array_used_pct | default(0) | float -%}
<span class="tt-row-val {{ 'alert' if pct >= 90 else ('warn' if pct >= 75 else 'ok') }}">{{ pct | round | int }}% FULL</span>
{% else %}
<span class="tt-row-val alert">OFF AIR</span>
{% endif %}
</a>
<a class="tt-row" href="{{ request.script_root }}/activity">
<span class="tt-row-num">106</span>
<span class="tt-row-name">Activity</span>
<span class="tt-row-body"><span class="tt-row-sub">What the stack has been doing</span></span>
{% if sabnzbd.status == 'ok' %}
<span class="tt-row-val {{ '' if sabnzbd.queue_count else 'off' }}"><span id="sab-queue">{{ sabnzbd.queue_count }}</span> IN QUEUE</span>
{% else %}
<span class="tt-row-val alert">OFF AIR</span>
{% endif %}
</a>
<a class="tt-row" href="{{ request.script_root }}/settings">
<span class="tt-row-num">900</span>
<span class="tt-row-name">Settings</span>
<span class="tt-row-body"><span class="tt-row-sub">Keys, timezone and password</span></span>
</a>
</div>
<div class="tt-sep" aria-hidden="true"></div>
{#- ── Now showing ───────────────────────────────────────────────
The lower two-thirds. The furthest-along stream is set at double
height in the live colour, with its progress as whole mosaic
cells on the service's one ruler. -#}
<div class="tt-field">
<span>Now Showing</span>
{% if tautulli.status == 'ok' %}
<span class="tt-field-meta">{{ tautulli.active_streams }} active</span>
{% endif %}
</div>
{% if tautulli.status != 'ok' %}
{{ service_error('Tautulli', tautulli.error) }}
{% elif hero %}
<div class="tt-now">
<div class="tt-dh bloom tt-now-title">{{ hero.title }}</div>
<div class="tt-now-meta">
{{ hero.user or hero.username }}
{%- if hero.player %} &middot; {{ hero.player }}{% endif %}
{%- if hero.quality %} &middot; {{ hero.quality }}{% endif %}
{%- if hero.state %} &middot; {{ hero.state | upper }}{% endif %}
</div>
<div class="tt-now-line">
{{ bar(hero.progress | default(0), 'ok') }}
<span class="tt-now-pct">{{ hero.progress | default(0) | round | int }}%</span>
{% if hero.remaining %}<span class="tt-row-sub">{{ hero.remaining }} LEFT</span>{% endif %}
</div>
</div>
{% if other_sessions %}
<div class="tt-rows tt-rows-after">
{% for s in other_sessions %}
<div class="tt-row">
<span class="tt-row-body">
<span class="tt-row-title">{{ s.title }}</span>
<span class="tt-row-sub">{{ s.user or s.username }}{% if s.player %} &middot; {{ s.player }}{% endif %}</span>
</span>
{{ bar(s.progress | default(0), 'ok') }}
<span class="tt-row-val">{{ s.progress | default(0) | round | int }}%</span>
</div>
{% endfor %}
</div>
{% endif %}
{% else %}
<p class="tt-empty">Nothing streaming. The service is quiet.</p>
{% endif %}
{#- ── Just added ──────────────────────────────────────────────── -#}
{% if recently_added %}
<div class="tt-field"><span>Just Added</span></div>
<div class="tt-tiles tt-tiles-row">
{% for it in recently_added %}
{{ tile(it.title, it.sub, it.poster, it.ago) }}
{% endfor %}
</div>
{% endif %}
{% endblock %}