write a metadata to uncompressed pak
This commit is contained in:
12
src/app.rs
12
src/app.rs
@@ -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);
|
||||
|
@@ -1,5 +1,6 @@
|
||||
mod app;
|
||||
mod chunk;
|
||||
mod metadata;
|
||||
mod util;
|
||||
|
||||
use colored::Colorize;
|
||||
|
61
src/metadata.rs
Normal file
61
src/metadata.rs
Normal 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(())
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user