aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-17 18:12:40 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-17 18:12:40 +0100
commit95606a9deed45ae285c2d4dee01de9d21a43b044 (patch)
tree0651833f91859561b4e946dde31283d0cbc7cbb4 /server
parent0816c3d092f0da85bc7bfa928d44fc3d4f1fcb90 (diff)
downloadjellything-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.rs53
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)
}