/** * Jellyfin Field Mapping * * Maps frontend sort option keys to Jellyfin API field names. * This provides the single source of truth for how different UI sort options * translate to backend database queries. */ /** * Maps friendly sort names to Jellyfin API field names * Used by all library views for consistent sorting */ export const SORT_FIELD_MAP = { // Default/fallback sorts title: "SortName", name: "SortName", // Audio-specific sorts artist: "Artist", album: "Album", year: "ProductionYear", recent: "DatePlayed", added: "DateCreated", rating: "CommunityRating", duration: "RunTimeTicks", // Video-specific sorts dateAdded: "DateCreated", datePlayed: "DatePlayed", IMDBRating: "CommunityRating", // Video series sorts premiered: "PremiereDate", episodeCount: "ChildCount", } as const; /** * Type-safe sort field names */ export type SortField = keyof typeof SORT_FIELD_MAP; /** * Get Jellyfin API field name for a frontend sort key * @param key Frontend sort key (e.g., "artist") * @returns Jellyfin field name (e.g., "Artist") */ export function getJellyfinSortField(key: string): string { const field = SORT_FIELD_MAP[key as SortField]; return field || "SortName"; // Fallback to title sort } /** * Validate sort order string * @param order Sort order value * @returns Valid sort order for Jellyfin API */ export function normalizeSortOrder(order: string | undefined): "Ascending" | "Descending" { if (order === "Descending" || order === "desc" || order === "descending") { return "Descending"; } return "Ascending"; } /** * Jellyfin ItemType constants for filtering * Used in getItems() and search() calls */ export const ITEM_TYPES = { // Audio types AUDIO: "Audio", MUSIC_ALBUM: "MusicAlbum", MUSIC_ARTIST: "MusicArtist", MUSIC_VIDEO: "MusicVideo", // Video types MOVIE: "Movie", SERIES: "Series", SEASON: "Season", EPISODE: "Episode", // Playlist PLAYLIST: "Playlist", } as const; /** * Predefined item type groups for easy filtering */ export const ITEM_TYPE_GROUPS = { audio: [ITEM_TYPES.AUDIO, ITEM_TYPES.MUSIC_ALBUM, ITEM_TYPES.MUSIC_ARTIST], music: [ITEM_TYPES.AUDIO, ITEM_TYPES.MUSIC_ALBUM, ITEM_TYPES.MUSIC_ARTIST], video: [ITEM_TYPES.MOVIE, ITEM_TYPES.SERIES, ITEM_TYPES.EPISODE], movies: [ITEM_TYPES.MOVIE], tvshows: [ITEM_TYPES.SERIES, ITEM_TYPES.SEASON, ITEM_TYPES.EPISODE], episodes: [ITEM_TYPES.EPISODE], } as const;