Compare commits
No commits in common. "fb55d396f85e3a6b1968558959ece7bde62f669f" and "f91b4ed6daf5d369aa9d5e17eb32399cb9254705" have entirely different histories.
fb55d396f8
...
f91b4ed6da
12 changed files with 62 additions and 219 deletions
66
Cargo.lock
generated
66
Cargo.lock
generated
|
@ -146,7 +146,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
|
|||
[[package]]
|
||||
name = "based"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.hydrar.de/jmarya/based#696b34f2f17ef2d86f0bc77993f9b0b8b652c0f6"
|
||||
source = "git+https://git.hydrar.de/jmarya/based?branch=ui#f2cfcf27bbe7668caf95a99e7b8f7698e023fdec"
|
||||
dependencies = [
|
||||
"bcrypt",
|
||||
"chrono",
|
||||
|
@ -251,9 +251,9 @@ checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9"
|
|||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.15"
|
||||
version = "1.2.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af"
|
||||
checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9"
|
||||
dependencies = [
|
||||
"shlex",
|
||||
]
|
||||
|
@ -503,9 +503,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
|
|||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.14.0"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d"
|
||||
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
@ -1160,9 +1160,9 @@ checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
|
|||
|
||||
[[package]]
|
||||
name = "inout"
|
||||
version = "0.1.4"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
|
||||
checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
|
||||
dependencies = [
|
||||
"generic-array",
|
||||
]
|
||||
|
@ -1211,9 +1211,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.170"
|
||||
version = "0.2.169"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828"
|
||||
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
|
||||
|
||||
[[package]]
|
||||
name = "libm"
|
||||
|
@ -1255,9 +1255,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.26"
|
||||
version = "0.4.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e"
|
||||
checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
|
||||
|
||||
[[package]]
|
||||
name = "loom"
|
||||
|
@ -1329,9 +1329,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
|||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.8.5"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5"
|
||||
checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b"
|
||||
dependencies = [
|
||||
"adler2",
|
||||
]
|
||||
|
@ -1368,9 +1368,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "native-tls"
|
||||
version = "0.2.14"
|
||||
version = "0.2.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
|
||||
checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
|
@ -1748,9 +1748,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.5.9"
|
||||
version = "0.5.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f"
|
||||
checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
|
||||
dependencies = [
|
||||
"bitflags 2.8.0",
|
||||
]
|
||||
|
@ -2088,18 +2088,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.218"
|
||||
version = "1.0.217"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60"
|
||||
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.218"
|
||||
version = "1.0.217"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b"
|
||||
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -2108,9 +2108,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.139"
|
||||
version = "1.0.138"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6"
|
||||
checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"memchr",
|
||||
|
@ -2536,9 +2536,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.17.1"
|
||||
version = "3.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230"
|
||||
checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"fastrand",
|
||||
|
@ -2816,9 +2816,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
|||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.18.0"
|
||||
version = "1.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
|
||||
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
|
||||
|
||||
[[package]]
|
||||
name = "ubyte"
|
||||
|
@ -2863,9 +2863,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
|
|||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.17"
|
||||
version = "1.0.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
|
||||
checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-normalization"
|
||||
|
@ -2919,9 +2919,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
|||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.14.0"
|
||||
version = "1.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1"
|
||||
checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0"
|
||||
dependencies = [
|
||||
"getrandom 0.3.1",
|
||||
"serde",
|
||||
|
@ -3303,9 +3303,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
|
|||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "0.7.3"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1"
|
||||
checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
|
|
@ -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"] }
|
||||
based = { git = "https://git.hydrar.de/jmarya/based", features = ["cache"], branch = "ui" }
|
||||
toml = "0.8.20"
|
||||
|
|
|
@ -3,12 +3,5 @@
|
|||
# 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"
|
||||
|
|
|
@ -8,7 +8,5 @@ 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,
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use based::auth::User;
|
||||
use based::get_pg;
|
||||
use std::path::Path;
|
||||
use std::path::PathBuf;
|
||||
use std::str::FromStr;
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
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;
|
||||
|
@ -76,7 +75,6 @@ pub struct Video {
|
|||
pub path: String,
|
||||
pub duration: f64,
|
||||
pub title: String,
|
||||
pub date_added: chrono::DateTime<Utc>,
|
||||
youtube_id: Option<String>,
|
||||
}
|
||||
|
||||
|
|
12
src/main.rs
12
src/main.rs
|
@ -1,4 +1,9 @@
|
|||
use based::{asset::AssetRoutes, auth::User, get_pg, ui::components::prelude::Shell};
|
||||
use based::{
|
||||
asset::AssetRoutes,
|
||||
auth::User,
|
||||
get_pg,
|
||||
ui::components::{AppBar, Shell},
|
||||
};
|
||||
use rocket::{http::Method, routes};
|
||||
use std::path::Path;
|
||||
mod config;
|
||||
|
@ -74,10 +79,7 @@ async fn launch() -> _ {
|
|||
pages::user::login_post,
|
||||
pages::user::history_page,
|
||||
pages::index::latest_page,
|
||||
pages::index::latest_api,
|
||||
pages::user::account,
|
||||
pages::user::change_password,
|
||||
pages::user::change_password_post
|
||||
pages::index::latest_api
|
||||
],
|
||||
)
|
||||
.attach(cors)
|
||||
|
|
|
@ -48,7 +48,7 @@ pub async fn video_thumbnail(
|
|||
conf: &State<Config>,
|
||||
user: MaybeUser,
|
||||
) -> Option<DataResponse> {
|
||||
if (conf.general.private && user.user().is_none()) && !conf.general.allow_ogp {
|
||||
if conf.general.private && user.user().is_none() {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
use crate::library::Video;
|
||||
use based::ui::components::prelude::Avatar;
|
||||
use based::ui::components::prelude::*;
|
||||
use based::ui::primitives::flex::Row;
|
||||
use based::ui::components::{AppBar, Card, NavBar, Shell};
|
||||
use based::ui::primitives::flex::Column;
|
||||
use based::ui::primitives::Optional;
|
||||
use based::ui::wrapper::HoverWrapper;
|
||||
use based::ui::{prelude::*, UIWidget};
|
||||
|
@ -32,28 +33,12 @@ pub async fn render_page(
|
|||
// TODO : profile pictures
|
||||
DropDown(
|
||||
Avatar("", &user.username).use_initials(),
|
||||
DropdownMenu(vec![
|
||||
DropdownMenuEntry(
|
||||
"/account",
|
||||
Row(vec![
|
||||
MaterialIcon("account_circle"),
|
||||
Text("Account").medium().render(),
|
||||
])
|
||||
.gap(ScreenValue::_2)
|
||||
.items_center()
|
||||
.justify(Justify::Start),
|
||||
),
|
||||
DropdownMenuEntry(
|
||||
"/history",
|
||||
Row(vec![
|
||||
MaterialIcon("history"),
|
||||
Text("Video History").medium().render(),
|
||||
])
|
||||
.gap(ScreenValue::_2)
|
||||
.items_center()
|
||||
.justify(Justify::Start),
|
||||
),
|
||||
]),
|
||||
DropdownMenu(vec![DropdownMenuEntry(
|
||||
"/history",
|
||||
Padding(Text("Video History").medium())
|
||||
.x(ScreenValue::_4)
|
||||
.y(ScreenValue::_2),
|
||||
)]),
|
||||
)
|
||||
}))
|
||||
.no_dropdown(),
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use based::page;
|
||||
use based::request::respond_html;
|
||||
use based::ui::components::prelude::{InfinityScroll, Shell};
|
||||
use based::ui::components::ColoredSpinner;
|
||||
use based::ui::components::prelude::InfinityScroll;
|
||||
use based::ui::components::{ColoredSpinner, Shell};
|
||||
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, State};
|
||||
use rocket::{get, uri, State};
|
||||
use serde_json::json;
|
||||
|
||||
use crate::config::Config;
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
use based::auth::csrf::CSRF;
|
||||
use based::auth::{Sessions, User};
|
||||
use based::page;
|
||||
use based::request::StringResponse;
|
||||
use based::ui::components::prelude::Avatar;
|
||||
use based::ui::components::prelude::*;
|
||||
use based::ui::primitives::flex::Row;
|
||||
use based::ui::{prelude::*, AttrExtendable};
|
||||
use based::ui::components::{Card, Shell};
|
||||
use based::ui::prelude::*;
|
||||
use based::{auth::MaybeUser, request::RequestContext};
|
||||
use maud::{html, Render};
|
||||
use rocket::http::CookieJar;
|
||||
|
@ -85,96 +82,3 @@ pub async fn history_page(ctx: RequestContext, user: User, shell: &State<Shell>)
|
|||
|
||||
render_page(&shell, ctx, content, "History", Some(user)).await
|
||||
}
|
||||
|
||||
#[get("/account")]
|
||||
pub async fn account(ctx: RequestContext, user: User, shell: &State<Shell>) -> StringResponse {
|
||||
let content = Width(
|
||||
ScreenValue::fit,
|
||||
Margin(
|
||||
Div()
|
||||
.push(
|
||||
Row(vec![
|
||||
Avatar("", &user.username).render(),
|
||||
Text(&user.username)._2xl().bold().render(),
|
||||
])
|
||||
.gap(ScreenValue::_2),
|
||||
)
|
||||
.push(Link("/passwd", Button(Text("Change Password")))),
|
||||
)
|
||||
.top(ScreenValue::_8)
|
||||
.x(ScreenValue::auto),
|
||||
)
|
||||
.render();
|
||||
|
||||
render_page(&shell, ctx, content, "Account", Some(user)).await
|
||||
}
|
||||
|
||||
#[derive(FromForm)]
|
||||
pub struct PasswordChangeForm {
|
||||
password_old: String,
|
||||
password_new: String,
|
||||
password_new_repeat: String,
|
||||
csrf: String,
|
||||
}
|
||||
|
||||
#[post("/passwd", data = "<form>")]
|
||||
pub async fn change_password_post(form: Form<PasswordChangeForm>, user: User) -> Redirect {
|
||||
if form.password_new != form.password_new_repeat {
|
||||
return Redirect::to("/passwd");
|
||||
}
|
||||
|
||||
if !user.verify_csrf(&form.csrf).await {
|
||||
return Redirect::to("/passwd");
|
||||
}
|
||||
|
||||
user.passwd(&form.password_old, &form.password_new)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
Redirect::to("/account")
|
||||
}
|
||||
|
||||
#[get("/passwd")]
|
||||
pub async fn change_password(
|
||||
ctx: RequestContext,
|
||||
user: User,
|
||||
shell: &State<Shell>,
|
||||
) -> StringResponse {
|
||||
let csrf = user.get_csrf().await.to_string();
|
||||
let form = based::ui::primitives::input::Form::new("/passwd")
|
||||
.method(FormMethod::POST)
|
||||
.add_input(
|
||||
Margin(
|
||||
Text("Change Password")
|
||||
._2xl()
|
||||
.bold()
|
||||
.align(TextAlignment::Center),
|
||||
)
|
||||
.bottom(ScreenValue::_6),
|
||||
)
|
||||
.add_input(
|
||||
TextInput("password_old")
|
||||
.password()
|
||||
.placeholder("Old Password")
|
||||
.required(),
|
||||
)
|
||||
.add_input(
|
||||
TextInput("password_new")
|
||||
.password()
|
||||
.placeholder("New Password")
|
||||
.required(),
|
||||
)
|
||||
.add_input(
|
||||
TextInput("password_new_repeat")
|
||||
.password()
|
||||
.placeholder("Repeat new password")
|
||||
.required(),
|
||||
)
|
||||
.add_input(FormSubmitButton("Change"))
|
||||
.add_input(HiddenInput("csrf", &csrf).add_attr("class", "csrf"))
|
||||
.render();
|
||||
|
||||
let content = Div().vanish().push(form).render();
|
||||
|
||||
render_page(&shell, ctx, content, "Change Password", Some(user)).await
|
||||
}
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
use based::format::format_number;
|
||||
use based::ogp::{MediaItem, Metadata};
|
||||
use based::request::respond_html;
|
||||
use based::ui::components::prelude::Shell;
|
||||
use based::ui::components::Shell;
|
||||
use based::ui::primitives::space::Fraction;
|
||||
use based::ui::{prelude::*, AttrExtendable};
|
||||
use based::{
|
||||
|
@ -12,6 +10,7 @@ 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::{
|
||||
|
@ -30,6 +29,8 @@ pub async fn watch_page(
|
|||
conf: &State<Config>,
|
||||
shell: &State<Shell>,
|
||||
) -> StringResponse {
|
||||
check_private!(conf, user, shell, ctx);
|
||||
|
||||
let video = if let Some(video) = library.get_video_by_id(&v).await {
|
||||
video
|
||||
} else {
|
||||
|
@ -37,46 +38,6 @@ 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;
|
||||
}
|
||||
|
@ -143,7 +104,7 @@ pub async fn watch_page(
|
|||
).x(ScreenValue::_10).top(ScreenValue::_6).render();
|
||||
|
||||
render_page(
|
||||
&shell.inner().extend().metadata(meta),
|
||||
&shell,
|
||||
ctx,
|
||||
content,
|
||||
&format!("{} - WatchDogs", video.title),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue