From 41373bf937e8bec577c10a2084d0f1bcc732b1a5 Mon Sep 17 00:00:00 2001 From: Simon Date: Tue, 10 Mar 2026 16:07:40 +0000 Subject: [PATCH] spankbang fix --- src/providers/spankbang.rs | 47 +++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/providers/spankbang.rs b/src/providers/spankbang.rs index a4d3362..aac567b 100644 --- a/src/providers/spankbang.rs +++ b/src/providers/spankbang.rs @@ -346,6 +346,7 @@ impl SpankbangProvider { fn get_video_items_from_html(&self, html: String) -> Vec { let document = Html::parse_document(&html); + let video_list_selector = Selector::parse(r#"[data-testid="video-list"]"#).unwrap(); let card_selector = Selector::parse(r#"[data-testid="video-item"]"#).unwrap(); let video_link_selector = Selector::parse(r#"a[href*="/video/"]"#).unwrap(); let title_selector = Selector::parse(r#"a[title]"#).unwrap(); @@ -359,7 +360,14 @@ impl SpankbangProvider { .unwrap(); let mut items = Vec::new(); - for card in document.select(&card_selector) { + let roots = document.select(&video_list_selector).collect::>(); + let cards = if let Some(root) = roots.last() { + root.select(&card_selector).collect::>() + } else { + document.select(&card_selector).collect::>() + }; + + for card in cards { if let Some(item) = self.parse_card( card, &video_link_selector, @@ -688,4 +696,41 @@ mod tests { assert_eq!(items[0].id, "2"); assert_eq!(items[0].title, "Free video"); } + + #[test] + fn prefers_primary_video_list_over_header_dropdown_cards() { + let provider = SpankbangProvider::new(); + let html = r#" +
+ +
+
+
+ + Right result +
17m
+
+
+ 35K + 96% +

Right result

+
+
+
+ "#; + + let items = provider.get_video_items_from_html(html.to_string()); + assert_eq!(items.len(), 1); + assert_eq!(items[0].id, "222"); + assert_eq!(items[0].title, "Right result"); + } }