aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-04-13 18:19:03 +0200
committermetamuffin <metamuffin@disroot.org>2025-04-13 18:19:03 +0200
commit48a57a52d85d387efe122fb4d9fb113f577a0a98 (patch)
tree7ad7effe44689be805194b06189d260948369d71
parent68c579bc4ecbbf65cf4588adf88957de4c3444f9 (diff)
downloadjellything-48a57a52d85d387efe122fb4d9fb113f577a0a98.tar
jellything-48a57a52d85d387efe122fb4d9fb113f577a0a98.tar.bz2
jellything-48a57a52d85d387efe122fb4d9fb113f577a0a98.tar.zst
arc mkmeta
-rw-r--r--import/src/lib.rs4
-rw-r--r--remuxer/src/metadata.rs27
-rw-r--r--stream/src/lib.rs34
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>,
-// }