From fb55d396f85e3a6b1968558959ece7bde62f669f Mon Sep 17 00:00:00 2001 From: JMARyA Date: Sun, 23 Feb 2025 23:39:25 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20ogp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 6 ++--- Cargo.toml | 2 +- config.toml | 7 ++++++ src/config.rs | 2 ++ src/library/mod.rs | 2 -- src/library/video.rs | 2 ++ src/main.rs | 7 +----- src/pages/assets.rs | 2 +- src/pages/components.rs | 1 - src/pages/index.rs | 6 ++--- src/pages/user.rs | 4 ++-- src/pages/watch.rs | 49 ++++++++++++++++++++++++++++++++++++----- 12 files changed, 66 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c63136e..f8b7594 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,7 +146,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "based" version = "0.1.0" -source = "git+https://git.hydrar.de/jmarya/based?branch=ui#f2cfcf27bbe7668caf95a99e7b8f7698e023fdec" +source = "git+https://git.hydrar.de/jmarya/based#696b34f2f17ef2d86f0bc77993f9b0b8b652c0f6" dependencies = [ "bcrypt", "chrono", @@ -503,9 +503,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" dependencies = [ "serde", ] diff --git a/Cargo.toml b/Cargo.toml index af1c971..7629627 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,5 +24,5 @@ maud = "0.26.0" rand = "0.8.5" data-encoding = "2.6.0" bcrypt = "0.16.0" -based = { git = "https://git.hydrar.de/jmarya/based", features = ["cache"], branch = "ui" } +based = { git = "https://git.hydrar.de/jmarya/based", features = ["cache"] } toml = "0.8.20" diff --git a/config.toml b/config.toml index bbfe29d..a78d162 100644 --- a/config.toml +++ b/config.toml @@ -3,5 +3,12 @@ # Private Instance (Login required for watching content) private = true +# Allow OGP (Open Graph Protocol) +# This might expose metadata and thumbnails of videos (even if private) +allow_ogp = true + +# Root URL +root_url = "http://127.0.0.1:8080" + # Path to videos video_path = "./videos" diff --git a/src/config.rs b/src/config.rs index 8d32d98..0eaedf3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -8,5 +8,7 @@ pub struct Config { #[derive(Debug, Clone, Deserialize)] pub struct GeneralConfig { pub private: bool, + pub allow_ogp: bool, + pub root_url: String, pub video_path: String, } diff --git a/src/library/mod.rs b/src/library/mod.rs index 3e1d38e..94b73f2 100644 --- a/src/library/mod.rs +++ b/src/library/mod.rs @@ -1,5 +1,3 @@ -use based::auth::User; -use based::get_pg; use std::path::Path; use std::path::PathBuf; use std::str::FromStr; diff --git a/src/library/video.rs b/src/library/video.rs index ba49d1e..e0411c7 100644 --- a/src/library/video.rs +++ b/src/library/video.rs @@ -1,5 +1,6 @@ use crate::yt_meta::{self, get_vid_duration}; use based::{get_pg, request::api::ToAPI}; +use chrono::Utc; use serde::{Deserialize, Serialize}; use serde_json::json; use sqlx::prelude::FromRow; @@ -75,6 +76,7 @@ pub struct Video { pub path: String, pub duration: f64, pub title: String, + pub date_added: chrono::DateTime, youtube_id: Option, } diff --git a/src/main.rs b/src/main.rs index d40bd2c..9d27a34 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,4 @@ -use based::{ - asset::AssetRoutes, - auth::User, - get_pg, - ui::components::{AppBar, Shell}, -}; +use based::{asset::AssetRoutes, auth::User, get_pg, ui::components::prelude::Shell}; use rocket::{http::Method, routes}; use std::path::Path; mod config; diff --git a/src/pages/assets.rs b/src/pages/assets.rs index ed9e513..02d633a 100644 --- a/src/pages/assets.rs +++ b/src/pages/assets.rs @@ -48,7 +48,7 @@ pub async fn video_thumbnail( conf: &State, user: MaybeUser, ) -> Option { - if conf.general.private && user.user().is_none() { + if (conf.general.private && user.user().is_none()) && !conf.general.allow_ogp { return None; } diff --git a/src/pages/components.rs b/src/pages/components.rs index 2e2d6c8..b903adc 100644 --- a/src/pages/components.rs +++ b/src/pages/components.rs @@ -1,7 +1,6 @@ use crate::library::Video; use based::ui::components::prelude::Avatar; use based::ui::components::prelude::*; -use based::ui::components::{NavBar, Shell}; use based::ui::primitives::flex::Row; use based::ui::primitives::Optional; use based::ui::wrapper::HoverWrapper; diff --git a/src/pages/index.rs b/src/pages/index.rs index 31addb9..ed07fb0 100644 --- a/src/pages/index.rs +++ b/src/pages/index.rs @@ -1,7 +1,7 @@ use based::page; use based::request::respond_html; -use based::ui::components::prelude::InfinityScroll; -use based::ui::components::{ColoredSpinner, Shell}; +use based::ui::components::prelude::{InfinityScroll, Shell}; +use based::ui::components::ColoredSpinner; use based::ui::prelude::*; use based::ui::primitives::div::Center; use based::{ @@ -12,7 +12,7 @@ use based::{ }, }; use maud::{html, PreEscaped, Render}; -use rocket::{get, uri, State}; +use rocket::{get, State}; use serde_json::json; use crate::config::Config; diff --git a/src/pages/user.rs b/src/pages/user.rs index 21a1e25..56f743e 100644 --- a/src/pages/user.rs +++ b/src/pages/user.rs @@ -3,11 +3,11 @@ use based::auth::{Sessions, User}; use based::page; use based::request::StringResponse; use based::ui::components::prelude::Avatar; -use based::ui::components::{prelude::*, Shell}; +use based::ui::components::prelude::*; use based::ui::primitives::flex::Row; use based::ui::{prelude::*, AttrExtendable}; use based::{auth::MaybeUser, request::RequestContext}; -use maud::{html, PreEscaped, Render}; +use maud::{html, Render}; use rocket::http::CookieJar; use rocket::State; use rocket::{form::Form, get, http::Cookie, post, response::Redirect, FromForm}; diff --git a/src/pages/watch.rs b/src/pages/watch.rs index 2d738e8..bc332a4 100644 --- a/src/pages/watch.rs +++ b/src/pages/watch.rs @@ -1,5 +1,7 @@ use based::format::format_number; -use based::ui::components::Shell; +use based::ogp::{MediaItem, Metadata}; +use based::request::respond_html; +use based::ui::components::prelude::Shell; use based::ui::primitives::space::Fraction; use based::ui::{prelude::*, AttrExtendable}; use based::{ @@ -10,7 +12,6 @@ use based::{ use maud::{html, PreEscaped, Render}; use rocket::{get, State}; -use crate::check_private; use crate::config::Config; use crate::library::Video; use crate::{ @@ -29,8 +30,6 @@ pub async fn watch_page( conf: &State, shell: &State, ) -> StringResponse { - check_private!(conf, user, shell, ctx); - let video = if let Some(video) = library.get_video_by_id(&v).await { video } else { @@ -38,6 +37,46 @@ pub async fn watch_page( library.get_video_by_youtube_id(&v).await.unwrap() }; + let yt_meta = video.youtube_meta().await; + + let mut vid_meta = + based::ogp::Video::Other(video.duration as u32, video.date_added.date_naive()); + + if let Some(yt_meta) = &yt_meta { + for t in yt_meta.tags().await { + vid_meta = vid_meta.tag(&t); + } + } + + let meta = Metadata::new( + &format!("{}/watch?v={}", conf.general.root_url, video.id), + &video.title, + MediaItem::Image( + &format!("{}/video/thumbnail?v={}", conf.general.root_url, video.id), + "image/png", + "Video Thumbnail", + ), + vid_meta, + ) + .site_name("WatchDogs"); + + if conf.general.private && user.user().is_none() { + return respond_html( + html! { + (maud::DOCTYPE) + html { + head { + (meta.render()) + } + body { + + } + } + } + .0, + ); + } + if let Some(user) = user.user() { user.insert_history(video.id).await; } @@ -104,7 +143,7 @@ pub async fn watch_page( ).x(ScreenValue::_10).top(ScreenValue::_6).render(); render_page( - &shell, + &shell.inner().extend().metadata(meta), ctx, content, &format!("{} - WatchDogs", video.title),