Input: Json parsing errors now contain the parsed text (#31)
This commit is contained in:
@@ -16,7 +16,12 @@ pub enum Error {
|
|||||||
/// An error occurred while reading, or opening a file.
|
/// An error occurred while reading, or opening a file.
|
||||||
Io(IoError),
|
Io(IoError),
|
||||||
/// An error occurred while parsing JSON (i.e., during metadata/stereo detection).
|
/// An error occurred while parsing JSON (i.e., during metadata/stereo detection).
|
||||||
Json(JsonError),
|
Json {
|
||||||
|
/// Json error
|
||||||
|
error: JsonError,
|
||||||
|
/// Text that failed to be parsed
|
||||||
|
parsed_text: String,
|
||||||
|
},
|
||||||
/// An error occurred within the Opus codec.
|
/// An error occurred within the Opus codec.
|
||||||
Opus(OpusError),
|
Opus(OpusError),
|
||||||
/// Failed to extract metadata from alternate pipe.
|
/// Failed to extract metadata from alternate pipe.
|
||||||
@@ -57,12 +62,6 @@ impl From<IoError> for Error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<JsonError> for Error {
|
|
||||||
fn from(e: JsonError) -> Self {
|
|
||||||
Error::Json(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<OpusError> for Error {
|
impl From<OpusError> for Error {
|
||||||
fn from(e: OpusError) -> Error {
|
fn from(e: OpusError) -> Error {
|
||||||
Error::Opus(e)
|
Error::Opus(e)
|
||||||
|
|||||||
@@ -140,7 +140,12 @@ pub(crate) async fn is_stereo(path: &OsStr) -> Result<(bool, Metadata)> {
|
|||||||
.output()
|
.output()
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let value: Value = serde_json::from_reader(&out.stdout[..])?;
|
let value: Value = serde_json::from_reader(&out.stdout[..]).map_err(|err| Error::Json {
|
||||||
|
error: err,
|
||||||
|
parsed_text: std::str::from_utf8(&out.stdout[..])
|
||||||
|
.unwrap_or_default()
|
||||||
|
.to_string(),
|
||||||
|
})?;
|
||||||
|
|
||||||
let metadata = Metadata::from_ffprobe_json(&value);
|
let metadata = Metadata::from_ffprobe_json(&value);
|
||||||
|
|
||||||
|
|||||||
@@ -67,29 +67,28 @@ pub(crate) async fn _ytdl(uri: &str, pre_args: &[&str]) -> Result<Input> {
|
|||||||
.spawn()?;
|
.spawn()?;
|
||||||
|
|
||||||
let stderr = youtube_dl.stderr.take();
|
let stderr = youtube_dl.stderr.take();
|
||||||
|
|
||||||
let (returned_stderr, value) = task::spawn_blocking(move || {
|
let (returned_stderr, value) = task::spawn_blocking(move || {
|
||||||
if let Some(mut s) = stderr {
|
let mut s = stderr.unwrap();
|
||||||
let out: Option<Value> = {
|
let out: Result<Value> = {
|
||||||
let mut o_vec = vec![];
|
let mut o_vec = vec![];
|
||||||
let mut serde_read = BufReader::new(s.by_ref());
|
let mut serde_read = BufReader::new(s.by_ref());
|
||||||
// Newline...
|
// Newline...
|
||||||
if let Ok(len) = serde_read.read_until(0xA, &mut o_vec) {
|
if let Ok(len) = serde_read.read_until(0xA, &mut o_vec) {
|
||||||
serde_json::from_slice(&o_vec[..len]).ok()
|
serde_json::from_slice(&o_vec[..len]).map_err(|err| Error::Json {
|
||||||
|
error: err,
|
||||||
|
parsed_text: std::str::from_utf8(&o_vec).unwrap_or_default().to_string(),
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
None
|
Result::Err(Error::Metadata)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
(Some(s), out)
|
(s, out)
|
||||||
} else {
|
|
||||||
(None, None)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.map_err(|_| Error::Metadata)?;
|
.map_err(|_| Error::Metadata)?;
|
||||||
|
|
||||||
youtube_dl.stderr = returned_stderr;
|
youtube_dl.stderr = Some(returned_stderr);
|
||||||
|
|
||||||
let ffmpeg = Command::new("ffmpeg")
|
let ffmpeg = Command::new("ffmpeg")
|
||||||
.args(pre_args)
|
.args(pre_args)
|
||||||
@@ -101,7 +100,7 @@ pub(crate) async fn _ytdl(uri: &str, pre_args: &[&str]) -> Result<Input> {
|
|||||||
.stdout(Stdio::piped())
|
.stdout(Stdio::piped())
|
||||||
.spawn()?;
|
.spawn()?;
|
||||||
|
|
||||||
let metadata = Metadata::from_ytdl_output(value.unwrap_or_default());
|
let metadata = Metadata::from_ytdl_output(value?);
|
||||||
|
|
||||||
trace!("ytdl metadata {:?}", metadata);
|
trace!("ytdl metadata {:?}", metadata);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user