63 lines
1.5 KiB
Rust
63 lines
1.5 KiB
Rust
use ntex::web;
|
|
use url::Url;
|
|
|
|
use crate::util::requester::Requester;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct SupjavProxy {}
|
|
|
|
impl SupjavProxy {
|
|
pub fn new() -> Self {
|
|
Self {}
|
|
}
|
|
|
|
fn normalize_target(endpoint: &str) -> Option<String> {
|
|
let endpoint = endpoint.trim().trim_start_matches('/');
|
|
if endpoint.is_empty() {
|
|
return None;
|
|
}
|
|
|
|
let target = if endpoint.starts_with("http://") || endpoint.starts_with("https://") {
|
|
endpoint.to_string()
|
|
} else {
|
|
format!("https://{endpoint}")
|
|
};
|
|
|
|
Self::is_allowed_media_url(&target).then_some(target)
|
|
}
|
|
|
|
fn is_allowed_media_url(url: &str) -> bool {
|
|
let Some(parsed) = Url::parse(url).ok() else {
|
|
return false;
|
|
};
|
|
if parsed.scheme() != "https" {
|
|
return false;
|
|
}
|
|
|
|
let Some(host) = parsed.host_str() else {
|
|
return false;
|
|
};
|
|
let host = host.to_ascii_lowercase();
|
|
if !(host == "turbovidhls.com"
|
|
|| host == "turboviplay.com"
|
|
|| host.ends_with(".turboviplay.com")
|
|
|| host.ends_with(".turbovidhls.com"))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
parsed.path().to_ascii_lowercase().contains(".m3u8")
|
|
}
|
|
}
|
|
|
|
impl crate::proxies::Proxy for SupjavProxy {
|
|
async fn get_video_url(
|
|
&self,
|
|
url: String,
|
|
_requester: web::types::State<Requester>,
|
|
) -> String {
|
|
Self::normalize_target(&url).unwrap_or_default()
|
|
}
|
|
}
|
|
|