From 50087bc3bec74069d21f972c246ca22a6d70c1ed Mon Sep 17 00:00:00 2001 From: kilmanio Date: Sat, 3 Oct 2020 16:55:36 +0000 Subject: Added retry functionality for youtube-dl failing --- src/bot/music.rs | 2 +- src/youtube_dl.rs | 29 +++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/bot/music.rs b/src/bot/music.rs index 19b1c3f..90305d0 100644 --- a/src/bot/music.rs +++ b/src/bot/music.rs @@ -185,7 +185,7 @@ impl MusicBot { } pub async fn add_audio(&self, url: String, user: String) { - match crate::youtube_dl::get_audio_download_url(url).await { + match crate::youtube_dl::get_audio_download_from_url(url).await { Ok(mut metadata) => { metadata.added_by = user; info!("Found audio url: {}", metadata.url); diff --git a/src/youtube_dl.rs b/src/youtube_dl.rs index cc708af..496d0b4 100644 --- a/src/youtube_dl.rs +++ b/src/youtube_dl.rs @@ -28,23 +28,40 @@ where Ok(dur.map(Duration::from_secs_f64)) } -pub async fn get_audio_download_url(uri: String) -> Result { - let ytdl_args = ["--no-playlist", "-f", "bestaudio/best", "-j", &uri]; +pub async fn get_audio_download_from_url(uri: String) -> Result { + //youtube-dl sometimes just fails, so we give it a second try + let ytdl_output = match run_youtube_dl(&uri).await { + Ok(o) => o, + Err(e) => { + if e.contains("Unable to extract video data") { + run_youtube_dl(&uri).await? + } else { + return Err(e); + } + } + }; + + let output = serde_json::from_str(&ytdl_output).map_err(|e| e.to_string())?; + + Ok(output) +} + +async fn run_youtube_dl(url: &str) -> Result { + let ytdl_args = ["--no-playlist", "-f", "bestaudio/best", "-j", &url]; let mut cmd = Command::new("youtube-dl"); cmd.args(&ytdl_args); cmd.stdin(Stdio::null()); debug!("yt-dl command: {:?}", cmd); - let ytdl_output = cmd.output().await.unwrap(); if !ytdl_output.status.success() { - return Err(String::from_utf8(ytdl_output.stderr).unwrap()); + let s = String::from_utf8(ytdl_output.stderr).unwrap(); + return Err(s); } let output_str = String::from_utf8(ytdl_output.stdout).unwrap(); - let output = serde_json::from_str(&output_str).map_err(|e| e.to_string())?; - Ok(output) + Ok(output_str) } -- cgit v1.2.3-70-g09d2