diff --git a/src/providers/javtiful.rs b/src/providers/javtiful.rs index 86749b3..f60ec30 100644 --- a/src/providers/javtiful.rs +++ b/src/providers/javtiful.rs @@ -154,7 +154,7 @@ impl JavtifulProvider { }; if page > 1 && !text.contains(&format!( - "
  • {}", + "{}", page )) { @@ -222,7 +222,7 @@ impl JavtifulProvider { }; if page > 1 && !text.contains(&format!( - "
  • {}", + "{}", page )) { @@ -250,10 +250,11 @@ impl JavtifulProvider { return vec![]; } - let block = match html.split("pagination ").next().and_then(|s| { - s.split("row row-cols-1 row-cols-sm-2 row-cols-lg-3 row-cols-xl-4") - .nth(1) - }) { + let block = match html + .split("front-pagination") + .next() + .and_then(|s| s.split("front-video-grid").nth(1)) + { Some(b) => b, None => { eprint!("Javtiful Provider: Failed to get block from html"); @@ -273,9 +274,9 @@ impl JavtifulProvider { }; let futures = block - .split("card ") + .split("\"front-video-card\"") .skip(1) - .filter(|seg| !seg.contains("SPONSOR")) + .filter(|seg| !seg.contains("front-ad-card")) .map(|el| self.get_video_item(el.to_string(), requester.clone(), options)); join_all(futures) @@ -313,20 +314,33 @@ impl JavtifulProvider { mut requester: Requester, options: &ServerOptions, ) -> Result { - let video_url = seg - .split(" href=\"") - .nth(1) - .and_then(|s| s.split('"').next()) - .ok_or_else(|| ErrorKind::Parse("video url\n\n{seg}".into()))? - .to_string(); + let video_url = format!( + "{}{}", + self.url, + seg.split(" href=\"") + .nth(1) + .and_then(|s| s.split('"').next()) + .ok_or_else(|| ErrorKind::Parse(format!("video url\n\n{seg}")))? + .to_string() + ); - let mut title = seg - .split(" alt=\"") - .nth(1) - .and_then(|s| s.split('"').next()) - .ok_or_else(|| ErrorKind::Parse(format!("video title\n\n{seg}").into()))? - .trim() - .to_string(); + let mut title = match seg.contains("front-video-title") { + true => seg + .split("front-video-title") + .nth(1) + .and_then(|s| s.split('>').nth(1)) + .and_then(|s| s.split('<').next()) + .ok_or_else(|| ErrorKind::Parse(format!("video title\n\n{seg}")))? + .trim() + .to_string(), + false => seg + .split("alt=\"") + .nth(1) + .and_then(|s| s.split('\"').next()) + .ok_or_else(|| ErrorKind::Parse(format!("video title\n\n{seg}")))? + .trim() + .to_string(), + }; title = decode(title.as_bytes()) .to_string() @@ -334,21 +348,22 @@ impl JavtifulProvider { .titlecase(); let id = video_url .split('/') - .nth(5) + .filter(|s| !s.is_empty()) + .nth(2) .and_then(|s| s.split('.').next()) - .ok_or_else(|| ErrorKind::Parse("video id\n\n{seg}".into()))? + .ok_or_else(|| ErrorKind::Parse(format!("video id\n\n{seg}")))? .to_string(); - let thumb_block = seg - .split(" format!("{}{}", self.url,block + .split("src=\"") + .nth(1) + .and_then(|s| s.split('"').next()) + .unwrap_or("") + .to_string()), + None => "".to_string(), + }; let mut preview = seg .split("data-trailer=\"") .nth(1) @@ -356,7 +371,7 @@ impl JavtifulProvider { .unwrap_or("") .to_string(); let raw_duration = seg - .split("label-duration\">") + .split("class=\"front-duration-tag\">") .nth(1) .and_then(|s| s.split('<').next()) .unwrap_or("") @@ -367,7 +382,11 @@ impl JavtifulProvider { if preview.len() == 0 { preview = format!("https://trailers.jav.si/preview/{id}.mp4"); } - let proxy_url = build_proxy_url(options, "javtiful", &strip_url_scheme(&video_url)); + let proxy_url = build_proxy_url( + options, + "javtiful", + &strip_url_scheme(video_url.clone().as_str()), + ); let video_item = VideoItem::new(id, title, proxy_url, "javtiful".into(), thumb, duration) .tags(tags) .preview(preview) diff --git a/src/providers/mod.rs b/src/providers/mod.rs index 06eccfb..0870e33 100644 --- a/src/providers/mod.rs +++ b/src/providers/mod.rs @@ -653,6 +653,7 @@ pub fn strip_url_scheme(url: &str) -> String { #[allow(dead_code)] pub fn build_proxy_url(options: &ServerOptions, proxy: &str, target: &str) -> String { + println!("Building proxy URL with options={:?}, proxy={}, target={}", options, proxy, target); let target = target.trim_start_matches('/'); let base = options .public_url_base @@ -660,6 +661,10 @@ pub fn build_proxy_url(options: &ServerOptions, proxy: &str, target: &str) -> St .unwrap_or("") .trim_end_matches('/'); + if target.starts_with("http://") || target.starts_with("https://") { + return format!("/proxy/{target}"); + } + if base.is_empty() { format!("/proxy/{proxy}/{target}") } else { diff --git a/src/proxies/javtiful.rs b/src/proxies/javtiful.rs index 95c04e7..7bfa110 100644 --- a/src/proxies/javtiful.rs +++ b/src/proxies/javtiful.rs @@ -89,10 +89,13 @@ impl JavtifulProxy { url: String, requester: web::types::State, ) -> String { + println!("JavtifulProxy: Getting video URL for {url}"); let mut requester = requester.get_ref().clone(); let Some((detail_url, video_id)) = Self::normalize_detail_request(&url) else { + println!("JavtifulProxy: Invalid detail URL: {url}"); return String::new(); }; + println!("Normalized detail URL: {detail_url}, video ID: {video_id}"); let html = requester.get(&detail_url, Some(Version::HTTP_11)).await; let Ok(html) = html else { @@ -101,33 +104,15 @@ impl JavtifulProxy { if html.is_empty() { return String::new(); } + println!("Fetched HTML content for {detail_url} (length: {})", html.len()); - let Some(token) = Self::extract_token(&html) else { - return String::new(); - }; - - let form = wreq::multipart::Form::new() - .text("video_id", video_id) - .text("pid_c", "".to_string()) - .text("token", token); - let resp = match requester - .post_multipart( - "https://javtiful.com/ajax/get_cdn", - form, - vec![ - ("Referer".to_string(), detail_url), - ("Origin".to_string(), "https://javtiful.com".to_string()), - ("Accept".to_string(), "*/*".to_string()), - ], - Some(Version::HTTP_11), - ) - .await - { - Ok(r) => r, - Err(_) => return String::new(), - }; - let payload = resp.text().await.unwrap_or_default(); - Self::extract_playlist_url(&payload).unwrap_or_default() + let media_url = format!("https://javtiful.com{}", html.split("playerSources\":[{\"src\":\"") + .nth(1) + .and_then(|s| s.split('"').next()) + .map(str::trim) + .map(ToOwned::to_owned).unwrap_or_default()); + println!("{media_url}"); + media_url } }