latest videos
All checks were successful
ci/woodpecker/push/build Pipeline was successful

This commit is contained in:
JMARyA 2024-12-29 21:49:48 +01:00
parent 198994a99c
commit 14483ceec4
Signed by: jmarya
GPG key ID: 901B2ADDF27C2263
3 changed files with 52 additions and 4 deletions

View file

@ -159,6 +159,14 @@ impl Library {
.unwrap() .unwrap()
} }
pub async fn get_newly_added(&self, n: i64) -> Vec<Video> {
sqlx::query_as("SELECT * FROM videos ORDER BY date_added DESC LIMIT $1;")
.bind(n)
.fetch_all(&self.conn)
.await
.unwrap()
}
pub async fn get_video_by_id(&self, id: &str) -> Option<Video> { pub async fn get_video_by_id(&self, id: &str) -> Option<Video> {
sqlx::query_as("SELECT * FROM videos WHERE id = $1") sqlx::query_as("SELECT * FROM videos WHERE id = $1")
.bind(uuid::Uuid::from_str(id).unwrap_or(uuid::Uuid::nil())) .bind(uuid::Uuid::from_str(id).unwrap_or(uuid::Uuid::nil()))

View file

@ -67,7 +67,9 @@ async fn launch() -> _ {
pages::watch::watch_page, pages::watch::watch_page,
pages::user::login, pages::user::login,
pages::user::login_post, pages::user::login_post,
pages::user::history_page pages::user::history_page,
pages::index::latest_page,
pages::index::latest_api
], ],
) )
.attach(cors) .attach(cors)

View file

@ -1,7 +1,10 @@
use based::{ use based::{
auth::MaybeUser, auth::MaybeUser,
page::htmx_link, page::htmx_link,
request::{api::vec_to_api, RequestContext, StringResponse}, request::{
api::{vec_to_api, FallibleApiResponse},
RequestContext, StringResponse,
},
}; };
use maud::html; use maud::html;
use rocket::{get, State}; use rocket::{get, State};
@ -30,6 +33,33 @@ pub async fn search(
Some(json!(vec_to_api(&mut video_matches).await)) Some(json!(vec_to_api(&mut video_matches).await))
} }
#[get("/latest.json")]
pub async fn latest_api(library: &State<Library>) -> FallibleApiResponse {
let videos = library.get_newly_added(20).await;
let vid_api = vec_to_api(&videos).await;
return Ok(serde_json::json!(vid_api));
}
#[get("/latest")]
pub async fn latest_page(
ctx: RequestContext,
library: &State<Library>,
user: MaybeUser,
) -> StringResponse {
let videos = library.get_newly_added(20).await;
let content = html!(
h1 class="text-center text-4xl font-extrabold leading-tight mt-6 mb-2" { "Recent videos" };
div class="p-6" {
@for mut vid in videos {
( video_element_wide(&mut vid).await );
};
};
);
render_page(ctx, content, "Recent videos", user.into()).await
}
#[get("/d/<dir>")] #[get("/d/<dir>")]
pub async fn channel_page( pub async fn channel_page(
ctx: RequestContext, ctx: RequestContext,
@ -65,12 +95,20 @@ pub async fn index_page(
user: MaybeUser, user: MaybeUser,
) -> StringResponse { ) -> StringResponse {
let content = html!( let content = html!(
h1 class="text-center text-4xl font-extrabold leading-tight mt-4" { "Random Videos" }; h1 class="text-center text-4xl font-extrabold leading-tight mt-8" { "Random Videos" };
div class="lg:grid grid-cols-3 gap-6 p-6" { div class="lg:grid grid-cols-3 gap-6 p-6 mb-4" {
@for mut vid in library.get_random_videos(3).await { @for mut vid in library.get_random_videos(3).await {
( video_element(&mut vid).await ); ( video_element(&mut vid).await );
}; };
}; };
h1 class="text-center text-4xl font-extrabold leading-tight mt-10" { a href="/latest" { "Latest Videos" };};
div class="lg:grid grid-cols-3 gap-6 p-6 mb-4" {
@for mut vid in library.get_newly_added(3).await {
( video_element(&mut vid).await );
};
};
h1 class="text-center text-4xl font-extrabold leading-tight mt-8" { "Directories:" }; h1 class="text-center text-4xl font-extrabold leading-tight mt-8" { "Directories:" };
div class="flex flex-wrap p-10" { div class="flex flex-wrap p-10" {
@for dir in library.get_directories().await { @for dir in library.get_directories().await {