aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-02-04 20:14:10 +0100
committermetamuffin <metamuffin@disroot.org>2025-02-04 20:14:10 +0100
commit755f81e4c1b1b1a59f7cb0a38bbb7c08537a9bbd (patch)
treee8b80c98b0d3d5db0dbe79b930036fb93122553b /server/src
parent38b3a789880633aaaa1067f989b7b915b4529195 (diff)
downloadjellything-755f81e4c1b1b1a59f7cb0a38bbb7c08537a9bbd.tar
jellything-755f81e4c1b1b1a59f7cb0a38bbb7c08537a9bbd.tar.bz2
jellything-755f81e4c1b1b1a59f7cb0a38bbb7c08537a9bbd.tar.zst
youtube embed
Diffstat (limited to 'server/src')
-rw-r--r--server/src/routes/compat/youtube.rs15
-rw-r--r--server/src/routes/mod.rs15
2 files changed, 28 insertions, 2 deletions
diff --git a/server/src/routes/compat/youtube.rs b/server/src/routes/compat/youtube.rs
index 732431e..5880044 100644
--- a/server/src/routes/compat/youtube.rs
+++ b/server/src/routes/compat/youtube.rs
@@ -42,3 +42,18 @@ pub fn r_youtube_channel(_session: Session, db: &State<Database>, id: &str) -> M
let node = db.get_node(id)?.ok_or(anyhow!("node missing"))?;
Ok(Redirect::to(rocket::uri!(r_library_node(&node.slug))))
}
+
+#[get("/embed/<v>")]
+pub fn r_youtube_embed(_session: Session, db: &State<Database>, v: &str) -> MyResult<Redirect> {
+ if v.len() != 11 {
+ Err(anyhow!("video id length incorrect"))?
+ }
+ let Some(id) = db.get_node_external_id("youtube:video", v)? else {
+ Err(anyhow!("element not found"))?
+ };
+ let node = db.get_node(id)?.ok_or(anyhow!("node missing"))?;
+ Ok(Redirect::to(rocket::uri!(r_player(
+ &node.slug,
+ PlayerConfig::default()
+ ))))
+}
diff --git a/server/src/routes/mod.rs b/server/src/routes/mod.rs
index a0c2de4..dae4909 100644
--- a/server/src/routes/mod.rs
+++ b/server/src/routes/mod.rs
@@ -23,7 +23,7 @@ use compat::{
r_jellyfin_users_id, r_jellyfin_users_items, r_jellyfin_users_items_item,
r_jellyfin_users_public, r_jellyfin_users_views, r_jellyfin_video_stream,
},
- youtube::{r_youtube_channel, r_youtube_watch},
+ youtube::{r_youtube_channel, r_youtube_embed, r_youtube_watch},
};
use jellybase::{federation::Federation, CONF, SECRETS};
use log::warn;
@@ -36,7 +36,9 @@ use rocket::{
get,
http::Header,
response::{self, Responder},
- routes, Build, Config, Request, Rocket,
+ routes,
+ shield::Shield,
+ Build, Config, Request, Rocket,
};
use std::fs::File;
use stream::r_stream;
@@ -108,6 +110,14 @@ pub fn build_rocket(database: Database, federation: Federation) -> Rocket<Build>
res.set_header(Header::new("server", "jellything"));
Box::pin(async {})
}))
+ // TODO this would be useful but needs to handle not only the entry-point
+ // .attach(AdHoc::on_response("frame options", |req, resp| {
+ // if !req.uri().path().as_str().starts_with("/embed") {
+ // resp.set_raw_header("X-Frame-Options", "SAMEORIGIN");
+ // }
+ // Box::pin(async {})
+ // }))
+ .attach(Shield::new())
.register("/", catchers![r_catch])
.register("/api", catchers![r_api_catch])
.mount("/assets", FileServer::from(&CONF.asset_path))
@@ -197,6 +207,7 @@ pub fn build_rocket(database: Database, federation: Federation) -> Rocket<Build>
r_jellyfin_users_views,
r_jellyfin_video_stream,
r_youtube_channel,
+ r_youtube_embed,
r_youtube_watch,
],
)