diff --git a/templates/admin_yt.html b/templates/admin_yt.html index 2ab035f..309e91c 100644 --- a/templates/admin_yt.html +++ b/templates/admin_yt.html @@ -54,7 +54,7 @@
- +

diff --git a/ytdl.py b/ytdl.py index c7f968c..3c19bac 100644 --- a/ytdl.py +++ b/ytdl.py @@ -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