From a4b39ae3bf469d5c2be4728689550ec051820d9a Mon Sep 17 00:00:00 2001 From: CodeDevMLH <145071728+CodeDevMLH@users.noreply.github.com> Date: Sun, 15 Feb 2026 00:30:44 +0100 Subject: [PATCH] Add check_backdrop_fields script for testing item details and theme media --- test_scripts/check_backdrop_fields.js | 116 ++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 test_scripts/check_backdrop_fields.js diff --git a/test_scripts/check_backdrop_fields.js b/test_scripts/check_backdrop_fields.js new file mode 100644 index 0000000..5f00c08 --- /dev/null +++ b/test_scripts/check_backdrop_fields.js @@ -0,0 +1,116 @@ +(async () => { + // 1. Initialisierung + const apiClient = window.ApiClient; + if (!apiClient) { + console.error("❌ ApiClient nicht gefunden. Bitte in der Browser-Konsole einer Jellyfin-Seite ausführen."); + return; + } + + // 2. Item ID abfragen oder festlegen + let itemId = prompt("Bitte die Item ID eingeben (von einem Film/Serie mit Theme Video/Backdrop Video):"); + if (!itemId) { + console.warn("Keine Item ID eingegeben. Abbruch."); + return; + } + itemId = itemId.trim(); + + const userId = apiClient.getCurrentUserId(); + console.log(`%c🔍 Untersuche Item: ${itemId}`, "color: #00a4dc; font-size: 1.2em; font-weight: bold;"); + + // 3. Helper Funktion für Fetch requests + const fetchJson = async (url) => { + try { + const res = await fetch(url, { + headers: { + 'Authorization': `MediaBrowser Client="Jellyfin Web", Device="Browser", DeviceId="${apiClient.deviceId()}", Version="${apiClient.appVersion()}", Token="${apiClient.accessToken()}"` + } + }); + if (res.ok) return await res.json(); + console.warn(`⚠️ Request fehlgeschlagen: ${url} (${res.status})`); + return null; + } catch (e) { + console.error(`❌ Fehler bei Request: ${url}`, e); + return null; + } + }; + + // --------------------------------------------------------- + // TEST 1: Standard Item Details mit erweiterten Feldern + // --------------------------------------------------------- + console.group("1. Standard Item Details (mit Fields)"); + const fields = "Overview,RemoteTrailers,MediaSources,LocalTrailerCount,ThemeVideoIds,ThemeSongIds"; + const itemDetailsUrl = `${apiClient.serverAddress()}/Users/${userId}/Items/${itemId}?Fields=${fields}`; + + const item = await fetchJson(itemDetailsUrl); + if (item) { + console.log("Name:", item.Name); + console.log("ThemeVideoIds:", item.ThemeVideoIds); + console.log("ThemeSongIds:", item.ThemeSongIds); + console.log("LocalTrailerCount:", item.LocalTrailerCount); + console.log("RemoteTrailers:", item.RemoteTrailers); + + if (item.ThemeVideoIds && item.ThemeVideoIds.length > 0) { + console.log(`%c✅ ThemeVideoIds gefunden: ${item.ThemeVideoIds.length}`, "color: green; font-weight: bold;"); + } else { + console.log(`%c❌ Keine ThemeVideoIds im Item-Objekt.`, "color: orange;"); + } + } + console.groupEnd(); + + // --------------------------------------------------------- + // TEST 2: ThemeMedia Endpoint + // --------------------------------------------------------- + console.group("2. Endpoint: /Items/{Id}/ThemeMedia"); + const themeMediaUrl = `${apiClient.serverAddress()}/Items/${itemId}/ThemeMedia?userId=${userId}`; + const themeMedia = await fetchJson(themeMediaUrl); + + if (themeMedia) { + console.dir(themeMedia); + if (themeMedia.ThemeVideos && themeMedia.ThemeVideos.length > 0) { + console.log(`%c✅ ThemeVideos gefunden: ${themeMedia.ThemeVideos.length}`, "color: green; font-weight: bold;"); + themeMedia.ThemeVideos.forEach(v => console.log(` - ID: ${v.Id}, Name: ${v.Name}, Path: ${v.Path}`)); + } else { + console.log("❌ Keine ThemeVideos in ThemeMedia gefunden."); + } + } + console.groupEnd(); + + // --------------------------------------------------------- + // TEST 3: ThemeVideos Endpoint (Spezifisch) + // --------------------------------------------------------- + console.group("3. Endpoint: /Items/{Id}/ThemeVideos"); + // Manchmal auch unter Users/{UserId}/Items/{Id}/ThemeVideos + const themeVideosUrl = `${apiClient.serverAddress()}/Items/${itemId}/ThemeVideos?userId=${userId}`; + const themeVideos = await fetchJson(themeVideosUrl); + + if (themeVideos) { + // Kann Array oder Objekt mit Items sein + const videos = Array.isArray(themeVideos) ? themeVideos : (themeVideos.Items || []); + console.dir(videos); + + if (videos.length > 0) { + console.log(`%c✅ ThemeVideos Endpoint lieferte Ergebnisse: ${videos.length}`, "color: green; font-weight: bold;"); + } else { + console.log("❌ ThemeVideos Endpoint lieferte leeres Array."); + } + } + console.groupEnd(); + + // --------------------------------------------------------- + // TEST 4: LocalTrailers Endpoint + // --------------------------------------------------------- + console.group("4. Endpoint: /Items/{Id}/LocalTrailers"); + const localTrailersUrl = `${apiClient.serverAddress()}/Users/${userId}/Items/${itemId}/LocalTrailers`; + const localTrailers = await fetchJson(localTrailersUrl); + + if (localTrailers && localTrailers.length > 0) { + console.log(`%cℹ️ LocalTrailers gefunden: ${localTrailers.length}`, "color: blue;"); + console.dir(localTrailers); + } else { + console.log("❌ Keine LocalTrailers gefunden."); + } + console.groupEnd(); + + console.log("%cFertig.", "font-weight: bold;"); + +})();