implement yt-dlp download

This commit is contained in:
mykola2312 2024-02-21 19:06:23 +02:00
parent 819e30c1fa
commit 4bc93de87e

View file

@ -1,4 +1,5 @@
use super::spawn::{spawn, SpawnError}; use super::spawn::{spawn, SpawnError};
use std::fs;
use core::fmt; use core::fmt;
use ordered_float::OrderedFloat; use ordered_float::OrderedFloat;
use serde::Deserialize; use serde::Deserialize;
@ -133,6 +134,7 @@ pub enum YtDlpError {
SpawnError(SpawnError), SpawnError(SpawnError),
ErrorMessage(String), // keep it separate type if we ever plan to parse yt-dlp errors ErrorMessage(String), // keep it separate type if we ever plan to parse yt-dlp errors
JsonError, JsonError,
NoFilePresent
} }
// ^(?:ERROR: \[.*\] \S* )(.*$) - regex for matching yt-dlp's youtube errors // ^(?:ERROR: \[.*\] \S* )(.*$) - regex for matching yt-dlp's youtube errors
@ -158,6 +160,7 @@ impl fmt::Display for YtDlpError {
YTE::SpawnError(e) => write!(f, "{}", e), YTE::SpawnError(e) => write!(f, "{}", e),
YTE::ErrorMessage(msg) => write!(f, "yt-dlp error - {}", msg), YTE::ErrorMessage(msg) => write!(f, "yt-dlp error - {}", msg),
YTE::JsonError => write!(f, "json parsing error"), YTE::JsonError => write!(f, "json parsing error"),
YTE::NoFilePresent => write!(f, "downloaded file doesn't exists")
} }
} }
} }
@ -170,6 +173,28 @@ impl YtDlp {
Ok(YtDlpInfo::parse(&output.stdout)?) Ok(YtDlpInfo::parse(&output.stdout)?)
} }
pub async fn download(url: &str, format_id: &str, output_path: &str) -> Result<(), YtDlpError> {
spawn(
"python",
[
"-m",
"yt_dlp",
url,
"-f",
format_id,
"-o",
output_path,
"--force-overwrites",
],
)
.await?;
match fs::metadata(output_path) {
Ok(_) => Ok(()),
Err(_) => Err(YtDlpError::NoFilePresent)
}
}
} }
#[cfg(test)] #[cfg(test)]