Emby-kanalen som førsteklasses kilde: set/favorit virker uden YouTube-bibliotek
Biblioteket er nu valgfrit. Findes hverken kanal eller bibliotek, er svaret ok=False, og fejler opslaget for en bruger, kastes der, så cyklus-sletningen aldrig kører uden alle brugeres favoritter. Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
This commit is contained in:
@@ -54,7 +54,7 @@
|
||||
<div class="setgrid" style="margin-top:.8rem">
|
||||
<label class="fld"><span>Karens efter set (dage)</span><input type="number" name="grace_days" min="0" max="365" value="{{ settings.grace_days }}"></label>
|
||||
<label class="fld"><span>Undertekst-sprog</span><input name="sub_langs" value="{{ settings.sub_langs }}"></label>
|
||||
<label class="fld"><span>Emby-bibliotek</span><input name="library_name" value="{{ settings.library_name }}"></label>
|
||||
<label class="fld"><span>Emby-kanal/bibliotek</span><input name="library_name" value="{{ settings.library_name }}"></label>
|
||||
<label class="fld"><span>Kvalitet (yt-dlp -f)</span><input name="quality" value="{{ settings.quality }}"></label>
|
||||
</div>
|
||||
<p style="margin-top:1rem;display:flex;gap:.6rem;flex-wrap:wrap">
|
||||
|
||||
@@ -1153,34 +1153,32 @@ def _marked_played(ud: dict) -> bool:
|
||||
return bool((ud or {}).get("Played"))
|
||||
|
||||
|
||||
async def _kanal_brugerdata(c, users: list, merged: dict) -> None:
|
||||
"""Læg set/favorit fra Emby-kanalen "YouTube" (kanal-plugin'et) oven i
|
||||
biblioteket for samme fil, så slettereglen og fredningen virker uanset hvor
|
||||
videoen blev set. Kanalens elementer bærer video-id'et i ProviderIds["youtube"];
|
||||
stien findes via indekset. Mangler kanalen eller indekset, sker der intet.
|
||||
(Plugin'et synkroniserer selv kanal og bibliotek; det her er et sikkerhedsnet.)"""
|
||||
async def _kanal_brugerdata(c, users: list, merged: dict, navn: str) -> bool:
|
||||
"""Læg set/favorit fra Emby-kanalen (kanal-plugin'et) ind i `merged`, nøglet på
|
||||
filens sti. Kanalens elementer bærer video-id'et i ProviderIds["youtube"]; stien
|
||||
findes via indekset. Samme video ligger i "Alle videoer" og i playlister, og
|
||||
kopierne deler brugerdata, så det er ligegyldigt hvilken vi læser.
|
||||
|
||||
False hvis kanalen eller indekset mangler. Fejler opslaget for en bruger, kastes
|
||||
der: uden alle brugeres favoritter må slettereglen ikke køre."""
|
||||
try:
|
||||
with open(indeks_sti(), encoding="utf-8") as f:
|
||||
stier = {vid: os.path.realpath(v["path"]) for vid, v in json.load(f)["videos"].items()}
|
||||
except (OSError, ValueError, KeyError):
|
||||
return
|
||||
try:
|
||||
kanaler = await _emby(c, "/Channels", UserId=users[0]) if users else {}
|
||||
except Exception: # noqa: BLE001
|
||||
return
|
||||
return False
|
||||
if not users:
|
||||
return False
|
||||
kanaler = await _emby(c, "/Channels", UserId=users[0])
|
||||
kanal = next((k for k in (kanaler.get("Items") or [])
|
||||
if (k.get("Name") or "").lower() == "youtube"), None)
|
||||
if (k.get("Name") or "").lower() == navn.lower()), None)
|
||||
if not kanal:
|
||||
return
|
||||
return False
|
||||
for uid in users:
|
||||
try:
|
||||
data = await _emby(c, f"/Users/{uid}/Items", ParentId=kanal["Id"],
|
||||
Recursive="true", Fields="ProviderIds,UserData")
|
||||
except Exception: # noqa: BLE001
|
||||
continue
|
||||
data = await _emby(c, f"/Users/{uid}/Items", ParentId=kanal["Id"],
|
||||
Recursive="true", IncludeItemTypes="Video", Fields="ProviderIds,UserData")
|
||||
for it in data.get("Items", []):
|
||||
pid = it.get("ProviderIds") or {}
|
||||
vid = pid.get("YouTube") or pid.get("Youtube") or pid.get("youtube")
|
||||
vid = pid.get("youtube") or pid.get("YouTube") or pid.get("Youtube")
|
||||
sti = stier.get(vid or "")
|
||||
if not sti:
|
||||
continue
|
||||
@@ -1191,38 +1189,43 @@ async def _kanal_brugerdata(c, users: list, merged: dict) -> None:
|
||||
m["played"] = True
|
||||
if ud.get("IsFavorite"):
|
||||
m["favorite"] = True
|
||||
return True
|
||||
|
||||
|
||||
async def emby_yt_items() -> dict:
|
||||
"""Alle videoer i YouTube-biblioteket med set/favorit aggregeret over ALLE brugere."""
|
||||
"""Alle videoer i Emby med set/favorit aggregeret over ALLE brugere.
|
||||
|
||||
Kilden er kanalen fra kanal-plugin'et og/eller et bibliotek med samme navn
|
||||
(standard "YouTube"). Findes ingen af dem, er svaret ok=False, så intet slettes."""
|
||||
settings = get_settings()
|
||||
navn = settings.get("library_name") or "YouTube"
|
||||
out = {"ok": False, "items": [], "error": ""}
|
||||
try:
|
||||
async with httpx.AsyncClient(timeout=45) as c:
|
||||
lib = await _library_id(c, settings.get("library_name") or "YouTube")
|
||||
if not lib:
|
||||
out["error"] = (f"Fandt ikke Emby-biblioteket "
|
||||
f"'{settings.get('library_name')}'")
|
||||
return out
|
||||
users = [u["Id"] for u in await _emby(c, "/Users")]
|
||||
merged = {}
|
||||
for uid in users:
|
||||
data = await _emby(c, f"/Users/{uid}/Items", ParentId=lib,
|
||||
Recursive="true", Fields="Path,UserData")
|
||||
for it in data.get("Items", []):
|
||||
path = it.get("Path") or ""
|
||||
if not path:
|
||||
continue
|
||||
key = os.path.realpath(path)
|
||||
m = merged.setdefault(key, {
|
||||
"id": it["Id"], "name": it.get("Name") or os.path.basename(path),
|
||||
"path": key, "played": False, "favorite": False})
|
||||
ud = it.get("UserData") or {}
|
||||
if _marked_played(ud):
|
||||
m["played"] = True
|
||||
if ud.get("IsFavorite"):
|
||||
m["favorite"] = True
|
||||
await _kanal_brugerdata(c, users, merged)
|
||||
lib = await _library_id(c, navn)
|
||||
if lib:
|
||||
for uid in users:
|
||||
data = await _emby(c, f"/Users/{uid}/Items", ParentId=lib,
|
||||
Recursive="true", Fields="Path,UserData")
|
||||
for it in data.get("Items", []):
|
||||
path = it.get("Path") or ""
|
||||
if not path:
|
||||
continue
|
||||
key = os.path.realpath(path)
|
||||
m = merged.setdefault(key, {
|
||||
"id": it["Id"], "name": it.get("Name") or os.path.basename(path),
|
||||
"path": key, "played": False, "favorite": False})
|
||||
ud = it.get("UserData") or {}
|
||||
if _marked_played(ud):
|
||||
m["played"] = True
|
||||
if ud.get("IsFavorite"):
|
||||
m["favorite"] = True
|
||||
kanal = await _kanal_brugerdata(c, users, merged, navn)
|
||||
if not lib and not kanal:
|
||||
out["error"] = f"Fandt hverken Emby-kanalen eller -biblioteket '{navn}'"
|
||||
return out
|
||||
out["items"] = list(merged.values())
|
||||
out["ok"] = True
|
||||
except Exception as e: # noqa: BLE001
|
||||
|
||||
Reference in New Issue
Block a user