aboutsummaryrefslogtreecommitdiff
path: root/logic
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-11-30 12:32:44 +0100
committermetamuffin <metamuffin@disroot.org>2025-11-30 12:32:44 +0100
commit8174d129fbabd2d39323678d11d868893ddb429a (patch)
tree7979a528114cd5fb827f748f678a916e8e8eeddc /logic
parent5db15c323d76dca9ae71b0204d63dcb09fbbcbc5 (diff)
downloadjellything-8174d129fbabd2d39323678d11d868893ddb429a.tar
jellything-8174d129fbabd2d39323678d11d868893ddb429a.tar.bz2
jellything-8174d129fbabd2d39323678d11d868893ddb429a.tar.zst
new sync cache
Diffstat (limited to 'logic')
-rw-r--r--logic/src/assets.rs158
-rw-r--r--logic/src/filter_sort.rs10
2 files changed, 49 insertions, 119 deletions
diff --git a/logic/src/assets.rs b/logic/src/assets.rs
index 068576b..e5cfada 100644
--- a/logic/src/assets.rs
+++ b/logic/src/assets.rs
@@ -6,125 +6,53 @@
use crate::{DATABASE, session::Session};
use anyhow::{Result, anyhow};
-use jellycommon::{Asset, LocalTrack, NodeID, SourceTrackKind, TrackSource};
+use jellycommon::{NodeID, Picture, SourceTrackKind, TrackSource};
-// pub fn get_node_backdrop(_session: &Session, id: NodeID) -> Result<Asset> {
-// // TODO perm
-// let node = DATABASE
-// .get_node(id)?
-// .ok_or(anyhow!("node does not exist"))?;
+pub async fn get_node_thumbnail(_session: &Session, id: NodeID, t: f64) -> Result<Picture> {
+ let node = DATABASE
+ .get_node(id)?
+ .ok_or(anyhow!("node does not exist"))?;
-// let mut asset = node.backdrop.clone();
-// if asset.is_none()
-// && let Some(parent) = node.parents.last().copied()
-// {
-// let parent = DATABASE
-// .get_node(parent)?
-// .ok_or(anyhow!("node does not exist"))?;
-// asset = parent.backdrop.clone();
-// };
-// Ok(asset.unwrap_or_else(|| {
-// AssetInner::Assets(format!("fallback-{:?}.avif", node.kind).into()).ser()
-// }))
-// }
-// pub fn get_node_poster(_session: &Session, id: NodeID) -> Result<Asset> {
-// // TODO perm
-// let node = DATABASE
-// .get_node(id)?
-// .ok_or(anyhow!("node does not exist"))?;
+ let media = node.media.as_ref().ok_or(anyhow!("no media"))?;
+ let (thumb_track_index, _thumb_track) = media
+ .tracks
+ .iter()
+ .enumerate()
+ .find(|(_i, t)| matches!(t.kind, SourceTrackKind::Video { .. }))
+ .ok_or(anyhow!("no video track to create a thumbnail of"))?;
+ let source = media
+ .tracks
+ .get(thumb_track_index)
+ .ok_or(anyhow!("no source"))?;
+ let thumb_track_source = source.source.clone();
-// let mut asset = node.poster.clone();
-// if asset.is_none()
-// && let Some(parent) = node.parents.last().copied()
-// {
-// let parent = DATABASE
-// .get_node(parent)?
-// .ok_or(anyhow!("node does not exist"))?;
-// asset = parent.poster.clone();
-// };
-// Ok(asset.unwrap_or_else(|| {
-// AssetInner::Assets(format!("fallback-{:?}.avif", node.kind).into()).ser()
-// }))
-// }
+ if t < 0. || t > media.duration {
+ Err(anyhow!("thumbnail instant not within media duration"))?
+ }
-// pub fn get_node_person_asset(
-// _session: &Session,
-// id: NodeID,
-// group: PeopleGroup,
-// index: usize,
-// ) -> Result<Asset> {
-// // TODO perm
+ let step = 8.;
+ let t = (t / step).floor() * step;
-// let node = DATABASE
-// .get_node(id)?
-// .ok_or(anyhow!("node does not exist"))?;
-// let app = node
-// .credits
-// .get(&group)
-// .ok_or(anyhow!("group has no members"))?
-// .get(index)
-// .ok_or(anyhow!("person does not exist"))?;
+ let asset = match thumb_track_source {
+ TrackSource::Local(path, _) => jellytranscoder::thumbnail::create_thumbnail(&path, t)?,
+ TrackSource::Remote(_) => {
+ // // TODO in the new system this is preferrably a property of node ext for regular fed
+ // let session = fed
+ // .get_session(
+ // thumb_track
+ // .federated
+ // .last()
+ // .ok_or(anyhow!("federation broken"))?,
+ // )
+ // .await?;
-// let asset = app
-// .person
-// .headshot
-// .to_owned()
-// .unwrap_or(AssetInner::Assets("fallback-Person.avif".into()).ser());
+ // async_cache_file("fed-thumb", (id.0, t as i64), |out| {
+ // session.node_thumbnail(out, id.0.into(), 2048, t)
+ // })
+ // .await?
+ todo!()
+ }
+ };
-// Ok(asset)
-// }
-
-// pub async fn get_node_thumbnail(_session: &Session, id: NodeID, t: f64) -> Result<Asset> {
-// let node = DATABASE
-// .get_node(id)?
-// .ok_or(anyhow!("node does not exist"))?;
-
-// let media = node.media.as_ref().ok_or(anyhow!("no media"))?;
-// let (thumb_track_index, _thumb_track) = media
-// .tracks
-// .iter()
-// .enumerate()
-// .find(|(_i, t)| matches!(t.kind, SourceTrackKind::Video { .. }))
-// .ok_or(anyhow!("no video track to create a thumbnail of"))?;
-// let source = media
-// .tracks
-// .get(thumb_track_index)
-// .ok_or(anyhow!("no source"))?;
-// let thumb_track_source = source.source.clone();
-
-// if t < 0. || t > media.duration {
-// Err(anyhow!("thumbnail instant not within media duration"))?
-// }
-
-// let step = 8.;
-// let t = (t / step).floor() * step;
-
-// let asset = match thumb_track_source {
-// TrackSource::Local(a) => {
-// let AssetInner::LocalTrack(LocalTrack { path, .. }) = AssetInner::deser(&a.0)? else {
-// return Err(anyhow!("track set to wrong asset type"));
-// };
-// // the track selected might be different from thumb_track
-// jellytranscoder::thumbnail::create_thumbnail(&path, t).await?
-// }
-// TrackSource::Remote(_) => {
-// // // TODO in the new system this is preferrably a property of node ext for regular fed
-// // let session = fed
-// // .get_session(
-// // thumb_track
-// // .federated
-// // .last()
-// // .ok_or(anyhow!("federation broken"))?,
-// // )
-// // .await?;
-
-// // async_cache_file("fed-thumb", (id.0, t as i64), |out| {
-// // session.node_thumbnail(out, id.0.into(), 2048, t)
-// // })
-// // .await?
-// todo!()
-// }
-// };
-
-// Ok(AssetInner::Cache(asset).ser())
-// }
+ Ok(Picture(asset.0))
+}
diff --git a/logic/src/filter_sort.rs b/logic/src/filter_sort.rs
index d3244af..af88333 100644
--- a/logic/src/filter_sort.rs
+++ b/logic/src/filter_sort.rs
@@ -70,10 +70,12 @@ pub fn filter_and_sort_nodes(
SortProperty::RatingMetacritic => nodes.sort_by_cached_key(|(n, _)| {
SortAnyway(*n.ratings.get(&RatingType::Metacritic).unwrap_or(&0.))
}),
- SortProperty::RatingImdb => nodes
- .sort_by_cached_key(|(n, _)| SortAnyway(*n.ratings.get(&RatingType::Imdb).unwrap_or(&0.))),
- SortProperty::RatingTmdb => nodes
- .sort_by_cached_key(|(n, _)| SortAnyway(*n.ratings.get(&RatingType::Tmdb).unwrap_or(&0.))),
+ SortProperty::RatingImdb => nodes.sort_by_cached_key(|(n, _)| {
+ SortAnyway(*n.ratings.get(&RatingType::Imdb).unwrap_or(&0.))
+ }),
+ SortProperty::RatingTmdb => nodes.sort_by_cached_key(|(n, _)| {
+ SortAnyway(*n.ratings.get(&RatingType::Tmdb).unwrap_or(&0.))
+ }),
SortProperty::RatingYoutubeViews => nodes.sort_by_cached_key(|(n, _)| {
SortAnyway(*n.ratings.get(&RatingType::YoutubeViews).unwrap_or(&0.))
}),