diff --git a/test_scripts/test_direct_date_created.js b/test_scripts/test_direct_date_created.js new file mode 100644 index 0000000..20e0981 --- /dev/null +++ b/test_scripts/test_direct_date_created.js @@ -0,0 +1,73 @@ +(async () => { + const apiClient = window.ApiClient; + if (!apiClient) { + console.error("ApiClient not found. Are you logged in?"); + return; + } + + const userId = apiClient.getCurrentUserId(); + const serverAddress = apiClient.serverAddress(); + + const maxDaysRecent = 30; // 30 Tage Limit + const pastDate = new Date(); + pastDate.setDate(pastDate.getDate() - maxDaysRecent); + const dateStr = pastDate.toISOString(); + + console.log(`\n%c=== TEST: DateCreated Direkt-Abfrage ===`, "color: #00a4dc; font-weight: bold; font-size: 14px;"); + console.log(`Wir suchen Filme, die nach dem ${dateStr} hinzugefügt wurden.\n`); + + // Wir probieren alle denkbaren Parameter-Schreibweisen aus, + // die Jellyfin historisch oder in Forks für "DateCreated" akzeptieren könnte. + const testCases = [ + { name: "MinDateCreated (PascalCase)", param: `MinDateCreated=${dateStr}` }, + { name: "minDateCreated (camelCase)", param: `minDateCreated=${dateStr}` }, + { name: "DateCreatedMin", param: `DateCreatedMin=${dateStr}` }, + { name: "dateCreatedMin", param: `dateCreatedMin=${dateStr}` }, + { name: "StartDate", param: `StartDate=${dateStr}` }, + { name: "startDate", param: `startDate=${dateStr}` } + ]; + + try { + for (let i = 0; i < testCases.length; i++) { + const test = testCases[i]; + const apiUrl = `${serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&enableUserData=true&Limit=5&fields=Id,DateCreated&userId=${userId}&${test.param}`; + + console.log(`%cTest ${i+1}: ${test.name}`, "color: yellow;"); + console.log(`URL: ${apiUrl}`); + + const response = await fetch(apiUrl, { + headers: { + Authorization: `MediaBrowser Client="${apiClient.appName()}", Device="${apiClient.deviceName()}", DeviceId="${apiClient.deviceId()}", Version="${apiClient.appVersion()}", Token="${apiClient.accessToken()}"` + } + }); + + if (!response.ok) { + console.error(`-> ❌ HTTP Fehler: ${response.status}`); + continue; + } + + const data = await response.json(); + const items = data.Items || []; + + // Zur Auswertung: Wenn die Abfrage ignoriert wird, liefert er oft ALLE (hier max 5) zurück. + // Filtert er wirklich, sollten es WENIGER als 5, und zwar im besten Fall genau die RICHTIGEN sein. + console.log(`-> Ergebnis: ${items.length} Items zurückgeliefert.`); + + if (items.length > 0) { + // Wir checken, ob die zurückgelieferten Items WIRKLICH neu sind + const oldItems = items.filter(item => new Date(item.DateCreated) < pastDate); + if (oldItems.length > 0) { + console.log(` ❌ Filter FEHLGESCHLAGEN: Es wurden ${oldItems.length} "alte" Filme zurückgegeben (z.B. ${oldItems[0].Name}). Er ignoriert also den Parameter.`); + } else { + console.log(` ✅ Filter KÖNNTE funktionieren: Alle zurückgegebenen Filme sind neuer als unser Datum! (Erster: ${items[0].Name})`); + } + } else { + console.log(` ❓ Keine Items gefunden (entweder strenger Filter oder gar keine neuen Filme vorhanden).`); + } + console.log("\n"); + } + + } catch (error) { + console.error("Fehler beim Abruf:", error); + } +})(); diff --git a/test_scripts/test_filters_dates.js b/test_scripts/test_filters_dates.js new file mode 100644 index 0000000..a3b26cf --- /dev/null +++ b/test_scripts/test_filters_dates.js @@ -0,0 +1,56 @@ +(async () => { + const apiClient = window.ApiClient; + if (!apiClient) { + console.error("ApiClient not found. Are you logged in?"); + return; + } + + const userId = apiClient.getCurrentUserId(); + const serverAddress = apiClient.serverAddress(); + + const maxDaysRecent = 30; // Test: Added in last 30 days + const pastDate = new Date(); + pastDate.setDate(pastDate.getDate() - maxDaysRecent); + const dateStr = pastDate.toISOString(); + + console.log(`Searching for items added after: ${dateStr}`); + + const testUrls = [ + // Test 1: minDateCreated (CamelCase) + `${serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&enableUserData=true&Limit=5&fields=Id,DateCreated&userId=${userId}&minDateCreated=${dateStr}`, + // Test 2: minDateLastSaved + `${serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&enableUserData=true&Limit=5&fields=Id,DateCreated&userId=${userId}&minDateLastSaved=${dateStr}`, + ]; + + try { + for (let i = 0; i < testUrls.length; i++) { + const apiUrl = testUrls[i]; + console.log(`\n%cTest ${i+1}: Testing URL:\n${apiUrl}`, "color: yellow;"); + + const response = await fetch(apiUrl, { + headers: { + Authorization: `MediaBrowser Client="${apiClient.appName()}", Device="${apiClient.deviceName()}", DeviceId="${apiClient.deviceId()}", Version="${apiClient.appVersion()}", Token="${apiClient.accessToken()}"` + } + }); + + if (!response.ok) { + console.error(`Failed to fetch items: ${response.status} ${response.statusText}`); + continue; + } + + const data = await response.json(); + const items = data.Items || []; + + console.log(`%cErgebnis: ${items.length} Items gefunden!`, "color: #00a4dc; font-weight: bold;"); + + if(items.length > 0) { + console.log("Gefundene Items:"); + items.forEach(item => { + console.log(`- Name: ${item.Name}, DateCreated: ${item.DateCreated}, Art: ${item.Type}`); + }); + } + } + } catch (error) { + console.error("Fehler beim Abrufen der URL:", error); + } +})(); diff --git a/test_scripts/test_filters_dates_final.js b/test_scripts/test_filters_dates_final.js new file mode 100644 index 0000000..75d6897 --- /dev/null +++ b/test_scripts/test_filters_dates_final.js @@ -0,0 +1,72 @@ +(async () => { + const apiClient = window.ApiClient; + if (!apiClient) { + console.error("ApiClient not found. Are you logged in?"); + return; + } + + const userId = apiClient.getCurrentUserId(); + const serverAddress = apiClient.serverAddress(); + + const maxDaysRecent = 30; // Test: Added in last 30 days + + // 1. Calculate the cutoff date + const pastDate = new Date(); + pastDate.setDate(pastDate.getDate() - maxDaysRecent); + const dateStr = pastDate.toISOString(); + + console.log(`\n%c=== TEST: 2-Stufen "Zuletzt Hinzugefügt" Filter ===`, "color: #00a4dc; font-weight: bold; font-size: 14px;"); + console.log(`Suche Items neuer als: ${dateStr} (${maxDaysRecent} Tage alt)\n`); + + const apiUrl = `${serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&enableUserData=true&Limit=50&fields=Id,DateCreated&userId=${userId}&minDateLastSaved=${dateStr}`; + + try { + console.log(`%cSchritt 1: API Call mit minDateLastSaved...`, "color: yellow;"); + console.log(`URL: ${apiUrl}`); + + const response = await fetch(apiUrl, { + headers: { + Authorization: `MediaBrowser Client="${apiClient.appName()}", Device="${apiClient.deviceName()}", DeviceId="${apiClient.deviceId()}", Version="${apiClient.appVersion()}", Token="${apiClient.accessToken()}"` + } + }); + + if (!response.ok) { + throw new Error(`Failed to fetch items: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + let items = data.Items || []; + + console.log(`-> API lieferte ${items.length} potenziell neue/geänderte Items zurück.\n`); + if (items.length > 0) { + console.log("Die API hielt diese Items für neu/aktuell:"); + items.forEach(item => console.log(` - ${item.Name} (DateCreated: ${item.DateCreated})`)); + } + + console.log(`\n%cSchritt 2: Lokaler DateCreated Filter (Wie das Plugin ihn jetzt nutzt)...`, "color: yellow;"); + + // Exakt dieser Filter-Block ist jetzt auch so in mediaBarEnhanced.js + const finalItems = items.filter(item => { + if (!item.DateCreated) return true; // Fallback falls Jellyfin kein Datum schickt + const dCreated = new Date(item.DateCreated); + return dCreated >= pastDate; + }); + + console.log(`%c-> FINALES ERGEBNIS: ${finalItems.length} echte Neuzugänge bleiben übrig!`, "color: #00ff00; font-weight: bold; font-size: 14px;"); + + if(finalItems.length > 0) { + console.log("Diese Items schaffen es in die Slideshow:"); + finalItems.forEach(item => { + console.log(` 🎬 Name: ${item.Name}, DateCreated: ${item.DateCreated}`); + }); + } + + // Teste den Fallback + if(finalItems.length === 0 && items.length > 0) { + console.log("\n%c💡 HINWEIS: Da nach Filterung 0 Items übrig bleiben, greift in der Slideshow jetzt automatisch unser Fallback und zeigt zufällige Filme aller Jahre!", "color: orange;"); + } + + } catch (error) { + console.error("Fehler beim Abruf:", error); + } +})(); diff --git a/test_scripts/test_filters_url.js b/test_scripts/test_filters_url.js new file mode 100644 index 0000000..18fc45f --- /dev/null +++ b/test_scripts/test_filters_url.js @@ -0,0 +1,62 @@ +(async () => { + const apiClient = window.ApiClient; + if (!apiClient) { + console.error("ApiClient not found. Are you logged in?"); + return; + } + + const userId = apiClient.getCurrentUserId(); + const serverAddress = apiClient.serverAddress(); + + // Example test configuration flags + const maxItems = 50; + const includeWatchedContent = false; // set to false to ONLY show unplayed (newly watched) + const maxParentalRating = 12; // Test age limit + const maxDaysRecent = 30; // Test recency limit + + // Build the query parameters just like in mediaBarEnhanced.js + const sortParams = "sortBy=Random"; + const playedFilter = includeWatchedContent ? '' : '&isPlayed=False'; + + let parentalFilter = ''; + if (maxParentalRating) { + parentalFilter = `&MaxOfficialRating=${maxParentalRating}`; + } + + let dateFilter = ''; + if (maxDaysRecent) { + const pastDate = new Date(); + pastDate.setDate(pastDate.getDate() - maxDaysRecent); + dateFilter = `&MinDateCreated=${pastDate.toISOString()}`; + } + + const apiUrl = `${serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&hasOverview=true&imageTypes=Logo,Backdrop&${sortParams}${playedFilter}${parentalFilter}${dateFilter}&enableUserData=true&Limit=${maxItems}&fields=Id&userId=${userId}`; + + try { + console.log(`Testing generated URL with filters:\n%c${apiUrl}`, "color: yellow;"); + + // Execute the fetch + const response = await fetch(apiUrl, { + headers: { + Authorization: `MediaBrowser Client="${apiClient.appName()}", Device="${apiClient.deviceName()}", DeviceId="${apiClient.deviceId()}", Version="${apiClient.appVersion()}", Token="${apiClient.accessToken()}"` + } + }); + + if (!response.ok) { + throw new Error(`Failed to fetch items: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + const items = data.Items || []; + + console.log(`%cErgebnis: ${items.length} Items gefunden!`, "color: #00a4dc; font-weight: bold;"); + + if(items.length > 0) { + console.log("Erstes Item als Beispiel:"); + console.dir(items[0]); + } + + } catch (error) { + console.error("Fehler beim Abrufen der URL:", error); + } +})();