diff options
author | metamuffin <metamuffin@disroot.org> | 2025-04-13 18:19:03 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-04-13 18:19:03 +0200 |
commit | 48a57a52d85d387efe122fb4d9fb113f577a0a98 (patch) | |
tree | 7ad7effe44689be805194b06189d260948369d71 | |
parent | 68c579bc4ecbbf65cf4588adf88957de4c3444f9 (diff) | |
download | jellything-48a57a52d85d387efe122fb4d9fb113f577a0a98.tar jellything-48a57a52d85d387efe122fb4d9fb113f577a0a98.tar.bz2 jellything-48a57a52d85d387efe122fb4d9fb113f577a0a98.tar.zst |
arc mkmeta
-rw-r--r-- | import/src/lib.rs | 4 | ||||
-rw-r--r-- | remuxer/src/metadata.rs | 27 | ||||
-rw-r--r-- | stream/src/lib.rs | 34 |
3 files changed, 26 insertions, 39 deletions
diff --git a/import/src/lib.rs b/import/src/lib.rs index d7f9dd7..5607450 100644 --- a/import/src/lib.rs +++ b/import/src/lib.rs @@ -15,7 +15,7 @@ use jellybase::{ CONF, SECRETS, }; use jellyclient::{Appearance, PeopleGroup, TmdbKind, TraktKind, Visibility}; -use jellyremuxer::metadata::matroska_metadata; +use jellyremuxer::metadata::checked_matroska_metadata; use log::info; use rayon::iter::{ParallelBridge, ParallelIterator}; use regex::Regex; @@ -278,7 +278,7 @@ fn import_media_file( visibility: Visibility, ) -> Result<()> { info!("media file {path:?}"); - let Some(m) = (*matroska_metadata(path)?).to_owned() else { + let Some(m) = (*checked_matroska_metadata(path)?).to_owned() else { return Ok(()); }; let infojson = m diff --git a/remuxer/src/metadata.rs b/remuxer/src/metadata.rs index 4ddad20..c8a5f8f 100644 --- a/remuxer/src/metadata.rs +++ b/remuxer/src/metadata.rs @@ -32,14 +32,21 @@ pub struct MatroskaMetadata { pub tags: Option<Tags>, pub infojson: Option<Vec<u8>>, } -pub fn matroska_metadata(path: &Path) -> Result<Arc<Option<MatroskaMetadata>>> { - cache_memory(&["mkmeta-v2", path.to_string_lossy().as_ref()], || { - let mut magic = [0; 4]; - File::open(path)?.read_exact(&mut magic).ok(); - if !matches!(magic, [0x1A, 0x45, 0xDF, 0xA3]) { - return Ok(None); - } - +pub fn checked_matroska_metadata(path: &Path) -> Result<Arc<Option<MatroskaMetadata>>> { + cache_memory( + &["mkmeta-check-v1", path.to_string_lossy().as_ref()], + || { + let mut magic = [0; 4]; + File::open(path)?.read_exact(&mut magic).ok(); + if !matches!(magic, [0x1A, 0x45, 0xDF, 0xA3]) { + return Ok(None); + } + Ok(Some((*matroska_metadata(path)?).clone())) + }, + ) +} +pub fn matroska_metadata(path: &Path) -> Result<Arc<MatroskaMetadata>> { + cache_memory(&["mkmeta-v3", path.to_string_lossy().as_ref()], || { info!("reading {path:?}"); let mut file = BufReader::new(File::open(path)?); let mut file = file.by_ref().take(u64::MAX); @@ -104,13 +111,13 @@ pub fn matroska_metadata(path: &Path) -> Result<Arc<Option<MatroskaMetadata>>> { } } } - Ok(Some(MatroskaMetadata { + Ok(MatroskaMetadata { chapters, cover, info, infojson, tags, tracks, - })) + }) }) } diff --git a/stream/src/lib.rs b/stream/src/lib.rs index 59b4960..d09759f 100644 --- a/stream/src/lib.rs +++ b/stream/src/lib.rs @@ -96,24 +96,22 @@ pub async fn stream( Ok(a) } -async fn async_matroska_metadata(path: PathBuf) -> Result<Arc<Option<MatroskaMetadata>>> { +async fn async_matroska_metadata(path: PathBuf) -> Result<Arc<MatroskaMetadata>> { Ok(spawn_blocking(move || matroska_metadata(&path)).await??) } -struct InternalStreamInfo { - paths: Vec<PathBuf>, - metadata: Vec<MatroskaMetadata>, - track_to_file: Vec<usize>, +pub(crate) struct InternalStreamInfo { + pub paths: Vec<PathBuf>, + pub metadata: Vec<Arc<MatroskaMetadata>>, + pub track_to_file: Vec<usize>, } async fn stream_info(info: Arc<SMediaInfo>) -> Result<(InternalStreamInfo, StreamInfo)> { let mut metadata = Vec::new(); let mut paths = Vec::new(); for path in &info.files { - if let Some(meta) = (*async_matroska_metadata(path.clone()).await?).clone() { - metadata.push(meta); - paths.push(path.clone()); - } + metadata.push(async_matroska_metadata(path.clone()).await?); + paths.push(path.clone()); } let mut tracks = Vec::new(); @@ -232,21 +230,3 @@ async fn copy_stream(mut inp: File, mut out: DuplexStream, mut amount: usize) -> amount -= size; } } - -// // TODO functions to test seekability, get live status and enumate segments -// trait MediaSource { -// fn loaded_range(&self) -> Result<Range<(u64, u64)>>; -// /// Seeks to some position close to, but before, `time` ticks. -// fn seek(&mut self, segment: u64, time: u64) -> Result<()>; -// /// Retrieve headers (info and tracks) for some segment. -// fn segment_headers(&mut self, seg: u64) -> Result<(Info, Tracks)>; -// /// Returns the next block and the current segment index -// fn next(&mut self) -> Result<Option<(u64, AbsBlock)>>; -// } -// pub struct AbsBlock { -// track: u64, -// pts: u64, -// keyframe: bool, -// lacing: Option<LacingType>, -// data: Vec<u8>, -// } |