aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-02-05 23:10:15 +0100
committermetamuffin <metamuffin@disroot.org>2025-02-05 23:10:15 +0100
commitdf36a85b54fd427cc0914320d29aa4f005e5aff7 (patch)
tree0702e87d55fe1a7b4d6913a35759e343f9923389 /server
parentfea9d99cef52a8ba258f5c8a11af08ec3304613e (diff)
downloadjellything-df36a85b54fd427cc0914320d29aa4f005e5aff7.tar
jellything-df36a85b54fd427cc0914320d29aa4f005e5aff7.tar.bz2
jellything-df36a85b54fd427cc0914320d29aa4f005e5aff7.tar.zst
trakt episode details
Diffstat (limited to 'server')
-rw-r--r--server/src/routes/ui/node.rs33
-rw-r--r--server/src/routes/ui/sort.rs6
2 files changed, 33 insertions, 6 deletions
diff --git a/server/src/routes/ui/node.rs b/server/src/routes/ui/node.rs
index 337d249..f8b448f 100644
--- a/server/src/routes/ui/node.rs
+++ b/server/src/routes/ui/node.rs
@@ -63,17 +63,20 @@ pub async fn r_library_node_filter<'a>(
.into_iter()
.map(|c| db.get_node_with_userdata(c, &session))
.collect::<anyhow::Result<Vec<_>>>()?;
+ children.retain(|(n, _)| n.visibility >= Visibility::Reduced);
- let parents = node
+ let mut parents = node
.parents
.iter()
.flat_map(|pid| db.get_node(*pid).transpose())
.collect::<Result<Vec<_>, _>>()?;
+ parents.retain(|n| n.visibility >= Visibility::Reduced);
filter_and_sort_nodes(
&filter,
match node.kind {
NodeKind::Channel => (SortProperty::ReleaseDate, SortOrder::Descending),
+ NodeKind::Season | NodeKind::Show => (SortProperty::Index, SortOrder::Ascending),
_ => (SortProperty::Title, SortOrder::Ascending),
},
&mut children,
@@ -115,6 +118,26 @@ markup::define! {
}
}
}
+ NodeCardWide<'a>(node: &'a Node, udata: &'a NodeUserData) {
+ @let cls = format!("node card widecard poster {}", aspect_class(node.kind));
+ div[class=cls] {
+ .poster {
+ a[href=uri!(r_library_node(&node.slug))] {
+ img[src=uri!(r_item_poster(&node.slug, Some(1024))), loading="lazy"];
+ }
+ .cardhover.item {
+ @if node.media.is_some() {
+ a.play.icon[href=&uri!(r_player(&node.slug, PlayerConfig::default()))] { "play_arrow" }
+ }
+ }
+ }
+ div.details {
+ a.title[href=uri!(r_library_node(&node.slug))] { @node.title }
+ @Props { node, udata, full: false }
+ span.overview { @node.description }
+ }
+ }
+ }
NodePage<'a>(id: &'a str, node: &'a Node, udata: &'a NodeUserData, children: &'a [(Arc<Node>, NodeUserData)], parents: &'a [Arc<Node>], filter: &'a NodeFilterSort) {
@if !matches!(node.kind, NodeKind::Collection) {
img.backdrop[src=uri!(r_item_backdrop(id, Some(2048))), loading="lazy"];
@@ -218,15 +241,13 @@ markup::define! {
}
@match node.kind {
NodeKind::Show | NodeKind::Series | NodeKind::Season => {
- ol { @for (c, _) in children.iter() {
- li { a[href=uri!(r_library_node(&c.slug))] { @c.title } }
+ ol { @for (node, udata) in children.iter() {
+ li { @NodeCardWide { node, udata } }
}}
}
NodeKind::Collection | NodeKind::Channel | _ => {
ul.children {@for (node, udata) in children.iter() {
- @if node.visibility != Visibility::Hidden {
- li { @NodeCard { node, udata } }
- }
+ li { @NodeCard { node, udata } }
}}
}
}
diff --git a/server/src/routes/ui/sort.rs b/server/src/routes/ui/sort.rs
index 36250a9..6bee2ef 100644
--- a/server/src/routes/ui/sort.rs
+++ b/server/src/routes/ui/sort.rs
@@ -45,6 +45,7 @@ form_enum!(
enum SortProperty {
ReleaseDate = "release_date",
Title = "title",
+ Index = "index",
Duration = "duration",
RatingRottenTomatoes = "rating_rt",
RatingMetacritic = "rating_mc",
@@ -180,6 +181,11 @@ pub fn filter_and_sort_nodes(
nodes.sort_by_key(|(n, _)| n.release_date.expect("asserted above"))
}
SortProperty::Title => nodes.sort_by(|(a, _), (b, _)| a.title.cmp(&b.title)),
+ SortProperty::Index => nodes.sort_by(|(a, _), (b, _)| {
+ a.index
+ .unwrap_or(usize::MAX)
+ .cmp(&b.index.unwrap_or(usize::MAX))
+ }),
SortProperty::RatingRottenTomatoes => nodes.sort_by_cached_key(|(n, _)| {
SortAnyway(*n.ratings.get(&Rating::RottenTomatoes).unwrap_or(&0.))
}),