write a metadata to uncompressed pak

This commit is contained in:
2025-07-28 18:45:11 +08:00
parent 6bd30c682d
commit c64a9a8fbb
5 changed files with 100 additions and 2 deletions

View File

@@ -24,7 +24,7 @@ use ree_pak_core::{
write::FileOptions,
};
use crate::{chunk::ChunkName, util::human_bytes};
use crate::{chunk::ChunkName, metadata::PakMetadata, util::human_bytes};
const FILE_NAME_LIST: &[u8] = include_bytes!("../assets/MHWs_STM_Release.list.zst");
const AUTO_CHUNK_SELECTION_SIZE_THRESHOLD: usize = 50 * 1024 * 1024; // 50MB
@@ -111,7 +111,15 @@ impl App {
.truncate(true)
.write(true)
.open(output_path)?;
let pak_writer = ree_pak_core::write::PakWriter::new(out_file, entries.len() as u64);
let mut pak_writer = ree_pak_core::write::PakWriter::new(out_file, entries.len() as u64);
// write metadata
let metadata = PakMetadata {
version: 1,
is_uncompressed_patch: true,
};
metadata.write_to_pak(&mut pak_writer)?;
let pak_writer_mtx = Arc::new(Mutex::new(pak_writer));
let bar = ProgressBar::new(entries.len() as u64);

View File

@@ -1,5 +1,6 @@
mod app;
mod chunk;
mod metadata;
mod util;
use colored::Colorize;

61
src/metadata.rs Normal file
View File

@@ -0,0 +1,61 @@
//! Extended metadata for generated pak files.
use std::io::{self, Read, Write};
use ree_pak_core::{
filename::{FileNameExt, FileNameFull},
pak::PakArchive,
read::archive::PakArchiveReader,
write::{FileOptions, PakWriter},
};
use serde::{Deserialize, Serialize};
const METADATA_KEY: &str = "__TEX_DECOMPRESSOR_METADATA__";
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PakMetadata {
pub version: u32,
pub is_uncompressed_patch: bool,
}
impl PakMetadata {
pub fn from_pak_archive<R>(
reader: R,
pak_archive: &PakArchive,
) -> color_eyre::Result<Option<Self>>
where
R: io::Read + io::Seek,
{
let key_name = FileNameFull::new(METADATA_KEY);
let entry = pak_archive
.entries()
.iter()
.find(|entry| entry.hash() == key_name.hash_mixed());
if let Some(entry) = entry {
// read file
let mut archive_reader = PakArchiveReader::new(reader, pak_archive);
let mut entry_reader = archive_reader.owned_entry_reader(entry.clone())?;
let mut buf = Vec::new();
entry_reader.read_to_end(&mut buf)?;
let metadata = serde_json::from_slice(&buf)?;
Ok(Some(metadata))
} else {
Ok(None)
}
}
pub fn write_to_pak<W>(&self, pak_writer: &mut PakWriter<W>) -> color_eyre::Result<()>
where
W: io::Write + io::Seek,
{
let json_str = serde_json::to_string(self)?;
let json_bytes = json_str.as_bytes();
pak_writer.start_file(METADATA_KEY, FileOptions::default())?;
pak_writer.write_all(json_bytes)?;
Ok(())
}
}