Files
scraper/src/modules/komik/repository.rs
T

79 lines
2.1 KiB
Rust

use crate::shared::database::traits::scraping_repository::ScrapingRepository;
use crate::shared::errors::AppError;
use crate::shared::utils::fetch_html_with_retry;
use crate::shared::utils::web::scraping_urls::{get_komik_api_url, get_komik_url};
use async_trait::async_trait;
pub struct KomikRepository;
impl Default for KomikRepository {
fn default() -> Self {
Self::new()
}
}
impl KomikRepository {
pub fn new() -> Self {
Self
}
pub fn api_url(&self) -> String {
get_komik_api_url()
}
pub fn base_url(&self) -> String {
get_komik_url()
}
pub fn genre_url(&self, genre_slug: &str, page: u32) -> String {
if page == 1 {
format!("{}/genre/{}/", self.api_url(), genre_slug)
} else {
format!("{}/genre/{}/page/{}/", self.api_url(), genre_slug, page)
}
}
pub fn search_url(&self, query: &str, page: u32) -> String {
if page == 1 {
format!("{}/search/{}/", self.api_url(), query)
} else {
format!("{}/search/{}/page/{}/", self.api_url(), query, page)
}
}
pub fn manga_list_url(&self, page: u32) -> String {
format!("{}/manga/page/{}/?tipe=manga", self.api_url(), page)
}
pub fn manhua_list_url(&self, page: u32) -> String {
format!("{}/manga/page/{}/?tipe=manhua", self.api_url(), page)
}
pub fn manhwa_list_url(&self, page: u32) -> String {
format!("{}/manga/page/{}/?tipe=manhwa", self.api_url(), page)
}
pub fn popular_list_url(&self, page: u32) -> String {
format!(
"{}/manga/page/{}/?orderby=meta_value_num",
self.api_url(),
page
)
}
pub fn detail_url(&self, slug: &str) -> String {
format!("{}/manga/{}/", self.base_url(), slug)
}
pub fn chapter_url(&self, chapter_url: &str) -> String {
format!("{}/{}", self.base_url(), chapter_url)
}
}
#[async_trait]
impl ScrapingRepository for KomikRepository {
async fn fetch_html(&self, url: &str) -> Result<String, AppError> {
fetch_html_with_retry(url).await
}
}