aboutsummaryrefslogtreecommitdiff
path: root/server/src/ui/assets.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-05-26 18:24:16 +0200
committermetamuffin <metamuffin@disroot.org>2025-05-26 18:24:16 +0200
commit3b15caade07e8fbe351fed9aceb3f435bf58368e (patch)
treecce91c229b78061ad36f29d76a76d67c3c737c59 /server/src/ui/assets.rs
parent1eeff5c03e8985d16d4f2b6283741dd82b369bd3 (diff)
downloadjellything-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.rs129
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))))
}