diff --git a/src/core/jellyfin.rs b/src/core/jellyfin.rs index d302b4c..bdcc9bf 100644 --- a/src/core/jellyfin.rs +++ b/src/core/jellyfin.rs @@ -153,15 +153,21 @@ impl JellyfinClient { ) -> Result { let url = format!("{}/Users/{}/Items", self.base_url, user_id); - let mut sort_by = "SortName"; - - if let Some(types) = query.include_item_types.as_deref() { + let default_sort_by = if let Some(types) = query.include_item_types.as_deref() { if types.contains("Episode") { - sort_by = "ParentIndexNumber,IndexNumber,SortName"; - } else if types.contains("Audio") { - sort_by = "SortName"; + "ParentIndexNumber,IndexNumber,SortName".to_string() + } else { + "SortName".to_string() } - } + } else { + "SortName".to_string() + }; + + let sort_by = query.sort_by.clone().unwrap_or(default_sort_by); + let sort_order = query + .sort_order + .clone() + .unwrap_or_else(|| "Ascending".to_string()); let recursive = if query.recursive { "true" } else { "false" }; @@ -174,8 +180,8 @@ impl JellyfinClient { ("StartIndex", &start_index.to_string()), ("Limit", &limit.to_string()), ("Fields", "PrimaryImageAspectRatio,SortName,ProductionYear,IndexNumber,ParentIndexNumber,RunTimeTicks,Genres,Studios,Overview,SeriesName,Album,AlbumArtist,Artists,UserData,ChildCount,RecursiveItemCount"), - ("SortBy", sort_by), - ("SortOrder", "Ascending"), + ("SortBy", &sort_by), + ("SortOrder", &sort_order), ]); if let Some(types) = query.include_item_types.as_deref() { @@ -280,8 +286,13 @@ pub struct LibraryQuery { pub search_term: Option, // e.g. Some("matrix".into()) pub recursive: bool, // true for big lists, false for drilldown pub filters: Option, // e.g. Some("IsResumable".into()) + + // optional overrides + pub sort_by: Option, // e.g. Some("DateCreated".into()) + pub sort_order: Option, // "Ascending" or "Descending" } + impl LibraryQuery { pub fn movies() -> Self { Self { @@ -290,6 +301,8 @@ impl LibraryQuery { search_term: None, recursive: true, filters: None, + sort_by: None, + sort_order: None, } } pub fn shows() -> Self { @@ -299,6 +312,8 @@ impl LibraryQuery { search_term: None, recursive: true, filters: None, + sort_by: None, + sort_order: None, } } pub fn music() -> Self { @@ -308,6 +323,8 @@ impl LibraryQuery { search_term: None, recursive: true, filters: None, + sort_by: None, + sort_order: None, } } @@ -319,6 +336,8 @@ impl LibraryQuery { search_term: None, recursive: true, filters: None, + sort_by: None, + sort_order: None, } } @@ -342,6 +361,16 @@ impl LibraryQuery { self.filters = Some(filters.into()); self } + + pub fn with_sort_by(mut self, sort_by: impl Into) -> Self { + self.sort_by = Some(sort_by.into()); + self + } + + pub fn with_sort_order(mut self, sort_order: impl Into) -> Self { + self.sort_order = Some(sort_order.into()); + self + } } diff --git a/src/main.rs b/src/main.rs index 834262e..80f6851 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1012,6 +1012,22 @@ fn handle_key(app: &mut App, code: KeyCode) { "Shows" => core::jellyfin::LibraryQuery::shows(), "Music" => core::jellyfin::LibraryQuery::music(), "Playlists" => core::jellyfin::LibraryQuery::all().with_item_types("Playlist"), + + // NEW + "Collections" => core::jellyfin::LibraryQuery::all() + .with_item_types("BoxSet"), + + "Continue Watching" => core::jellyfin::LibraryQuery::all() + .with_item_types("Episode,Movie") + .with_filters("IsResumable") + .with_sort_by("DatePlayed") + .with_sort_order("Descending"), + + "Recently Added" => core::jellyfin::LibraryQuery::all() + .with_item_types("Movie,Series") + .with_sort_by("DateCreated,SortName") + .with_sort_order("Descending"), + _ => { app.status = format!("Not wired yet: {}", cat); return; } };