fix(yt): én hentning ad gangen, nye forsøg ved 403, genoptag afbrudte
CD / deploy (push) Successful in 20s
CI / check (push) Successful in 30s

Tre fejl, der forstærkede hinanden:
- Hver tilføjelse startede sin egen kø-tømning, så flere hentninger kørte
  samtidig (og natlig timer kunne køre oveni). Mange samtidige hentninger fra
  samme IP er netop det YouTube svarer 403 på. Køen har nu en fil-lås
  (yt_koe.lock), så kun én kørsel henter, også på tværs af processer.
- yt-dlp gentager ikke selv en 403. Midlertidige fejl (403/429/timeout) prøves
  nu igen op til to gange med pause og en anden YouTube-klient
  (tv,web_safari og mweb). Permanente fejl prøves ikke igen.
- Et job der stod som "running", da portalen genstartede, blev hængende for
  altid. Med låsen ved vi, at et sådant job er afbrudt, og det lægges i kø
  igen ved næste kørsel.

Fejlede job har en "Prøv igen"-knap (og "Prøv alle fejlede igen"), og den
natlige kørsel opdaterer yt-dlp, før den henter.

Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
This commit is contained in:
agw
2026-10-06 13:54:07 +02:00
parent fbdb257079
commit ff76660910
4 changed files with 132 additions and 9 deletions
+14 -1
View File
@@ -158,6 +158,12 @@
{# ---- kø & historik ---- #}
{% if jobs %}
<h2 style="margin-top:2rem">Kø &amp; historik</h2>
{% set fejlede = jobs | selectattr("status", "equalto", "error") | list %}
{% if fejlede | length > 1 %}
<form method="post" action="/admin/yt/igen" style="margin:.6rem 0 0">
<button class="wt-btn" type="submit">Prøv alle {{ fejlede | length }} fejlede igen</button>
</form>
{% endif %}
<table class="wt-table" style="margin-top:.8rem">
<thead><tr><th>URL / titel</th><th style="width:8rem">Status</th><th>Besked</th></tr></thead>
<tbody>
@@ -169,7 +175,14 @@
{% elif j.status == 'running' %}i gang…
{% elif j.status == 'deleted' %}<span class="muted">slettet</span>
{% else %}i kø{% endif %}</td>
<td class="muted">{{ j.error }}</td>
<td class="muted">{{ j.error }}{% if j.note %}{{ ' · ' if j.error }}{{ j.note }}{% endif %}
{% if j.status == 'error' %}
<form method="post" action="/admin/yt/igen" style="margin:.3rem 0 0">
<input type="hidden" name="jid" value="{{ j.id }}">
<button class="wt-btn" type="submit">Prøv igen</button>
</form>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>