use log::{info, warn}; use serde::{Deserialize, Serialize}; use crate::{InfoJson, json_get}; use super::PostProcessor; #[derive(Debug, Clone, Copy)] pub struct DeArrowPP; impl PostProcessor for DeArrowPP { fn extractors(&self) -> &'static [&'static str] { &["Youtube"] } fn process(&self, mut info: InfoJson) -> Result { let mut output: DeArrowApi = reqwest::blocking::get(format!( "https://sponsor.ajay.app/api/branding?videoID={}", json_get!(info, "id", as_str) ))? .json()?; output.titles.reverse(); let title_len = output.titles.len(); loop { let Some(title) = output.titles.pop() else { break; }; if (title.locked || title.votes < 1) && title_len > 1 { info!( "Skipping title {:#?}, as it is not good enough", title.value ); // Skip titles that are not “good” enough. continue; } if let Some(old_title) = info.insert( "title".to_owned(), serde_json::Value::String(title.value.clone()), ) { warn!("Updating title from {:#?} to {:#?}", old_title, title.value); info.insert("original_title".to_owned(), old_title); } else { warn!("Setting title to {:#?}", title.value); } break; } Ok(info) } } #[derive(Serialize, Deserialize)] /// See: struct DeArrowApi { titles: Vec, thumbnails: Vec<Thumbnail>, #[serde(alias = "randomTime")] random_time: Option<f64>, #[serde(alias = "videoDuration")] video_duration: Option<f64>, #[serde(alias = "casualVotes")] casual_votes: Vec<String>, } #[derive(Serialize, Deserialize)] struct Title { /// Note: Titles will sometimes contain > before a word. /// This tells the auto-formatter to not format a word. /// If you have no auto-formatter, you can ignore this and replace it with an empty string #[serde(alias = "title")] value: String, original: bool, votes: u64, locked: bool, #[serde(alias = "UUID")] uuid: String, /// only present if requested #[serde(alias = "userID")] user_id: Option<String>, } #[derive(Serialize, Deserialize)] struct Thumbnail { // null if original is true timestamp: Option<f64>, original: bool, votes: u64, locked: bool, #[serde(alias = "UUID")] uuid: String, /// only present if requested #[serde(alias = "userID")] user_id: Option<String>, }