diff options
Diffstat (limited to 'server/src')
| -rw-r--r-- | server/src/auth.rs | 2 | ||||
| -rw-r--r-- | server/src/compat/youtube.rs | 2 | ||||
| -rw-r--r-- | server/src/main.rs | 2 | ||||
| -rw-r--r-- | server/src/ui/home.rs | 58 | ||||
| -rw-r--r-- | server/src/ui/node.rs | 31 |
5 files changed, 74 insertions, 21 deletions
diff --git a/server/src/auth.rs b/server/src/auth.rs index 68f7542..6463eb1 100644 --- a/server/src/auth.rs +++ b/server/src/auth.rs @@ -32,7 +32,7 @@ pub fn login(state: &State, username: &str, password: &str, expire: Option<i64>) let mut user = None; state.database.transaction(&mut |txn| { user_row = txn.query_single(Query { - filter: Filter::Match(Path(vec![USER_LOGIN.0]), username.as_bytes().to_vec()), + filter: Filter::Match(Path(vec![USER_LOGIN.0]), username.into()), sort: Sort::None, })?; if let Some(ur) = user_row { diff --git a/server/src/compat/youtube.rs b/server/src/compat/youtube.rs index 2ed0406..9d27235 100644 --- a/server/src/compat/youtube.rs +++ b/server/src/compat/youtube.rs @@ -21,7 +21,7 @@ pub fn r_youtube_watch(ri: RequestInfo<'_>, v: &str) -> MyResult<Redirect> { if let Some(row) = txn.query_single(Query { filter: Filter::Match( Path(vec![NO_IDENTIFIERS.0, IDENT_YOUTUBE_VIDEO.0]), - v.as_bytes().to_vec(), + v.into(), ), sort: Sort::None, })? { diff --git a/server/src/main.rs b/server/src/main.rs index 335b960..8b4beb5 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -100,7 +100,7 @@ pub fn create_state() -> Result<Arc<State>> { fn create_admin_user(state: &State) -> Result<()> { state.database.transaction(&mut |txn| { let admin_row = txn.query_single(Query { - filter: Filter::Match(Path(vec![USER_LOGIN.0]), "admin".as_bytes().to_vec()), + filter: Filter::Match(Path(vec![USER_LOGIN.0]), "admin".into()), sort: Sort::None, })?; if admin_row.is_none() { diff --git a/server/src/ui/home.rs b/server/src/ui/home.rs index 99946a0..86b6fbe 100644 --- a/server/src/ui/home.rs +++ b/server/src/ui/home.rs @@ -4,15 +4,16 @@ Copyright (C) 2026 metamuffin <metamuffin.org> */ +use std::time::Instant; + use super::error::MyResult; use crate::{request_info::RequestInfo, ui_responder::UiResponse}; use anyhow::Result; use jellycommon::{ - KIND_VIDEO, NKU_NODE, NLSTYLE_INLINE, NO_KIND, NO_RELEASEDATE, NODELIST_DISPLAYSTYLE, - NODELIST_ITEM, NODELIST_TITLE, VIEW_NODE_LIST, jellyobject::{Object, ObjectBuffer, Path}, + *, }; -use jellydb::{Filter, MultiBehaviour, Query, SortOrder, ValueSort}; +use jellydb::{Filter, MultiBehaviour, Query, Sort, SortOrder, ValueSort}; use rocket::get; #[get("/home")] @@ -21,12 +22,31 @@ pub fn r_home(ri: RequestInfo<'_>) -> MyResult<UiResponse> { let mut page = ObjectBuffer::empty(); - let root = home_row( + let latest_video = home_row( &ri, "home.bin.latest_video", Query { - filter: Filter::Match(Path(vec![NO_KIND.0]), KIND_VIDEO.0.to_be_bytes().to_vec()), - sort: jellydb::Sort::Value(ValueSort { + filter: Filter::All(vec![ + Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()), + Filter::Match(Path(vec![NO_KIND.0]), KIND_VIDEO.into()), + ]), + sort: Sort::Value(ValueSort { + order: SortOrder::Descending, + path: Path(vec![NO_RELEASEDATE.0]), + multi: MultiBehaviour::First, + offset: None, + }), + }, + )?; + let latest_music = home_row( + &ri, + "home.bin.latest_music", + Query { + filter: Filter::All(vec![ + Filter::Match(Path(vec![NO_VISIBILITY.0]), VISI_VISIBLE.into()), + Filter::Match(Path(vec![NO_KIND.0]), KIND_MUSIC.into()), + ]), + sort: Sort::Value(ValueSort { order: SortOrder::Descending, path: Path(vec![NO_RELEASEDATE.0]), multi: MultiBehaviour::First, @@ -34,16 +54,35 @@ pub fn r_home(ri: RequestInfo<'_>) -> MyResult<UiResponse> { }), }, )?; + let max_rating = home_row( + &ri, + "home.bin.max_rating", + Query { + filter: Filter::True, + sort: Sort::Value(ValueSort { + order: SortOrder::Descending, + path: Path(vec![NO_RATINGS.0, RTYP_TMDB.0]), + multi: MultiBehaviour::First, + offset: None, + }), + }, + )?; - page = page - .as_object() - .insert_multi(VIEW_NODE_LIST, &[root.as_object()]); + page = page.as_object().insert_multi( + VIEW_NODE_LIST, + &[ + latest_video.as_object(), + latest_music.as_object(), + max_rating.as_object(), + ], + ); Ok(ri.respond_ui(page)) } fn home_row(ri: &RequestInfo<'_>, title: &str, q: Query) -> Result<ObjectBuffer> { let mut res = ObjectBuffer::empty(); + let t = Instant::now(); ri.state.database.transaction(&mut |txn| { let rows = txn.query(q.clone())?.take(16).collect::<Result<Vec<_>>>()?; @@ -60,5 +99,6 @@ fn home_row(ri: &RequestInfo<'_>, title: &str, q: Query) -> Result<ObjectBuffer> Ok(()) })?; + eprintln!("{:?}", t.elapsed()); Ok(res) } diff --git a/server/src/ui/node.rs b/server/src/ui/node.rs index 4d1fab1..cc23875 100644 --- a/server/src/ui/node.rs +++ b/server/src/ui/node.rs @@ -21,18 +21,18 @@ pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<UiResponse> { let mut children = None; ri.state.database.transaction(&mut |txn| { if let Some(row) = txn.query_single(Query { - filter: Filter::Match(Path(vec![NO_SLUG.0]), slug.as_bytes().to_vec()), + filter: Filter::Match(Path(vec![NO_SLUG.0]), slug.into()), sort: Sort::None, })? { let n = txn.get(row)?.unwrap(); node = Some(Object::EMPTY.insert(NKU_NODE, n.as_object())); - let (order, path) = - if n.as_object().get(NO_KIND).unwrap_or(KIND_COLLECTION) == KIND_CHANNEL { - (SortOrder::Descending, Path(vec![NO_RELEASEDATE.0])) - } else { - (SortOrder::Ascending, Path(vec![NO_TITLE.0])) - }; + let kind = n.as_object().get(NO_KIND).unwrap_or(KIND_COLLECTION); + let (order, path) = match kind { + KIND_CHANNEL => (SortOrder::Descending, Path(vec![NO_RELEASEDATE.0])), + KIND_SEASON | KIND_SHOW => (SortOrder::Ascending, Path(vec![NO_INDEX.0])), + _ => (SortOrder::Ascending, Path(vec![NO_TITLE.0])), + }; let rows = txn .query(Query { @@ -42,7 +42,7 @@ pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<UiResponse> { order, path, }), - filter: Filter::Match(Path(vec![NO_PARENT.0]), row.to_be_bytes().to_vec()), + filter: Filter::Match(Path(vec![NO_PARENT.0]), row.into()), })? .collect::<Result<Vec<_>>>()?; @@ -63,7 +63,20 @@ pub fn r_node(ri: RequestInfo<'_>, slug: &str) -> MyResult<UiResponse> { let children = children.iter().map(|c| c.as_object()).collect::<Vec<_>>(); - let mut children_list = Object::EMPTY.insert(NODELIST_DISPLAYSTYLE, NLSTYLE_GRID); + let kind = node + .as_object() + .get(NKU_NODE) + .unwrap_or_default() + .get(NO_KIND) + .unwrap_or(KIND_COLLECTION); + + let mut children_list = Object::EMPTY.insert( + NODELIST_DISPLAYSTYLE, + match kind { + KIND_SEASON | KIND_SHOW => NLSTYLE_LIST, + _ => NLSTYLE_GRID, + }, + ); children_list = children_list .as_object() .insert_multi(NODELIST_ITEM, &children); |