error fixes

This commit is contained in:
Simon
2026-09-08 10:44:25 +00:00
parent 7452dd5aa3
commit e50003a7ea
4 changed files with 20 additions and 11 deletions

View File

@@ -813,11 +813,8 @@ mod tests {
let formats = item.formats.as_ref().expect("formats present");
assert_eq!(formats.len(), 1);
assert_eq!(formats[0].url, "https://coomer.st/data/abc/clip.mp4");
let headers = formats[0]
.http_headers
.as_ref()
.expect("http_headers present");
assert_eq!(headers.get("Referer").map(String::as_str), Some(REFERER));
let headers = formats[0].http_headers_pairs();
assert!(headers.iter().any(|(k, v)| k == "Referer" && v == REFERER));
assert_eq!(item.uploadedAt, Some(1735787045));
}

View File

@@ -283,6 +283,8 @@ impl HentaimamaProvider {
let document = Html::parse_document(html);
let card_selector = Self::selector("article.se.episodes")?;
let link_selector = Self::selector("div.season_m a")?;
let series_title_selector = Self::selector("span.b")?;
let episode_title_selector = Self::selector("span.c")?;
let img_selector = Self::selector("img")?;
let rating_selector = Self::selector("div.rating")?;
let rating_re = Regex::new(r"([0-9]+(?:\.[0-9]+)?)").unwrap();
@@ -298,7 +300,16 @@ impl HentaimamaProvider {
let Some(url) = link.value().attr("href") else {
continue;
};
let title = Self::decode_entities(&link.text().collect::<String>());
// The series title and episode label are adjacent <span> siblings
// with no whitespace between their text nodes.
let series_title = link.select(&series_title_selector).next().map(|e| e.text().collect::<String>());
let episode_title = link.select(&episode_title_selector).next().map(|e| e.text().collect::<String>());
let title = match (series_title, episode_title) {
(Some(series), Some(episode)) if !episode.trim().is_empty() => format!("{series} {episode}"),
(Some(series), _) => series,
_ => link.text().collect::<String>(),
};
let title = Self::decode_entities(&title);
if title.is_empty() {
continue;
}
@@ -379,7 +390,7 @@ impl HentaimamaProvider {
fn rtmp_p_regex() -> &'static Regex {
static RE: std::sync::OnceLock<Regex> = std::sync::OnceLock::new();
RE.get_or_init(|| Regex::new(r#"dt_embed=rtmp[^"]*?[?&]p=([A-Za-z0-9+/=]+)"#).expect("valid regex"))
RE.get_or_init(|| Regex::new(r#"dt_embed=rtmp[^"]*?[;&?]p=([A-Za-z0-9+/=]+)"#).expect("valid regex"))
}
fn iframe_src_regex() -> &'static Regex {
@@ -416,9 +427,9 @@ impl HentaimamaProvider {
}
fn format_from_jwplayer(embed_html: &str) -> Option<VideoFormat> {
let src = &Self::jwplayer_file_regex().captures(embed_html)?[1];
let src = Self::jwplayer_file_regex().captures(embed_html)?[1].replace("\\/", "/");
let container = if src.to_lowercase().contains(".m3u8") { "m3u8" } else { "mp4" };
Some(VideoFormat::new(src.to_string(), "auto".to_string(), container.to_string()))
Some(VideoFormat::new(src, "auto".to_string(), container.to_string()))
}
async fn fetch_player_iframe(

View File

@@ -848,8 +848,8 @@ mod tests {
let formats = item.formats.as_ref().expect("formats should be populated");
assert_eq!(formats.len(), 1);
assert!(formats[0].url.contains("get_file/6/abcdef/228000/228306/228306.mp4"));
let headers = formats[0].http_headers.as_ref().expect("headers set");
assert_eq!(headers.get("Referer").map(String::as_str), Some(REFERER));
let headers = formats[0].http_headers_pairs();
assert!(headers.iter().any(|(k, v)| k == "Referer" && v == REFERER));
assert_eq!(
item.preview.as_deref(),
Some("https://notfans.com/contents/videos_screenshots/228000/228306/preview.jpg")