omgxxx fix
This commit is contained in:
@@ -1111,48 +1111,54 @@ impl OmgxxxProvider {
|
|||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.to_string();
|
.to_string();
|
||||||
|
|
||||||
let thumb = match video_segment
|
// Skip advertisement cards. They reuse class="item" but link to an
|
||||||
.split("img loading")
|
// external ad network instead of an omg.xxx video (and embed an
|
||||||
|
// <iframe> rather than a real <img> thumbnail), so they have no
|
||||||
|
// numeric video id under /videos/.
|
||||||
|
if !video_url.contains("/videos/")
|
||||||
|
|| id.is_empty()
|
||||||
|
|| !id.chars().all(|c| c.is_ascii_digit())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Thumbnail: the site lazy-loads most cards, putting the real image
|
||||||
|
// in data-src with a 1x1 base64 placeholder in src. Eager (high
|
||||||
|
// priority) cards carry the real image directly in src. Prefer
|
||||||
|
// data-src, fall back to src, and reject "data:" placeholders.
|
||||||
|
let img_tag = video_segment
|
||||||
|
.split("<img")
|
||||||
.collect::<Vec<&str>>()
|
.collect::<Vec<&str>>()
|
||||||
.get(1)
|
.get(1)
|
||||||
.copied()
|
.copied()
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.contains("data-src=\"")
|
.split('>')
|
||||||
{
|
.collect::<Vec<&str>>()
|
||||||
true => video_segment
|
.get(0)
|
||||||
.split("img loading")
|
.copied()
|
||||||
|
.unwrap_or_default();
|
||||||
|
let extract_attr = |attr: &str| -> String {
|
||||||
|
img_tag
|
||||||
|
.split(attr)
|
||||||
.collect::<Vec<&str>>()
|
.collect::<Vec<&str>>()
|
||||||
.get(1)
|
.get(1)
|
||||||
.copied()
|
.copied()
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.split("data-src=\"")
|
.split('"')
|
||||||
.collect::<Vec<&str>>()
|
|
||||||
.get(1)
|
|
||||||
.copied()
|
|
||||||
.unwrap_or_default()
|
|
||||||
.split("\"")
|
|
||||||
.collect::<Vec<&str>>()
|
.collect::<Vec<&str>>()
|
||||||
.get(0)
|
.get(0)
|
||||||
.copied()
|
.copied()
|
||||||
.unwrap_or_default()
|
.unwrap_or_default()
|
||||||
.to_string(),
|
.to_string()
|
||||||
false => video_segment
|
};
|
||||||
.split("img loading")
|
let data_src = extract_attr("data-src=\"");
|
||||||
.collect::<Vec<&str>>()
|
let src = extract_attr(" src=\"");
|
||||||
.get(1)
|
let thumb = if !data_src.is_empty() && !data_src.starts_with("data:") {
|
||||||
.copied()
|
data_src
|
||||||
.unwrap_or_default()
|
} else if !src.is_empty() && !src.starts_with("data:") {
|
||||||
.split("data-original=\"")
|
src
|
||||||
.collect::<Vec<&str>>()
|
} else {
|
||||||
.get(1)
|
String::new()
|
||||||
.copied()
|
|
||||||
.unwrap_or_default()
|
|
||||||
.split("\"")
|
|
||||||
.collect::<Vec<&str>>()
|
|
||||||
.get(0)
|
|
||||||
.copied()
|
|
||||||
.unwrap_or_default()
|
|
||||||
.to_string(),
|
|
||||||
};
|
};
|
||||||
let raw_duration = video_segment
|
let raw_duration = video_segment
|
||||||
.split("<span class=\"duration\">")
|
.split("<span class=\"duration\">")
|
||||||
@@ -1515,6 +1521,69 @@ mod tests {
|
|||||||
.any(|tag| tag.id == "mark-wood" && tag.title == "Mark Wood")
|
.any(|tag| tag.id == "mark-wood" && tag.title == "Mark Wood")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn skips_ads_and_extracts_thumbs_from_current_markup() {
|
||||||
|
// Mirrors the live omg.xxx markup as of mid-2026: <img> tags no longer
|
||||||
|
// carry a `loading` attribute, eager cards put the real image in `src`,
|
||||||
|
// lazy cards put a base64 placeholder in `src` with the real image in
|
||||||
|
// `data-src`, and advertisement cards reuse class="item" but link off-site.
|
||||||
|
let provider = test_provider();
|
||||||
|
let html = r##"
|
||||||
|
<div class="list-videos">
|
||||||
|
<div class="item">
|
||||||
|
<a href="https://www.omg.xxx/videos/93816267/eager-video/" title="Eager Video">
|
||||||
|
<img class="thumb thumb_img " fetchpriority="high" src="https://img.omg.xxx/93816000/93816267/medium@2x/1.jpg" alt="Eager Video" width="744" height="420"/>
|
||||||
|
<span class="duration"> 12:00 </span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<a href="https://a.aivanta76.com/native_txt?creative=native_txt" target="_blank" title="Create and Fuck your AI Cum Slut" class="">
|
||||||
|
<iframe src="https://engine.ultraomelette.com/banner"></iframe>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<a href="https://www.omg.xxx/videos/93816269/lazy-video/" title="Lazy Video">
|
||||||
|
<img loading="lazy" class="thumb thumb_img lazyload" fetchpriority="high" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src="https://img.omg.xxx/93816000/93816269/medium@2x/1.jpg" alt="Lazy Video" width="744" height="420"/>
|
||||||
|
<span class="duration"> 08:30 </span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
"##
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
let items = provider.get_video_items_from_html(html);
|
||||||
|
|
||||||
|
// The advertisement card must be filtered out.
|
||||||
|
assert_eq!(items.len(), 2);
|
||||||
|
assert!(items.iter().all(|item| item.url.contains("/videos/")));
|
||||||
|
assert!(
|
||||||
|
!items
|
||||||
|
.iter()
|
||||||
|
.any(|item| item.title.contains("AI Cum Slut"))
|
||||||
|
);
|
||||||
|
|
||||||
|
// Thumbnails must be real CDN URLs, never empty or base64 placeholders.
|
||||||
|
for item in &items {
|
||||||
|
assert!(
|
||||||
|
item.thumb.starts_with("https://img.omg.xxx/"),
|
||||||
|
"unexpected thumb: {:?}",
|
||||||
|
item.thumb
|
||||||
|
);
|
||||||
|
assert!(!item.thumb.starts_with("data:"));
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(items[0].id, "93816267");
|
||||||
|
assert_eq!(
|
||||||
|
items[0].thumb,
|
||||||
|
"https://img.omg.xxx/93816000/93816267/medium@2x/1.jpg"
|
||||||
|
);
|
||||||
|
assert_eq!(items[1].id, "93816269");
|
||||||
|
assert_eq!(
|
||||||
|
items[1].thumb,
|
||||||
|
"https://img.omg.xxx/93816000/93816269/medium@2x/1.jpg"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
|
|||||||
Reference in New Issue
Block a user