diff options
author | metamuffin <metamuffin@disroot.org> | 2025-05-26 18:24:16 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-05-26 18:24:16 +0200 |
commit | 3b15caade07e8fbe351fed9aceb3f435bf58368e (patch) | |
tree | cce91c229b78061ad36f29d76a76d67c3c737c59 /server/src/ui/assets.rs | |
parent | 1eeff5c03e8985d16d4f2b6283741dd82b369bd3 (diff) | |
download | jellything-3b15caade07e8fbe351fed9aceb3f435bf58368e.tar jellything-3b15caade07e8fbe351fed9aceb3f435bf58368e.tar.bz2 jellything-3b15caade07e8fbe351fed9aceb3f435bf58368e.tar.zst |
move all direct database access to logic crate
Diffstat (limited to 'server/src/ui/assets.rs')
-rw-r--r-- | server/src/ui/assets.rs | 129 |
1 files changed, 21 insertions, 108 deletions
diff --git a/server/src/ui/assets.rs b/server/src/ui/assets.rs index 4e09417..97fd9c7 100644 --- a/server/src/ui/assets.rs +++ b/server/src/ui/assets.rs @@ -4,13 +4,19 @@ Copyright (C) 2025 metamuffin <metamuffin.org> */ use super::error::MyResult; -use crate::{helper::{cache::CacheControlFile, A}, CONF}; +use crate::{ + helper::{cache::CacheControlFile, A}, + CONF, +}; use anyhow::{anyhow, bail, Context}; -use jellycommon::{LocalTrack, NodeID, PeopleGroup, SourceTrackKind, TrackSource}; +use jellycommon::{NodeID, PeopleGroup}; use jellyimport::asset_token::AssetInner; -use jellylogic::{session::Session, Database}; +use jellylogic::{ + assets::{get_node_backdrop, get_node_person_asset, get_node_poster, get_node_thumbnail}, + session::Session, +}; use log::info; -use rocket::{get, http::ContentType, response::Redirect, State}; +use rocket::{get, http::ContentType, response::Redirect}; use std::path::PathBuf; pub const AVIF_QUALITY: f32 = 50.; @@ -25,7 +31,6 @@ pub async fn r_asset( let width = width.unwrap_or(2048); let asset = AssetInner::deser(token)?; - let path = // if let AssetInner::Federated { host, asset } = asset { // let session = fed.get_session(&host).await?; @@ -35,7 +40,7 @@ pub async fn r_asset( // }) // .await? // } else - { + let path = { let source = resolve_asset(asset).await.context("resolving asset")?; // fit the resolution into a finite set so the maximum cache is finite too. @@ -62,136 +67,44 @@ pub async fn resolve_asset(asset: AssetInner) -> anyhow::Result<PathBuf> { #[get("/n/<id>/poster?<width>")] pub async fn r_item_poster( - _session: A<Session>, - db: &State<Database>, + session: A<Session>, id: A<NodeID>, width: Option<usize>, ) -> MyResult<Redirect> { - // TODO perm - let node = db.get_node(id.0)?.ok_or(anyhow!("node does not exist"))?; - - let mut asset = node.poster.clone(); - if asset.is_none() { - if let Some(parent) = node.parents.last().copied() { - let parent = db.get_node(parent)?.ok_or(anyhow!("node does not exist"))?; - asset = parent.poster.clone(); - } - }; - let asset = asset.unwrap_or_else(|| { - AssetInner::Assets(format!("fallback-{:?}.avif", node.kind).into()).ser() - }); + let asset = get_node_poster(&session.0, id.0)?; Ok(Redirect::permanent(rocket::uri!(r_asset(asset.0, width)))) } #[get("/n/<id>/backdrop?<width>")] pub async fn r_item_backdrop( - _session: A<Session>, - db: &State<Database>, + session: A<Session>, id: A<NodeID>, width: Option<usize>, ) -> MyResult<Redirect> { - // TODO perm - let node = db.get_node(id.0)?.ok_or(anyhow!("node does not exist"))?; - - let mut asset = node.backdrop.clone(); - if asset.is_none() { - if let Some(parent) = node.parents.last().copied() { - let parent = db.get_node(parent)?.ok_or(anyhow!("node does not exist"))?; - asset = parent.backdrop.clone(); - } - }; - let asset = asset.unwrap_or_else(|| { - AssetInner::Assets(format!("fallback-{:?}.avif", node.kind).into()).ser() - }); + let asset = get_node_backdrop(&session.0, id.0)?; Ok(Redirect::permanent(rocket::uri!(r_asset(asset.0, width)))) } #[get("/n/<id>/person/<index>/asset?<group>&<width>")] pub async fn r_person_asset( - _session: A<Session>, - db: &State<Database>, + session: A<Session>, id: A<NodeID>, index: usize, group: String, width: Option<usize>, ) -> MyResult<Redirect> { - // TODO perm - - let node = db.get_node(id.0)?.ok_or(anyhow!("node does not exist"))?; - let app = node - .people - .get(&PeopleGroup::from_str_opt(&group).ok_or(anyhow!("unknown people group"))?) - .ok_or(anyhow!("group has no members"))? - .get(index) - .ok_or(anyhow!("person does not exist"))?; - - let asset = app - .person - .headshot - .to_owned() - .unwrap_or(AssetInner::Assets("fallback-Person.avif".into()).ser()); + let group = PeopleGroup::from_str_opt(&group).ok_or(anyhow!("unknown people group"))?; + let asset = get_node_person_asset(&session.0, id.0, group, index)?; Ok(Redirect::permanent(rocket::uri!(r_asset(asset.0, width)))) } #[get("/n/<id>/thumbnail?<t>&<width>")] pub async fn r_node_thumbnail( - _session: A<Session>, - db: &State<Database>, + session: A<Session>, id: A<NodeID>, t: f64, width: Option<usize>, ) -> MyResult<Redirect> { - let node = db.get_node(id.0)?.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").into()); - }; - // 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(Redirect::temporary(rocket::uri!(r_asset( - AssetInner::Cache(asset).ser().0, - width - )))) + let asset = get_node_thumbnail(&session.0, id.0, t).await?; + Ok(Redirect::temporary(rocket::uri!(r_asset(asset.0, width)))) } |