feat(yt): slet-knap på hentede videoer
Hver række under "Hentede videoer" på /admin/yt har nu en Slet-knap (med bekræftelse; nævner det, hvis videoen er favorit). Sletningen bruger samme sikkerhedsnet som oprydningen: kun filer portalen selv har hentet, og undertekster/miniature slettes med. Er det jobbets sidste fil, markeres jobbet som slettet, og Emby-biblioteket opdateres. Video-id'et bliver i abonnementets "seen", så en overvåget kanal ikke henter den igen. Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
This commit is contained in:
@@ -488,6 +488,44 @@ async def enforce_cycles() -> dict:
|
||||
return res
|
||||
|
||||
|
||||
def delete_video(path: str) -> dict:
|
||||
"""Slet én video manuelt (knappen på /admin/yt), med samme sikkerhedsnet som
|
||||
oprydningen: KUN filer portalen selv har hentet, og sidecars med.
|
||||
|
||||
Video-id'et bliver stående i abonnementets `seen`, så en overvåget kanal ikke
|
||||
henter den igen. Er det jobbets sidste fil, markeres jobbet som slettet.
|
||||
"""
|
||||
real = os.path.realpath(path or "")
|
||||
if real not in owned_paths():
|
||||
return {"ok": False, "error": "Den video har portalen ikke selv hentet, så den røres ikke"}
|
||||
st = get_state()
|
||||
try:
|
||||
size = file_size(real)
|
||||
for side in _sidecars(real):
|
||||
os.remove(side)
|
||||
if os.path.exists(real):
|
||||
os.remove(real)
|
||||
except OSError as e:
|
||||
return {"ok": False, "error": f"Kunne ikke slette: {e}"}
|
||||
st["leaving"].pop(real, None)
|
||||
titel = os.path.basename(real)
|
||||
for j in st["jobs"].values():
|
||||
paths = [p for p in (j.get("paths") or ([j["path"]] if j.get("path") else [])) if p]
|
||||
if real not in {os.path.realpath(p) for p in paths}:
|
||||
continue
|
||||
titel = j.get("title") or titel
|
||||
rest = [p for p in paths if os.path.realpath(p) != real]
|
||||
if j.get("paths") is not None:
|
||||
j["paths"] = rest
|
||||
if j.get("videos"):
|
||||
j["videos"] = [v for v in j["videos"] if os.path.realpath(v.get("path") or "") != real]
|
||||
if not rest:
|
||||
j["status"] = "deleted"
|
||||
_log(st, f"Slettet manuelt: {titel} ({_human(size)})")
|
||||
save_state(st)
|
||||
return {"ok": True, "title": titel, "size": size}
|
||||
|
||||
|
||||
# ---------------- Emby ----------------
|
||||
async def _emby(client, path, **params):
|
||||
params["api_key"] = config.EMBY_API_KEY
|
||||
|
||||
Reference in New Issue
Block a user