Files
2026-11-05 21:31:00 +01:00

147 lines
8.5 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% extends "base.html" %}
{% block title %}Admin — podcast{% endblock %}
{% block body %}
<p><a href="/admin" class="wt-muted">← Admin</a></p>
<h1>Podcast</h1>
<p class="wt-lead">Kladder ses kun af administratorer, også i deres podcast-app. Udgiv en episode, når den er klar til familien. Lytternes adresser er personlige; trækker du en tilbage, holder den op med at virke, og de andre mærker intet. Personen får en ny adresse næste gang de åbner siden, så længe de er i gruppen Familie; skal nogen helt ud, så fjern dem fra gruppen i Authentik. Siden for familien er <a href="/podcast">/podcast</a>.</p>
{% if saved %}<div class="wt-flash">{{ saved }}</div>{% endif %}
{% for u in udsendelser %}
<h2 style="font-size:1.15rem;margin-top:1.6rem">{{ u.titel }}</h2>
<table class="wt-table">
<thead><tr><th>Nr</th><th>Titel</th><th>Varighed</th><th>Status</th><th></th></tr></thead>
<tbody>
{% for e in u.episoder %}
<tr>
<td>{{ e.nr }}</td>
<td>{{ e.titel }}<div class="wt-muted" style="font-size:.8rem">{{ e.slug }}.mp3 · {{ (e.bytes / 1048576) | round(1) }} MB</div></td>
<td>{{ (e.varighed // 60) }}:{{ '%02d' % (e.varighed % 60) }}</td>
<td>{% if e.kladde %}Kladde{% else %}Udgivet {{ (e.udgivet or '')[:10] }}{% endif %}</td>
<td>
<form method="post" action="/admin/podcast/{{ u.slug }}/{{ e.slug }}/udgiv" style="margin:0">
{% if e.kladde %}
<button class="wt-btn wt-btn--primary" type="submit">Udgiv</button>
{% else %}
<input type="hidden" name="kladde" value="1"><button class="wt-btn" type="submit">Gør til kladde</button>
{% endif %}
</form>
</td>
</tr>
{% else %}
<tr><td colspan="5" class="wt-muted">Ingen episoder. Udgiv med publish.py i skillen slaegtens-stemmer.</td></tr>
{% endfor %}
</tbody>
</table>
{% endfor %}
<h2 style="font-size:1.15rem;margin-top:2rem">Fælles familielink</h2>
<p class="wt-muted" style="margin:.3rem 0 .8rem">Ét link uden login, fx til familiens Messenger-gruppe: afspiller og feed i ét. Kladder vises aldrig her. Skifter du nøglen, holder det gamle link op med at virke med det samme, også for dem der abonnerer via det.</p>
<div class="wt-card" style="padding:1rem 1.2rem;max-width:48rem">
{% if faelles.key %}
<p style="margin:0 0 .6rem"><strong>{{ 'Slået til' if faelles.aktiv else 'Slået fra' }}</strong>
· {{ faelles.hentninger or 0 }} hentninger{% if faelles.sidst %} · sidst <span data-ts="{{ faelles.sidst }}"></span>{% endif %}</p>
{% if faelles.aktiv %}
<div style="display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:.8rem">
<input class="wt-input" readonly id="faelles-link" value="{{ base }}/podcast/f/{{ faelles.key }}/"
style="flex:1 1 22rem;font-family:ui-monospace,monospace;font-size:.85rem" onclick="this.select()">
<button class="wt-btn" type="button" onclick="var i=document.getElementById('faelles-link');i.select();navigator.clipboard&&navigator.clipboard.writeText(i.value);this.textContent='Kopieret'">Kopiér</button>
</div>
{% endif %}
<form method="post" action="/admin/podcast/faelles" style="display:flex;gap:.5rem;flex-wrap:wrap;margin:0">
<button class="wt-btn" type="submit" name="handling" value="skift"
onclick="return confirm('Det gamle fælles link holder op med at virke. Fortsæt?')">Skift nøgle</button>
{% if faelles.aktiv %}
<button class="wt-btn" type="submit" name="handling" value="fra">Slå fra</button>
{% else %}
<button class="wt-btn wt-btn--primary" type="submit" name="handling" value="til">Slå til</button>
{% endif %}
</form>
{% else %}
<form method="post" action="/admin/podcast/faelles" style="margin:0">
<button class="wt-btn wt-btn--primary" type="submit" name="handling" value="skift">Lav fælles link</button>
</form>
{% endif %}
</div>
<h2 style="font-size:1.15rem;margin-top:2rem">Del med ukendte</h2>
<p class="wt-muted" style="margin:.3rem 0 .8rem">Gæstelinks til folk uden for familien, fx til en jobsamtale. Hvert link har sin egen nøgle og udløber af sig selv; du kan også trække det tilbage før tid. Det har intet med familiens link eller de personlige adresser at gøre. Kladder vises aldrig.</p>
<form method="post" action="/admin/podcast/gaest" class="wt-card" style="padding:1rem 1.2rem;max-width:48rem;display:flex;gap:.5rem;flex-wrap:wrap;align-items:flex-end">
<input type="hidden" name="handling" value="ny">
<label style="flex:1 1 16rem">Hvem er det til<br>
<input class="wt-input" name="navn" required maxlength="80" placeholder="fx Jobsamtale, Firma A/S" style="width:100%"></label>
<label>Udløber efter<br>
<select class="wt-input" name="dage">
<option value="7">7 dage</option><option value="14">14 dage</option>
<option value="30" selected>30 dage</option><option value="90">90 dage</option>
<option value="0">Aldrig (træk selv tilbage)</option>
</select></label>
<button class="wt-btn wt-btn--primary" type="submit">Lav gæstelink</button>
</form>
<table class="wt-table" style="margin-top:.8rem">
<thead><tr><th>Til</th><th>Link</th><th>Udløber</th><th>Sidst brugt</th><th>Hentninger</th><th></th></tr></thead>
<tbody>
{% for g in gaester %}
{% set doed = g.tilbagekaldt or g.udloebet %}
<tr{% if doed %} style="opacity:.55"{% endif %}>
<td>{{ g.navn }}</td>
<td>{% if doed %}<span class="wt-muted">{{ 'Trukket tilbage' if g.tilbagekaldt else 'Udløbet' }}</span>{% else %}
<div style="display:flex;gap:.4rem;min-width:14rem">
<input class="wt-input" readonly id="g-{{ loop.index }}" value="{{ base }}/podcast/f/{{ g.key }}/"
style="flex:1;font-family:ui-monospace,monospace;font-size:.8rem" onclick="this.select()">
<button class="wt-btn" type="button" onclick="var i=document.getElementById('g-{{ loop.index }}');i.select();navigator.clipboard&&navigator.clipboard.writeText(i.value);this.textContent='Kopieret'">Kopiér</button>
</div>{% endif %}</td>
<td>{% if g.udloeber %}<span data-ts="{{ g.udloeber }}"></span>{% else %}Aldrig{% endif %}</td>
<td data-ts="{{ g.sidst or '' }}"></td>
<td title="{% for h, n in (g.hentet or {}).items() %}{{ h }}: {{ n }}&#10;{% endfor %}">{{ g.hentninger or 0 }}</td>
<td>
<form method="post" action="/admin/podcast/gaest" style="margin:0">
<input type="hidden" name="key" value="{{ g.key }}">
{% if doed %}
<button class="wt-btn" type="submit" name="handling" value="slet">Slet</button>
{% else %}
<button class="wt-btn" type="submit" name="handling" value="tilbagekald"
onclick="return confirm('Træk gæstelinket tilbage? Det holder op med at virke med det samme.')">Træk tilbage</button>
{% endif %}
</form>
</td>
</tr>
{% else %}
<tr><td colspan="6" class="wt-muted">Ingen gæstelinks.</td></tr>
{% endfor %}
</tbody>
</table>
<h2 style="font-size:1.15rem;margin-top:2rem">Lytternes adresser</h2>
<table class="wt-table">
<thead><tr><th>Bruger</th><th>Oprettet</th><th>Sidst hentet</th><th>Hentninger</th><th>App</th><th></th></tr></thead>
<tbody>
{% for k in noegler %}
<tr{% if k.tilbagekaldt %} style="opacity:.55"{% endif %}>
<td>{{ k.user }}{% if k.admin %} <span class="wt-muted">(admin)</span>{% endif %}</td>
<td data-ts="{{ k.oprettet }}"></td>
<td data-ts="{{ k.sidst or '' }}"></td>
<td title="{% for h, n in (k.hentet or {}).items() %}{{ h }}: {{ n }}&#10;{% endfor %}">{{ k.hentninger or 0 }}</td>
<td class="wt-muted" style="font-size:.8rem;max-width:16rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">{{ k.sidst_ua or '' }}</td>
<td>
<form method="post" action="/admin/podcast/noegle/{{ k.key }}" style="margin:0">
{% if k.tilbagekaldt %}
<input type="hidden" name="aktiv" value="1"><button class="wt-btn" type="submit">Genaktivér</button>
{% else %}
<button class="wt-btn" type="submit" onclick="return confirm('Træk {{ k.user }}s adresse tilbage?')">Træk tilbage</button>
{% endif %}
</form>
</td>
</tr>
{% else %}
<tr><td colspan="6" class="wt-muted">Ingen endnu. En lytter får sin adresse første gang de åbner /podcast.</td></tr>
{% endfor %}
</tbody>
</table>
<script>
document.querySelectorAll('[data-ts]').forEach(function (td) {
var t = parseInt(td.dataset.ts, 10);
td.textContent = t ? new Date(t * 1000).toLocaleString('da-DK', { dateStyle: 'short', timeStyle: 'short' }) : '–';
});
</script>
{% endblock %}