/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2026 metamuffin */ use super::error::MyResult; use crate::{request_info::RequestInfo, ui_responder::UiResponse}; use anyhow::Result; use jellycommon::{ jellyobject::{Object, ObjectBuffer, ObjectBufferBuilder, Path}, *, }; use jellydb::{Filter, MultiBehaviour, Query, Sort, SortOrder, ValueSort}; use jellyui::tr; use rocket::get; #[get("/home")] pub fn r_home(ri: RequestInfo<'_>) -> MyResult { ri.require_user()?; let mut page = ObjectBufferBuilder::default(); page.push(VIEW_TITLE, &&*tr(ri.lang, "home")); page.push( VIEW_NODE_LIST, home_row( &ri, "home.bin.latest_video", Query { 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, }), }, )? .as_object(), ); page.push( VIEW_NODE_LIST, 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, offset: None, }), }, )? .as_object(), ); page.push( VIEW_NODE_LIST, 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, }), }, )? .as_object(), ); Ok(ri.respond_ui(page.finish())) } fn home_row(ri: &RequestInfo<'_>, title: &str, q: Query) -> Result { let mut res = ObjectBuffer::empty(); ri.state.database.transaction(&mut |txn| { let rows = txn.query(q.clone())?.take(16).collect::>>()?; 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::>(); // 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) }