diff options
| author | Jokler <jokler@protonmail.com> | 2020-10-04 00:16:55 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-04 00:16:55 +0200 |
| commit | 23671b51b4e207574a63bce820acbf43169e2b6c (patch) | |
| tree | 326f7948ca7ca952201cabffe3aea9fc2728f9ee | |
| parent | 46ce39a312144bf778962c36a7b578b62a639956 (diff) | |
| parent | 50087bc3bec74069d21f972c246ca22a6d70c1ed (diff) | |
| download | pokebot-23671b51b4e207574a63bce820acbf43169e2b6c.tar.gz pokebot-23671b51b4e207574a63bce820acbf43169e2b6c.zip | |
Merge pull request #67 from kilmanio/master
Added retry attempt when youtube-dl fails
| -rw-r--r-- | src/bot/music.rs | 2 | ||||
| -rw-r--r-- | 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<AudioMetadata, String> { - let ytdl_args = ["--no-playlist", "-f", "bestaudio/best", "-j", &uri]; +pub async fn get_audio_download_from_url(uri: String) -> Result<AudioMetadata, String> { + //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<String, String> { + 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) } |
