diff --git a/Cargo.toml b/Cargo.toml index d48af4f..316921b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,4 +15,5 @@ ntex-files = "2.0.0" reqwest = { version = "0.12.18", features = ["blocking", "json", "rustls-tls"] } serde = "1.0.219" serde_json = "1.0.140" +tokio = "1.45.1" diff --git a/src/api.rs b/src/api.rs index eca44d4..6288a4a 100644 --- a/src/api.rs +++ b/src/api.rs @@ -3,6 +3,7 @@ use htmlentity::types::Byte; use ntex::http::header; use ntex::web; use ntex::web::HttpRequest; +use tokio::{task, time}; use crate::providers::hanime::HanimeProvider; use crate::providers::perverzija::PerverzijaProvider; @@ -324,9 +325,34 @@ async fn videos_post( let provider = get_provider(channel.as_str()) .ok_or_else(|| web::error::ErrorBadRequest("Invalid channel".to_string()))?; let video_items = provider - .get_videos(cache.get_ref().clone(), pool.get_ref().clone(), channel, sort, query, page.to_string(), perPage.to_string(), featured) + .get_videos(cache.get_ref().clone(), pool.get_ref().clone(), channel.clone(), sort.clone(), query.clone(), page.to_string(), perPage.to_string(), featured.clone()) .await; videos.items = video_items.clone(); +//### + let next_page = page.to_string().parse::().unwrap_or(1) + 1; + let provider_clone = provider.clone(); + let cache_clone = cache.get_ref().clone(); + let pool_clone = pool.get_ref().clone(); + let channel_clone = channel.clone(); + let sort_clone = sort.clone(); + let query_clone = query.clone(); + let per_page_clone = perPage.to_string(); + let featured_clone = featured.clone(); + task::spawn_local(async move { + let _ = provider_clone + .get_videos( + cache_clone, + pool_clone, + channel_clone, + sort_clone, + query_clone, + next_page.to_string(), + per_page_clone, + featured_clone, + ) + .await; + }); +//### Ok(web::HttpResponse::Ok().json(&videos)) } diff --git a/src/providers/hanime.rs b/src/providers/hanime.rs index 473a877..6e28742 100644 --- a/src/providers/hanime.rs +++ b/src/providers/hanime.rs @@ -18,7 +18,7 @@ error_chain! { } } -#[derive(serde::Serialize, serde::Deserialize, Debug)] +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] struct HanimeSearchRequest{ search_text: String, tags: Vec, @@ -114,6 +114,7 @@ struct HanimeSearchResult{ } +#[derive(Debug, Clone)] #[allow(dead_code)] pub struct HanimeProvider { url: String, diff --git a/src/providers/mod.rs b/src/providers/mod.rs index 9d3ec77..204a41e 100644 --- a/src/providers/mod.rs +++ b/src/providers/mod.rs @@ -1,4 +1,5 @@ use crate::{providers::{hanime::HanimeProvider, perverzija::PerverzijaProvider, spankbang::SpankbangProvider}, util::cache::VideoCache, videos::VideoItem, DbPool}; +use tokio::task; pub mod perverzija; pub mod hanime; @@ -8,6 +9,7 @@ pub trait Provider{ async fn get_videos(&self, cache: VideoCache, pool: DbPool, channel: String, sort: String, query: Option, page: String, per_page: String, featured: String) -> Vec; } +#[derive(Debug, Clone)] pub enum AnyProvider { Perverzija(PerverzijaProvider), Hanime(HanimeProvider), @@ -16,7 +18,7 @@ pub enum AnyProvider { impl Provider for AnyProvider { async fn get_videos(&self, cache: VideoCache, pool:DbPool, channel: String, sort: String, query: Option, page: String, per_page: String, featured: String) -> Vec { match self { - AnyProvider::Perverzija(p) => p.get_videos(cache, pool, channel, sort, query, page, per_page, featured).await, + AnyProvider::Perverzija(p) => p.get_videos(cache.clone(), pool.clone(), channel.clone(), sort.clone(), query.clone(), page.clone(), per_page.clone(), featured.clone()).await, AnyProvider::Hanime(p) => p.get_videos(cache, pool, channel, sort, query, page, per_page, featured).await, AnyProvider::Spankbang(p) => p.get_videos(cache, pool, channel, sort, query, page, per_page, featured).await, } diff --git a/src/providers/perverzija.rs b/src/providers/perverzija.rs index f43497d..91e576a 100644 --- a/src/providers/perverzija.rs +++ b/src/providers/perverzija.rs @@ -21,6 +21,8 @@ error_chain! { } } + +#[derive(Debug, Clone)] pub struct PerverzijaProvider { url: String, } @@ -31,12 +33,6 @@ impl PerverzijaProvider { } } async fn get(&self, cache:VideoCache, pool:DbPool, page: u8, featured: String) -> Result> { - //TODO - // let mut url = Url::parse("https://example.net")?; - // url.query_pairs_mut().append_pair("foo", "bar"); - // url.query_pairs_mut().append_pair("key", "dkhdsihdsaiufds"); - // url.query_pairs_mut().append_pair("hello", "world"); - // println!("{}", url.as_str()); let mut prefix_uri = "".to_string(); if featured == "featured" { @@ -118,6 +114,9 @@ impl PerverzijaProvider { } } async fn query(&self, cache: VideoCache, pool:DbPool, page: u8, query: &str) -> Result> { + + + let search_string = query.replace(" ", "+"); let mut url = format!( "{}page/{}/?s={}", diff --git a/src/providers/spankbang.rs b/src/providers/spankbang.rs index 66cc0cf..f53460b 100644 --- a/src/providers/spankbang.rs +++ b/src/providers/spankbang.rs @@ -17,6 +17,8 @@ error_chain! { } } + +#[derive(Debug, Clone)] pub struct SpankbangProvider { url: String, }