From bd800f9b0820a1eb03794f792b1689fbe00e3f79 Mon Sep 17 00:00:00 2001 From: blank X Date: Tue, 29 Jun 2021 10:57:37 +0700 Subject: [PATCH] Seperate stdout and stderr --- src/main.rs | 6 +++--- src/structs.rs | 3 ++- src/utils.rs | 30 ++++++++++++------------------ 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/main.rs b/src/main.rs index a909d50..c6cf7fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -200,7 +200,7 @@ async fn async_main() { eprintln!("Failed to get video data: {:?}", err); waited = true; if let structs::Error::YoutubeDL(ref err) = err { - let output = err.output.to_lowercase(); + let output = err.stderr.to_lowercase(); if output.contains("429") || output.contains("too many request") || output.contains("technical difficult") @@ -210,12 +210,12 @@ async fn async_main() { *guard += 1; continue; } else if err - .output + .stderr .starts_with("ERROR: autoytarchivers:") { drop(guard); let time: u64 = err - .output + .stderr .splitn(5, &[':', ' '][..]) .nth(3) .unwrap() diff --git a/src/structs.rs b/src/structs.rs index 68a5800..80ab90c 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -45,7 +45,8 @@ pub struct VideoData { #[derive(Debug)] pub struct YoutubeDLError { pub status: ExitStatus, - pub output: String, + pub stdout: String, + pub stderr: String, } #[derive(Debug)] diff --git a/src/utils.rs b/src/utils.rs index a66499c..f55735d 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -6,7 +6,7 @@ use rand::{thread_rng, Rng}; use reqwest::Client; use std::io::Cursor; use std::process::Stdio; -use tokio::io::{copy_buf, AsyncWriteExt, BufReader}; +use tokio::io::AsyncWriteExt; use tokio::process::Command; use tokio::time::{sleep, Duration}; extern crate grammers_client; @@ -39,7 +39,7 @@ def try_get(src, getter, expected_type=None): youtube_dl.extractor.youtube.try_get = try_get ytdl = youtube_dl.YoutubeDL({"skip_download": True, "no_color": True, "quiet": True}) try: - print(json.dumps(ytdl.extract_info("https://www.youtube.com/watch?v=" + sys.argv[1]), indent=4), file=sys.stderr) + print(json.dumps(ytdl.extract_info("https://www.youtube.com/watch?v=" + sys.argv[1]), indent=4)) except Exception as e: sys.exit(str(e))"#; @@ -120,6 +120,7 @@ pub async fn get_video(video_id: &str) -> Result> { let mut process = command .args(&["-", video_id]) .stdin(Stdio::piped()) + .stdout(Stdio::piped()) .stderr(Stdio::piped()) .spawn()?; let mut stdin = process.stdin.take().unwrap(); @@ -129,21 +130,13 @@ pub async fn get_video(video_id: &str) -> Result> { } drop(stdin) }); - let stderr = process.stderr.take().unwrap(); - let task: tokio::task::JoinHandle> = - tokio::spawn(async move { - let mut stderr = BufReader::new(stderr); - let mut writer = vec![]; - copy_buf(&mut stderr, &mut writer).await?; - Ok(writer) - }); - let status = process.wait().await?; - let stderr = String::from_utf8(task.await??)?; - if status.success() { - let mut data: VideoData = serde_json::from_str(&stderr)?; - data.json = stderr; + let output = process.wait_with_output().await?; + if output.status.success() { + let mut data: VideoData = serde_json::from_slice(&output.stdout)?; + data.json = String::from_utf8(output.stdout)?; Ok(Some(data)) } else { + let stderr = String::from_utf8(output.stderr)?; let stderr_lowercase = stderr.to_lowercase(); if stderr_lowercase.contains("private video") || stderr_lowercase.contains("unavailable") @@ -152,8 +145,9 @@ pub async fn get_video(video_id: &str) -> Result> { Ok(None) } else { Err(Error::YoutubeDL(YoutubeDLError { - status, - output: stderr, + status: output.status, + stdout: String::from_utf8(output.stdout)?, + stderr, })) } } @@ -170,7 +164,7 @@ pub async fn get_video_retry( Err(err) => { eprintln!("Failed to get video data: {:?}", err); if let Error::YoutubeDL(ref err) = err { - let output = err.output.to_lowercase(); + let output = err.stderr.to_lowercase(); if output.contains("429") || output.contains("too many requests") || output.contains("technical difficult")