diff options
| author | metamuffin <metamuffin@disroot.org> | 2025-11-30 12:32:44 +0100 |
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2025-11-30 12:32:44 +0100 |
| commit | 8174d129fbabd2d39323678d11d868893ddb429a (patch) | |
| tree | 7979a528114cd5fb827f748f678a916e8e8eeddc /logic | |
| parent | 5db15c323d76dca9ae71b0204d63dcb09fbbcbc5 (diff) | |
| download | jellything-8174d129fbabd2d39323678d11d868893ddb429a.tar jellything-8174d129fbabd2d39323678d11d868893ddb429a.tar.bz2 jellything-8174d129fbabd2d39323678d11d868893ddb429a.tar.zst | |
new sync cache
Diffstat (limited to 'logic')
| -rw-r--r-- | logic/src/assets.rs | 158 | ||||
| -rw-r--r-- | logic/src/filter_sort.rs | 10 |
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.)) }), |