From d5aa53fafed0dbf6d43943e3b88b99693821e5cd Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 23 Mar 2025 20:18:10 +0100 Subject: audio clips --- src/classes/streaming_info.rs | 51 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/classes/streaming_info.rs (limited to 'src/classes/streaming_info.rs') diff --git a/src/classes/streaming_info.rs b/src/classes/streaming_info.rs new file mode 100644 index 0000000..9f7ce23 --- /dev/null +++ b/src/classes/streaming_info.rs @@ -0,0 +1,51 @@ +use crate::{ + object::{Value, parser::FromValue}, + unityfs::UnityFS, +}; +use anyhow::{Result, anyhow, bail}; +use serde::Serialize; +use std::io::{Read, Seek, SeekFrom}; + +#[derive(Debug, Serialize)] +pub struct StreamingInfo { + pub offset: u64, + pub path: String, + pub size: u32, +} + +impl FromValue for StreamingInfo { + fn from_value(v: Value) -> Result { + let mut fields = v.as_class("StreamingInfo")?; + Ok(StreamingInfo { + offset: fields.field("offset")?, + size: fields.field("size")?, + path: fields.field("path")?, + }) + } +} + +impl StreamingInfo { + pub fn read(&self, fs: &UnityFS) -> Result> { + if !self.path.starts_with("archive:") { + bail!( + "StreamingInfo path does not start on 'archive:' ({:?})", + self.path + ) + } + let nodeinfo = fs + .header + .nodes() + .iter() + .find(|n| self.path.ends_with(&n.name)) + .ok_or(anyhow!("node with path {:?} not found", self.path))? + .to_owned(); + + let mut buf = Vec::new(); + + let mut node = fs.read(&nodeinfo)?; + node.seek(SeekFrom::Start(self.offset))?; + node.take(self.size as u64).read_to_end(&mut buf)?; + + Ok(buf) + } +} -- cgit v1.2.3-70-g09d2