fix: search for sensitive topics

This commit is contained in:
ThetaDev 2023-12-21 21:09:09 +01:00
parent 7dc47b1090
commit 31a8fcf2fb
No known key found for this signature in database
GPG key ID: 649CA4EBDC338394
3 changed files with 47 additions and 28 deletions

View file

@ -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<String>,
params: &'a str,
}
impl RustyPipeQuery {
@ -35,7 +34,7 @@ impl RustyPipeQuery {
let request_body = QSearch {
context,
query,
params: None,
params: "8AEB",
};
self.execute_request::<response::Search, _, _>(
@ -60,7 +59,7 @@ impl RustyPipeQuery {
let request_body = QSearch {
context,
query,
params: Some(filter.encode()),
params: &filter.encode(),
};
self.execute_request::<response::Search, _, _>(

View file

@ -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);
}

View file

@ -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::<YouTubeItem, _>(q, &search_filter::SearchFilter::new()),
)
} else {
tokio_test::block_on(rp.query().search::<YouTubeItem, _>(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();