Add sorting options for content in configuration and update sorting logic

This commit is contained in:
CodeDevMLH
2026-02-09 01:30:28 +01:00
parent 2030538acc
commit 9510ae6ba7
3 changed files with 121 additions and 11 deletions

View File

@@ -51,6 +51,8 @@ const CONFIG = {
customMediaIds: "",
enableLoadingScreen: true,
enableClientSideSettings: false,
sortBy: "Random",
sortOrder: "Ascending",
};
// State management
@@ -460,6 +462,62 @@ waitForApiClientAndInitialize();
* Utility functions for slide creation and management
*/
const SlideUtils = {
/**
* Sorts items based on configuration
* @param {Array<Object>} items - Array of item objects
* @param {string} sortBy - Sort criteria
* @param {string} sortOrder - Sort order 'Ascending' or 'Descending'
* @returns {Array<Object>} Sorted array of items
*/
sortItems(items, sortBy, sortOrder) {
if (sortBy === 'Random' || sortBy === 'Original') {
return items;
}
const simpleCompare = (a, b) => {
if (a < b) return -1;
if (a > b) return 1;
return 0;
};
const sorted = [...items].sort((a, b) => {
let valA, valB;
switch (sortBy) {
case 'DateCreated':
valA = new Date(a.DateCreated).getTime();
valB = new Date(b.DateCreated).getTime();
break;
case 'PremiereDate':
valA = new Date(a.PremiereDate).getTime();
valB = new Date(b.PremiereDate).getTime();
break;
case 'CommunityRating':
valA = a.CommunityRating || 0;
valB = b.CommunityRating || 0;
break;
case 'Runtime':
valA = a.RunTimeTicks || 0;
valB = b.RunTimeTicks || 0;
break;
case 'Name':
valA = (a.Name || '').toLowerCase();
valB = (b.Name || '').toLowerCase();
break;
default:
return 0;
}
return simpleCompare(valA, valB);
});
if (sortOrder === 'Descending') {
sorted.reverse();
}
return sorted;
},
/**
* Shuffles array elements randomly
* @param {Array} array - Array to shuffle
@@ -960,8 +1018,8 @@ const ApiUtils = {
}
const response = await fetch(
`${STATE.jellyfinData.serverAddress}/Items/${itemId}`,
// `${STATE.jellyfinData.serverAddress}/Users/${STATE.jellyfinData.userId}/Items/${itemId}?Fields=Overview,RemoteTrailers,Genres,CommunityRating,CriticRating,OfficialRating,PremiereDate,RunTimeTicks,ProductionYear,MediaSources`,
// `${STATE.jellyfinData.serverAddress}/Items/${itemId}`,
`${STATE.jellyfinData.serverAddress}/Items/${itemId}?Fields=Overview,RemoteTrailers,Genres,CommunityRating,CriticRating,OfficialRating,PremiereDate,ProductionYear,MediaSources,RunTimeTicks`,
{
headers: this.getAuthHeaders(),
}
@@ -1033,8 +1091,16 @@ const ApiUtils = {
console.log("Fetching random items from server...");
let sortParams = `sortBy=${CONFIG.sortBy}`;
if (CONFIG.sortBy === 'Random' || CONFIG.sortBy === 'Original') {
sortParams = 'sortBy=Random';
} else {
sortParams += `&sortOrder=${CONFIG.sortOrder}`;
}
const response = await fetch(
`${STATE.jellyfinData.serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&hasOverview=true&imageTypes=Logo,Backdrop&sortBy=Random&isPlayed=False&enableUserData=true&Limit=${CONFIG.maxItems}&fields=Id`,
`${STATE.jellyfinData.serverAddress}/Items?IncludeItemTypes=Movie,Series&Recursive=true&hasOverview=true&imageTypes=Logo,Backdrop&${sortParams}&isPlayed=False&enableUserData=true&Limit=${CONFIG.maxItems}&fields=Id`,
{
headers: this.getAuthHeaders(),
}
@@ -2550,14 +2616,12 @@ const SlideshowManager = {
const focusElement = document.activeElement;
switch (e.key) {
case "d":
case "D":
case "ArrowRight":
SlideshowManager.nextSlide();
e.preventDefault();
break;
case "a":
case "A":
case "ArrowLeft":
SlideshowManager.prevSlide();
e.preventDefault();
break;
@@ -2776,10 +2840,28 @@ const SlideshowManager = {
if (itemIds.length === 0) {
console.log("No custom list found, fetching random items from server...");
itemIds = await ApiUtils.fetchItemIdsFromServer();
if (CONFIG.sortBy === 'Random') {
itemIds = SlideUtils.shuffleArray(itemIds);
}
} else {
// Custom IDs
if (CONFIG.sortBy === 'Random') {
itemIds = SlideUtils.shuffleArray(itemIds);
} else if (CONFIG.sortBy !== 'Original') {
// Client-side sort required...
console.log(`Sorting ${itemIds.length} custom items by ${CONFIG.sortBy} ${CONFIG.sortOrder}`);
const itemsWithDetails = [];
for (const id of itemIds) {
const item = await ApiUtils.fetchItemDetails(id);
if (item) itemsWithDetails.push(item);
}
const sortedItems = SlideUtils.sortItems(itemsWithDetails, CONFIG.sortBy, CONFIG.sortOrder);
itemIds = sortedItems.map(i => i.Id);
}
}
itemIds = SlideUtils.shuffleArray(itemIds);
STATE.slideshow.itemIds = itemIds;
STATE.slideshow.totalItems = itemIds.length;