147 lines
8.5 KiB
HTML
147 lines
8.5 KiB
HTML
{% 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 }} {% 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 }} {% 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 %}
|