diff options
Diffstat (limited to 'remuxer')
| -rw-r--r-- | remuxer/src/import/mod.rs | 48 | 
1 files changed, 44 insertions, 4 deletions
| diff --git a/remuxer/src/import/mod.rs b/remuxer/src/import/mod.rs index 8c89b4d..ab3be3d 100644 --- a/remuxer/src/import/mod.rs +++ b/remuxer/src/import/mod.rs @@ -5,7 +5,7 @@  */  pub mod seek_index; -use anyhow::{anyhow, bail, Result}; +use anyhow::{anyhow, bail, Context, Result};  use jellycommon::{LocalTrack, SourceTrack, SourceTrackKind};  use jellymatroska::{      matroska::MatroskaTag, @@ -22,7 +22,8 @@ pub struct MatroskaMetadata {      pub tagline: Option<String>,      pub tracks: Vec<SourceTrack>,      pub track_sources: Vec<LocalTrack>, -    pub image: Option<(String, Vec<u8>)>, +    pub cover: Option<(String, Vec<u8>)>, +    pub infojson: Option<String>,      pub duration: f64,  } @@ -126,6 +127,45 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> {                      }                  }              } +            MatroskaTag::Attachments(_) => { +                let mut children = children.unwrap(); +                while let Some(Ok(Unflat { children, item, .. })) = children.n() { +                    match item { +                        MatroskaTag::AttachedFile(_) => { +                            let (mut name, mut data, mut mime) = Default::default(); +                            let mut children = children.unwrap(); +                            while let Some(Ok(Unflat { +                                children: _, item, .. +                            })) = children.n() +                            { +                                match item { +                                    MatroskaTag::FileName(n) => name = Some(n), +                                    MatroskaTag::FileData(d) => data = Some(d), +                                    MatroskaTag::FileMimeType(m) => mime = Some(m), +                                    _ => debug!("(rsaa) tag ignored: {item:?}"), +                                } +                            } +                            let (name, data, mime) = ( +                                name.ok_or(anyhow!("attachment without name"))?, +                                data.ok_or(anyhow!("attachment without data"))?, +                                mime.ok_or(anyhow!("attachment without mime type"))?, +                            ); +                            info!("attachment found: {name:?} type {mime:?}"); +                            match (name.as_str(), mime.as_str()) { +                                ("info.json", "application/json") => { +                                    m.infojson = +                                        Some(String::from_utf8(data).context("info.json invalid")?) +                                } +                                (_, "image/jpeg" | "image/png" | "image/webp") => { +                                    m.cover = Some((mime, data)) +                                } +                                _ => (), +                            } +                        } +                        _ => debug!("(rsa) tag ignored: {item:?}"), +                    } +                } +            }              MatroskaTag::Cues(_) => {}              MatroskaTag::Chapters(_) => {}              MatroskaTag::Tracks(_) => { @@ -218,12 +258,12 @@ fn import_read_segment(segment: &mut Unflatten) -> Result<MatroskaMetadata> {                                  codec_private,                              })                          } -                        _ => debug!("(rst) tag ignored: {item:?}"), +                        _ => warn!("(rst) tag ignored: {item:?}"),                      }                  }              }              MatroskaTag::Cluster(_) => {} -            _ => debug!("(rs) tag ignored: {item:?}"), +            _ => warn!("(rs) tag ignored: {item:?}"),          };      }      if let Some(duration) = duration { | 
