background loading
This commit is contained in:
@@ -15,4 +15,5 @@ ntex-files = "2.0.0"
|
|||||||
reqwest = { version = "0.12.18", features = ["blocking", "json", "rustls-tls"] }
|
reqwest = { version = "0.12.18", features = ["blocking", "json", "rustls-tls"] }
|
||||||
serde = "1.0.219"
|
serde = "1.0.219"
|
||||||
serde_json = "1.0.140"
|
serde_json = "1.0.140"
|
||||||
|
tokio = "1.45.1"
|
||||||
|
|
||||||
|
|||||||
28
src/api.rs
28
src/api.rs
@@ -3,6 +3,7 @@ use htmlentity::types::Byte;
|
|||||||
use ntex::http::header;
|
use ntex::http::header;
|
||||||
use ntex::web;
|
use ntex::web;
|
||||||
use ntex::web::HttpRequest;
|
use ntex::web::HttpRequest;
|
||||||
|
use tokio::{task, time};
|
||||||
|
|
||||||
use crate::providers::hanime::HanimeProvider;
|
use crate::providers::hanime::HanimeProvider;
|
||||||
use crate::providers::perverzija::PerverzijaProvider;
|
use crate::providers::perverzija::PerverzijaProvider;
|
||||||
@@ -324,9 +325,34 @@ async fn videos_post(
|
|||||||
let provider = get_provider(channel.as_str())
|
let provider = get_provider(channel.as_str())
|
||||||
.ok_or_else(|| web::error::ErrorBadRequest("Invalid channel".to_string()))?;
|
.ok_or_else(|| web::error::ErrorBadRequest("Invalid channel".to_string()))?;
|
||||||
let video_items = provider
|
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;
|
.await;
|
||||||
videos.items = video_items.clone();
|
videos.items = video_items.clone();
|
||||||
|
//###
|
||||||
|
let next_page = page.to_string().parse::<i32>().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))
|
Ok(web::HttpResponse::Ok().json(&videos))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ error_chain! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
|
||||||
struct HanimeSearchRequest{
|
struct HanimeSearchRequest{
|
||||||
search_text: String,
|
search_text: String,
|
||||||
tags: Vec<String>,
|
tags: Vec<String>,
|
||||||
@@ -114,6 +114,7 @@ struct HanimeSearchResult{
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub struct HanimeProvider {
|
pub struct HanimeProvider {
|
||||||
url: String,
|
url: String,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use crate::{providers::{hanime::HanimeProvider, perverzija::PerverzijaProvider, spankbang::SpankbangProvider}, util::cache::VideoCache, videos::VideoItem, DbPool};
|
use crate::{providers::{hanime::HanimeProvider, perverzija::PerverzijaProvider, spankbang::SpankbangProvider}, util::cache::VideoCache, videos::VideoItem, DbPool};
|
||||||
|
use tokio::task;
|
||||||
|
|
||||||
pub mod perverzija;
|
pub mod perverzija;
|
||||||
pub mod hanime;
|
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<String>, page: String, per_page: String, featured: String) -> Vec<VideoItem>;
|
async fn get_videos(&self, cache: VideoCache, pool: DbPool, channel: String, sort: String, query: Option<String>, page: String, per_page: String, featured: String) -> Vec<VideoItem>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub enum AnyProvider {
|
pub enum AnyProvider {
|
||||||
Perverzija(PerverzijaProvider),
|
Perverzija(PerverzijaProvider),
|
||||||
Hanime(HanimeProvider),
|
Hanime(HanimeProvider),
|
||||||
@@ -16,7 +18,7 @@ pub enum AnyProvider {
|
|||||||
impl Provider for AnyProvider {
|
impl Provider for AnyProvider {
|
||||||
async fn get_videos(&self, cache: VideoCache, pool:DbPool, channel: String, sort: String, query: Option<String>, page: String, per_page: String, featured: String) -> Vec<VideoItem> {
|
async fn get_videos(&self, cache: VideoCache, pool:DbPool, channel: String, sort: String, query: Option<String>, page: String, per_page: String, featured: String) -> Vec<VideoItem> {
|
||||||
match self {
|
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::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,
|
AnyProvider::Spankbang(p) => p.get_videos(cache, pool, channel, sort, query, page, per_page, featured).await,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ error_chain! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub struct PerverzijaProvider {
|
pub struct PerverzijaProvider {
|
||||||
url: String,
|
url: String,
|
||||||
}
|
}
|
||||||
@@ -31,12 +33,6 @@ impl PerverzijaProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
async fn get(&self, cache:VideoCache, pool:DbPool, page: u8, featured: String) -> Result<Vec<VideoItem>> {
|
async fn get(&self, cache:VideoCache, pool:DbPool, page: u8, featured: String) -> Result<Vec<VideoItem>> {
|
||||||
//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();
|
let mut prefix_uri = "".to_string();
|
||||||
if featured == "featured" {
|
if featured == "featured" {
|
||||||
@@ -118,6 +114,9 @@ impl PerverzijaProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
async fn query(&self, cache: VideoCache, pool:DbPool, page: u8, query: &str) -> Result<Vec<VideoItem>> {
|
async fn query(&self, cache: VideoCache, pool:DbPool, page: u8, query: &str) -> Result<Vec<VideoItem>> {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let search_string = query.replace(" ", "+");
|
let search_string = query.replace(" ", "+");
|
||||||
let mut url = format!(
|
let mut url = format!(
|
||||||
"{}page/{}/?s={}",
|
"{}page/{}/?s={}",
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ error_chain! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
pub struct SpankbangProvider {
|
pub struct SpankbangProvider {
|
||||||
url: String,
|
url: String,
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user