diff --git a/src/client/search.rs b/src/client/search.rs index 9a05b4e..b99066b 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -19,8 +19,7 @@ use super::{response, ClientType, MapResponse, MapResult, RustyPipeQuery, YTCont struct QSearch<'a> { context: YTContext<'a>, query: &'a str, - #[serde(skip_serializing_if = "Option::is_none")] - params: Option, + params: &'a str, } impl RustyPipeQuery { @@ -35,7 +34,7 @@ impl RustyPipeQuery { let request_body = QSearch { context, query, - params: None, + params: "8AEB", }; self.execute_request::( @@ -60,7 +59,7 @@ impl RustyPipeQuery { let request_body = QSearch { context, query, - params: Some(filter.encode()), + params: &filter.encode(), }; self.execute_request::( diff --git a/src/param/search_filter.rs b/src/param/search_filter.rs index 92ea81b..dddddc0 100644 --- a/src/param/search_filter.rs +++ b/src/param/search_filter.rs @@ -212,6 +212,8 @@ impl SearchFilter { extras.varint(1, 1); pb.embedded(8, extras); } + // Disable filter for sensitive topics (e.g. suicide) + pb.varint(30, 1); pb.to_base64() } @@ -256,29 +258,29 @@ mod tests { use super::*; #[rstest] - #[case(SearchFilter::new().item_type(ItemType::Video), "EgIQAQ%253D%253D")] - #[case(SearchFilter::new().item_type(ItemType::Channel), "EgIQAg%253D%253D")] - #[case(SearchFilter::new().item_type(ItemType::Playlist), "EgIQAw%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Hour), "EgIIAQ%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Day), "EgIIAg%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Week), "EgIIAw%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Month), "EgIIBA%253D%253D")] - #[case(SearchFilter::new().date(UploadDate::Year), "EgIIBQ%253D%253D")] - #[case(SearchFilter::new().length(Length::Short), "EgIYAQ%253D%253D")] - #[case(SearchFilter::new().length(Length::Medium), "EgIYAw%253D%253D")] - #[case(SearchFilter::new().length(Length::Long), "EgIYAg%253D%253D")] - #[case(SearchFilter::new().feature(Feature::IsLive), "EgJAAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::Is4k), "EgJwAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::IsHd), "EgIgAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::Subtitles), "EgIoAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::CCommons), "EgIwAQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::Is360), "EgJ4AQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::IsVr180), "EgPQAQE%253D")] - #[case(SearchFilter::new().feature(Feature::Is3d), "EgI4AQ%253D%253D")] - #[case(SearchFilter::new().feature(Feature::IsHdr), "EgPIAQE%253D")] - #[case(SearchFilter::new().sort(Order::Date), "CAI%253D")] - #[case(SearchFilter::new().sort(Order::Views), "CAM%253D")] - #[case(SearchFilter::new().sort(Order::Rating), "CAE%253D")] + #[case(SearchFilter::new().item_type(ItemType::Video), "EgIQAfABAQ%253D%253D")] + #[case(SearchFilter::new().item_type(ItemType::Channel), "EgIQAvABAQ%253D%253D")] + #[case(SearchFilter::new().item_type(ItemType::Playlist), "EgIQA_ABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Hour), "EgIIAfABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Day), "EgIIAvABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Week), "EgIIA_ABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Month), "EgIIBPABAQ%253D%253D")] + #[case(SearchFilter::new().date(UploadDate::Year), "EgIIBfABAQ%253D%253D")] + #[case(SearchFilter::new().length(Length::Short), "EgIYAfABAQ%253D%253D")] + #[case(SearchFilter::new().length(Length::Medium), "EgIYA_ABAQ%253D%253D")] + #[case(SearchFilter::new().length(Length::Long), "EgIYAvABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::IsLive), "EgJAAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::Is4k), "EgJwAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::IsHd), "EgIgAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::Subtitles), "EgIoAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::CCommons), "EgIwAfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::Is360), "EgJ4AfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::IsVr180), "EgPQAQHwAQE%253D")] + #[case(SearchFilter::new().feature(Feature::Is3d), "EgI4AfABAQ%253D%253D")] + #[case(SearchFilter::new().feature(Feature::IsHdr), "EgPIAQHwAQE%253D")] + #[case(SearchFilter::new().sort(Order::Date), "CALwAQE%253D")] + #[case(SearchFilter::new().sort(Order::Views), "CAPwAQE%253D")] + #[case(SearchFilter::new().sort(Order::Rating), "CAHwAQE%253D")] fn t_filter(#[case] filter: SearchFilter, #[case] expect: &str) { assert_eq!(urlencoding::encode(&filter.encode()), expect); } diff --git a/tests/youtube.rs b/tests/youtube.rs index 0b35439..ded1a58 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -754,7 +754,7 @@ fn get_video_details_no_desc(rp: RustyPipe) { assert_eq!(details.id, "VYJNSQ_ANyA"); assert_eq!(details.name, "Cricket comedy by Modi"); assert_eq!(details.channel.id, "UC8gBy2lByHxIyoPMglerNWg"); - assert_eq!(details.channel.name, "TMP Shorts"); + assert_eq!(details.channel.name, "TMP Mix Veg"); assert!(!details.channel.avatar.is_empty(), "no channel avatars"); assert!( @@ -1256,6 +1256,24 @@ fn search_empty(rp: RustyPipe) { assert!(result.items.is_empty()); } +#[rstest] +#[case::no_filter(false)] +#[case::filter(true)] +fn search_sensitive(rp: RustyPipe, #[case] filter: bool) { + let q = "suicide"; + let result = if filter { + tokio_test::block_on( + rp.query() + .search_filter::(q, &search_filter::SearchFilter::new()), + ) + } else { + tokio_test::block_on(rp.query().search::(q)) + } + .unwrap(); + assert_gte(result.items.count.unwrap(), 10_000, "results"); + assert_next(result.items, rp.query(), 10, 2); +} + #[rstest] fn search_suggestion(rp: RustyPipe) { let result = tokio_test::block_on(rp.query().search_suggestion("hunger ga")).unwrap();