aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/ui/assets.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/ui/assets.rs')
-rw-r--r--server/src/routes/ui/assets.rs70
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"))?