aboutsummaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/yt_dlp/Cargo.toml2
-rw-r--r--crates/yt_dlp/src/post_processors/dearrow.rs86
2 files changed, 56 insertions, 32 deletions
diff --git a/crates/yt_dlp/Cargo.toml b/crates/yt_dlp/Cargo.toml
index 3eff9a2..4f62eec 100644
--- a/crates/yt_dlp/Cargo.toml
+++ b/crates/yt_dlp/Cargo.toml
@@ -22,9 +22,9 @@ rust-version.workspace = true
publish = true
[dependencies]
+curl = "0.4.48"
indexmap = { version = "2.9.0", default-features = false }
log.workspace = true
-reqwest = { version = "0.12.20", features = ["blocking", "json"] }
rustpython = { git = "https://github.com/RustPython/RustPython.git", features = [
"threading",
"stdlib",
diff --git a/crates/yt_dlp/src/post_processors/dearrow.rs b/crates/yt_dlp/src/post_processors/dearrow.rs
index bdbea7c..7dc6bbb 100644
--- a/crates/yt_dlp/src/post_processors/dearrow.rs
+++ b/crates/yt_dlp/src/post_processors/dearrow.rs
@@ -8,7 +8,12 @@
// You should have received a copy of the License along with this program.
// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-use log::{info, warn};
+use curl::easy::Easy;
+use log::{error, info, warn};
+use rustpython::vm::{
+ PyRef, VirtualMachine,
+ builtins::{PyDict, PyStr},
+};
use serde::{Deserialize, Serialize};
use crate::{InfoJson, json_get};
@@ -24,44 +29,63 @@ impl PostProcessor for DeArrowPP {
}
fn process(&self, mut info: InfoJson) -> Result<InfoJson, super::Error> {
- let mut output: DeArrowApi = reqwest::blocking::get(format!(
- "https://sponsor.ajay.app/api/branding?videoID={}",
- json_get!(info, "id", as_str)
- ))?
- .json()?;
+ let mut output: DeArrowApi = {
+ let output_bytes = {
+ let mut dst = Vec::new();
- output.titles.reverse();
+ let mut easy = Easy::new();
+ easy.url(
+ format!(
+ "https://sponsor.ajay.app/api/branding?videoID={}",
+ pydict_get!(@vm, info, "id", PyStr).as_str()
+ )
+ .as_str(),
+ )?;
- let title_len = output.titles.len();
- loop {
- let Some(title) = output.titles.pop() else {
- break;
- };
+ let mut transfer = easy.transfer();
+ transfer.write_function(|data| {
+ dst.extend_from_slice(data);
+ Ok(data.len())
+ })?;
+ transfer.perform()?;
+ drop(transfer);
- 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;
- }
+ dst
+ };
- 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);
- }
+ serde_json::from_slice(&output_bytes)?
+ };
- break;
+ // We pop the titles, so we need this vector reversed.
+ output.titles.reverse();
+
+ let title_len = output.titles.len();
+ let selected = loop {
+ let Some(title) = output.titles.pop() else {
+ break false;
+ };
+
+ if (title.locked || title.votes < 1) && title_len > 1 {
+ info!(
+ "DeArrow: Skipping title {:#?}, as it is not good enough",
+ title.value
+ );
+ // Skip titles that are not “good” enough.
+ continue;
}
- Ok(info)
+ update_title(&info, &title.value, vm);
+
+ break true;
+ };
+
+ if !selected && title_len != 0 {
+ // No title was selected, even though we had some titles.
+ // Just pick the first one in this case.
+ update_title(&info, &output.titles[0].value, vm);
}
+
+ Ok(info)
}
#[derive(Serialize, Deserialize)]