feat(e-pub): jobs overlever genstart (job.json, slettes efter et døgn) og sendes automatisk til CWA/Audiobookshelf
CD / deploy (push) Successful in 21s
CI / check (push) Successful in 33s

Claude-Session: https://claude.ai/code/session_01AUj1LSMmrowcomkn1ciAgj
This commit is contained in:
root
2026-10-10 20:19:18 +02:00
parent 873500f5d4
commit 04958419ae
7 changed files with 136 additions and 30 deletions
+26 -5
View File
@@ -28,7 +28,7 @@ os.chdir(pathlib.Path(__file__).resolve().parents[1])
import config # noqa: E402
config.EPUB_SETTINGS_PATH.write_text(json.dumps({"tools_dir": str(VAERKTOEJ), "job_timeout_seconds": 3,
"output_ttl_seconds": 4, "max_concurrent_jobs": 1,
"cwa_ingest_dir": str(ROD / "cwa"), "abs_dir": str(ROD / "abs")}))
"cwa_ingest_dir": str(ROD / "cwa"), "abs_dir": str(ROD / "abs"), "auto_send": False}))
(ROD / "cwa").mkdir()
(ROD / "abs").mkdir()
import main # noqa: E402
@@ -84,7 +84,7 @@ tjek("epub content-type", r.headers["content-type"] == "application/epub+zip" an
tjek("filnavn i Content-Disposition", "Min%20Bog.epub" in r.headers["content-disposition"] or "Min Bog.epub" in r.headers["content-disposition"])
time.sleep(0.3)
tjek("slettet efter hentning", c.get(f"/e-pub/status/{a['id']}").json()["tilstand"] == "hentet"
and not (config.EPUB_SCRATCH / a["id"]).exists())
and not (config.EPUB_SCRATCH / a["id"] / "ud").exists())
tjek("anden hentning = 410", c.get(f"/e-pub/hent/{a['id']}").status_code == 410)
sb = vent(b["id"])
tjek("m4b færdig, \\r-linjer splittet", sb["filnavn"] == "Ane Forfatter - Lydbog æøå.m4b" and "trin 3" in sb["log"])
@@ -116,10 +116,31 @@ tjek("men ikke til andres job", c.get(f"/e-pub/status/{b['id']}").status_code ==
tjek("og ikke admin", c.get("/admin/epub").status_code == 403)
BRUGER.update(username="test", groups=["authentik Admins"])
u = vent(c.post("/e-pub/start", data={"link": "ok-epub 2"}).json()["id"])
import epub # noqa: E402
indst = json.loads(config.EPUB_SETTINGS_PATH.read_text())
config.EPUB_SETTINGS_PATH.write_text(json.dumps({**indst, "auto_send": True, "output_ttl_seconds": 30}))
u = vent(c.post("/e-pub/start", data={"link": "ok-epub 3"}).json()["id"])
time.sleep(0.5)
u = c.get(f"/e-pub/status/{u['id']}").json()
tjek("auto-send til CWA", u["sendt"] == "CWA" and (ROD / "cwa" / "Min Bog (2).epub").exists() and u["tilstand"] == "faerdig")
# Genstart: en færdig fil overlever, et job der var i gang bliver "afbrudt".
k = vent(c.post("/e-pub/start", data={"link": "slow"}).json()["id"], slut=("koerer",))
epub._jobs.clear()
epub._indlaes()
tjek("færdig fil overlever genstart", c.get(f"/e-pub/status/{u['id']}").json()["tilstand"] == "faerdig"
and c.get(f"/e-pub/hent/{u['id']}").content == b"PK")
k2 = c.get(f"/e-pub/status/{k['id']}").json()
tjek("igangværende job → afbrudt efter genstart", k2["tilstand"] == "fejl" and "genstartet" in k2["besked"])
time.sleep(3.5) # det gamle job når at time ud; må ikke overskrive noget
config.EPUB_SETTINGS_PATH.write_text(json.dumps({**indst, "auto_send": False, "output_ttl_seconds": 4}))
v = vent(c.post("/e-pub/start", data={"link": "ok-epub 4"}).json()["id"])
time.sleep(1)
tjek("ikke-hentet fil findes stadig inden TTL", c.get(f"/e-pub/status/{v['id']}").json()["tilstand"] == "faerdig")
time.sleep(5)
tjek("ikke-hentet fil udløber efter TTL", c.get(f"/e-pub/status/{u['id']}").json()["tilstand"] == "udloebet"
and not (config.EPUB_SCRATCH / u["id"]).exists())
tjek("job + fil væk efter TTL", c.get(f"/e-pub/status/{v['id']}").status_code == 404
and not (config.EPUB_SCRATCH / v["id"]).exists())
tjek("admin gem validerer", c.post("/admin/epub", data={"tools_dir": "relativ"}, follow_redirects=False).headers["location"].startswith("/admin/epub?saved=Afvist"))
c.post("/admin/epub", data={"tools_dir": "/x", "max_concurrent_jobs": "99", "job_timeout_seconds": "abc", "rp_required": "on"})
s = json.loads(config.EPUB_SETTINGS_PATH.read_text())