aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2026-02-18 13:25:24 +0100
committermetamuffin <metamuffin@disroot.org>2026-02-18 13:25:24 +0100
commit45a485431df0638396f0175de59275b3b5538022 (patch)
tree4993b5b8b598d6de1036308d32b50d078fd0e365 /server
parent3bbedf5ab337d8c6d608ed0b24b9c656b0ee1004 (diff)
downloadjellything-45a485431df0638396f0175de59275b3b5538022.tar
jellything-45a485431df0638396f0175de59275b3b5538022.tar.bz2
jellything-45a485431df0638396f0175de59275b3b5538022.tar.zst
wide card; node visi; import children plugin
Diffstat (limited to 'server')
-rw-r--r--server/src/auth.rs2
-rw-r--r--server/src/compat/youtube.rs2
-rw-r--r--server/src/main.rs2
-rw-r--r--server/src/ui/home.rs58
-rw-r--r--server/src/ui/node.rs31
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);