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.
|
||||
Io(IoError),
|
||||
/// 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.
|
||||
Opus(OpusError),
|
||||
/// 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 {
|
||||
fn from(e: OpusError) -> Error {
|
||||
Error::Opus(e)
|
||||
|
||||
@@ -140,7 +140,12 @@ pub(crate) async fn is_stereo(path: &OsStr) -> Result<(bool, Metadata)> {
|
||||
.output()
|
||||
.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);
|
||||
|
||||
|
||||
@@ -67,29 +67,28 @@ pub(crate) async fn _ytdl(uri: &str, pre_args: &[&str]) -> Result<Input> {
|
||||
.spawn()?;
|
||||
|
||||
let stderr = youtube_dl.stderr.take();
|
||||
|
||||
let (returned_stderr, value) = task::spawn_blocking(move || {
|
||||
if let Some(mut s) = stderr {
|
||||
let out: Option<Value> = {
|
||||
let mut o_vec = vec![];
|
||||
let mut serde_read = BufReader::new(s.by_ref());
|
||||
// Newline...
|
||||
if let Ok(len) = serde_read.read_until(0xA, &mut o_vec) {
|
||||
serde_json::from_slice(&o_vec[..len]).ok()
|
||||
} else {
|
||||
None
|
||||
}
|
||||
};
|
||||
let mut s = stderr.unwrap();
|
||||
let out: Result<Value> = {
|
||||
let mut o_vec = vec![];
|
||||
let mut serde_read = BufReader::new(s.by_ref());
|
||||
// Newline...
|
||||
if let Ok(len) = serde_read.read_until(0xA, &mut o_vec) {
|
||||
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 {
|
||||
Result::Err(Error::Metadata)
|
||||
}
|
||||
};
|
||||
|
||||
(Some(s), out)
|
||||
} else {
|
||||
(None, None)
|
||||
}
|
||||
(s, out)
|
||||
})
|
||||
.await
|
||||
.map_err(|_| Error::Metadata)?;
|
||||
|
||||
youtube_dl.stderr = returned_stderr;
|
||||
youtube_dl.stderr = Some(returned_stderr);
|
||||
|
||||
let ffmpeg = Command::new("ffmpeg")
|
||||
.args(pre_args)
|
||||
@@ -101,7 +100,7 @@ pub(crate) async fn _ytdl(uri: &str, pre_args: &[&str]) -> Result<Input> {
|
||||
.stdout(Stdio::piped())
|
||||
.spawn()?;
|
||||
|
||||
let metadata = Metadata::from_ytdl_output(value.unwrap_or_default());
|
||||
let metadata = Metadata::from_ytdl_output(value?);
|
||||
|
||||
trace!("ytdl metadata {:?}", metadata);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user