diff options
| author | metamuffin <metamuffin@disroot.org> | 2026-02-17 18:12:40 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2026-02-17 18:12:40 +0100 |
| commit | 95606a9deed45ae285c2d4dee01de9d21a43b044 (patch) | |
| tree | 0651833f91859561b4e946dde31283d0cbc7cbb4 /server | |
| parent | 0816c3d092f0da85bc7bfa928d44fc3d4f1fcb90 (diff) | |
| download | jellything-95606a9deed45ae285c2d4dee01de9d21a43b044.tar jellything-95606a9deed45ae285c2d4dee01de9d21a43b044.tar.bz2 jellything-95606a9deed45ae285c2d4dee01de9d21a43b044.tar.zst | |
inline node lists and home page
Diffstat (limited to 'server')
| -rw-r--r-- | server/src/ui/home.rs | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/server/src/ui/home.rs b/server/src/ui/home.rs index 2fb4903..99946a0 100644 --- a/server/src/ui/home.rs +++ b/server/src/ui/home.rs @@ -6,10 +6,59 @@ use super::error::MyResult; use crate::{request_info::RequestInfo, ui_responder::UiResponse}; -use jellycommon::jellyobject::ObjectBuffer; +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 rocket::get; #[get("/home")] pub fn r_home(ri: RequestInfo<'_>) -> MyResult<UiResponse> { - Ok(ri.respond_ui(ObjectBuffer::new(&mut []))) + ri.require_user()?; + + let mut page = ObjectBuffer::empty(); + + let root = 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 { + order: SortOrder::Descending, + path: Path(vec![NO_RELEASEDATE.0]), + multi: MultiBehaviour::First, + offset: None, + }), + }, + )?; + + page = page + .as_object() + .insert_multi(VIEW_NODE_LIST, &[root.as_object()]); + + Ok(ri.respond_ui(page)) +} + +fn home_row(ri: &RequestInfo<'_>, title: &str, q: Query) -> Result<ObjectBuffer> { + let mut res = ObjectBuffer::empty(); + ri.state.database.transaction(&mut |txn| { + let rows = txn.query(q.clone())?.take(16).collect::<Result<Vec<_>>>()?; + + let mut nkus = Vec::new(); + for (row, _) in rows { + let node = txn.get(row)?.unwrap(); + nkus.push(ObjectBuffer::new(&mut [(NKU_NODE.0, &node.as_object())])); + } + let nkus = nkus.iter().map(|n| n.as_object()).collect::<Vec<_>>(); // TODO -_- + + res = Object::EMPTY.insert(NODELIST_DISPLAYSTYLE, NLSTYLE_INLINE); + res = res.as_object().insert(NODELIST_TITLE, title); + res = res.as_object().insert_multi(NODELIST_ITEM, &nkus); + + Ok(()) + })?; + Ok(res) } |