diff options
author | metamuffin <metamuffin@disroot.org> | 2025-02-04 20:14:10 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-02-04 20:14:10 +0100 |
commit | 755f81e4c1b1b1a59f7cb0a38bbb7c08537a9bbd (patch) | |
tree | e8b80c98b0d3d5db0dbe79b930036fb93122553b | |
parent | 38b3a789880633aaaa1067f989b7b915b4529195 (diff) | |
download | jellything-755f81e4c1b1b1a59f7cb0a38bbb7c08537a9bbd.tar jellything-755f81e4c1b1b1a59f7cb0a38bbb7c08537a9bbd.tar.bz2 jellything-755f81e4c1b1b1a59f7cb0a38bbb7c08537a9bbd.tar.zst |
youtube embed
-rw-r--r-- | server/src/routes/compat/youtube.rs | 15 | ||||
-rw-r--r-- | server/src/routes/mod.rs | 15 |
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, ], ) |