diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-29 16:07:58 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-29 16:07:58 +0100 |
commit | e7ba3274e27fad755f15465581f5b403c82ab4d2 (patch) | |
tree | f2d693c61786ee6ed027636393fd75f086bd77e8 /server/src/routes/ui/assets.rs | |
parent | 5ac3f397b4a28b7bf8b399e73ad0d29e3da45ab0 (diff) | |
download | jellything-e7ba3274e27fad755f15465581f5b403c82ab4d2.tar jellything-e7ba3274e27fad755f15465581f5b403c82ab4d2.tar.bz2 jellything-e7ba3274e27fad755f15465581f5b403c82ab4d2.tar.zst |
prepare database refactor
Diffstat (limited to 'server/src/routes/ui/assets.rs')
-rw-r--r-- | server/src/routes/ui/assets.rs | 70 |
1 files changed, 45 insertions, 25 deletions
diff --git a/server/src/routes/ui/assets.rs b/server/src/routes/ui/assets.rs index ad31240..aeb4eff 100644 --- a/server/src/routes/ui/assets.rs +++ b/server/src/routes/ui/assets.rs @@ -9,16 +9,15 @@ use base64::Engine; use jellybase::{ assetfed::AssetInner, cache::async_cache_file, - database::{DataAcid, TableExt, T_NODE, T_NODE_EXTENDED}, + database::{DataAcid, TableExt, T_NODE}, federation::Federation, permission::NodePermissionExt, CONF, }; -pub use jellycommon::AssetRole; use jellycommon::{LocalTrack, PeopleGroup, SourceTrackKind, TrackSource}; use log::info; use rocket::{get, http::ContentType, response::Redirect, State}; -use std::path::PathBuf; +use std::{path::PathBuf, str::FromStr}; pub const AVIF_QUALITY: f32 = 50.; pub const AVIF_SPEED: u8 = 5; @@ -66,12 +65,11 @@ pub async fn resolve_asset(asset: AssetInner) -> anyhow::Result<PathBuf> { } } -#[get("/n/<id>/asset?<role>&<width>")] -pub async fn r_item_assets( +#[get("/n/<id>/poster?<width>")] +pub async fn r_item_poster( session: Session, db: &State<DataAcid>, id: &str, - role: AssetRole, width: Option<usize>, ) -> MyResult<Redirect> { let node = T_NODE @@ -79,26 +77,45 @@ pub async fn r_item_assets( .only_if_permitted(&session.user.permissions) .ok_or(anyhow!("node does not exist"))?; - let mut asset = match role { - AssetRole::Backdrop => node.public.backdrop, - AssetRole::Poster => node.public.poster, + let mut asset = node.poster; + if asset.is_none() { + if let Some(parent) = &node.parents.last() { + let parent = T_NODE + .get(db, parent.as_str())? + .ok_or(anyhow!("node does not exist"))?; + asset = parent.poster; + } }; + let asset = asset.unwrap_or_else(|| { + AssetInner::Assets(format!("fallback-{:?}.avif", node.kind.unwrap_or_default()).into()) + .ser() + }); + Ok(Redirect::temporary(rocket::uri!(r_asset(asset.0, width)))) +} +#[get("/n/<id>/backdrop?<width>")] +pub async fn r_item_backdrop( + session: Session, + db: &State<DataAcid>, + id: &str, + width: Option<usize>, +) -> MyResult<Redirect> { + let node = T_NODE + .get(db, id)? + .only_if_permitted(&session.user.permissions) + .ok_or(anyhow!("node does not exist"))?; + + let mut asset = node.poster; if asset.is_none() { - if let Some(parent) = &node.public.path.last() { + if let Some(parent) = &node.parents.last() { let parent = T_NODE .get(db, parent.as_str())? .ok_or(anyhow!("node does not exist"))?; - asset = match role { - AssetRole::Backdrop => parent.public.backdrop, - AssetRole::Poster => parent.public.poster, - }; + asset = parent.poster; } }; let asset = asset.unwrap_or_else(|| { - AssetInner::Assets( - format!("fallback-{:?}.avif", node.public.kind.unwrap_or_default()).into(), - ) - .ser() + AssetInner::Assets(format!("fallback-{:?}.avif", node.kind.unwrap_or_default()).into()) + .ser() }); Ok(Redirect::temporary(rocket::uri!(r_asset(asset.0, width)))) } @@ -109,7 +126,7 @@ pub async fn r_person_asset( db: &State<DataAcid>, id: &str, index: usize, - group: PeopleGroup, + group: String, width: Option<usize>, ) -> MyResult<Redirect> { T_NODE @@ -117,10 +134,10 @@ pub async fn r_person_asset( .only_if_permitted(&session.user.permissions) .ok_or(anyhow!("node does not exist"))?; - let ext = T_NODE_EXTENDED.get(db, id)?.unwrap_or_default(); - let app = ext + let node = T_NODE.get(db, id)?.unwrap_or_default(); + let app = node .people - .get(&group) + .get(&PeopleGroup::from_str(&group).map_err(|()| anyhow!("unknown people group"))?) .ok_or(anyhow!("group has no members"))? .get(index) .ok_or(anyhow!("person does not exist"))?; @@ -150,15 +167,18 @@ pub async fn r_node_thumbnail( .only_if_permitted(&session.user.permissions) .ok_or(anyhow!("node does not exist"))?; - let media = node.public.media.ok_or(anyhow!("no media"))?; + let media = node.media.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 = node.private.source.ok_or(anyhow!("no source"))?; - let thumb_track_source = &source[thumb_track_index]; + 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"))? |