write a metadata to uncompressed pak
This commit is contained in:
26
Cargo.lock
generated
26
Cargo.lock
generated
@@ -616,6 +616,12 @@ dependencies = [
|
|||||||
"either",
|
"either",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "1.0.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jobserver"
|
name = "jobserver"
|
||||||
version = "0.1.33"
|
version = "0.1.33"
|
||||||
@@ -718,6 +724,8 @@ dependencies = [
|
|||||||
"rayon",
|
"rayon",
|
||||||
"re-tex",
|
"re-tex",
|
||||||
"ree-pak-core",
|
"ree-pak-core",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1183,6 +1191,12 @@ version = "1.0.21"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
|
checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.20"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scopeguard"
|
name = "scopeguard"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
@@ -1209,6 +1223,18 @@ dependencies = [
|
|||||||
"syn 2.0.104",
|
"syn 2.0.104",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.141"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"memchr",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_spanned"
|
name = "serde_spanned"
|
||||||
version = "0.6.9"
|
version = "0.6.9"
|
||||||
|
@@ -18,3 +18,5 @@ rayon = "1.10"
|
|||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
colored = "3.0"
|
colored = "3.0"
|
||||||
fs-err = "3.1.1"
|
fs-err = "3.1.1"
|
||||||
|
serde = { version = "1.0.219", features = ["derive"] }
|
||||||
|
serde_json = "1.0.141"
|
||||||
|
12
src/app.rs
12
src/app.rs
@@ -24,7 +24,7 @@ use ree_pak_core::{
|
|||||||
write::FileOptions,
|
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 FILE_NAME_LIST: &[u8] = include_bytes!("../assets/MHWs_STM_Release.list.zst");
|
||||||
const AUTO_CHUNK_SELECTION_SIZE_THRESHOLD: usize = 50 * 1024 * 1024; // 50MB
|
const AUTO_CHUNK_SELECTION_SIZE_THRESHOLD: usize = 50 * 1024 * 1024; // 50MB
|
||||||
@@ -111,7 +111,15 @@ impl App {
|
|||||||
.truncate(true)
|
.truncate(true)
|
||||||
.write(true)
|
.write(true)
|
||||||
.open(output_path)?;
|
.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 pak_writer_mtx = Arc::new(Mutex::new(pak_writer));
|
||||||
|
|
||||||
let bar = ProgressBar::new(entries.len() as u64);
|
let bar = ProgressBar::new(entries.len() as u64);
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
mod app;
|
mod app;
|
||||||
mod chunk;
|
mod chunk;
|
||||||
|
mod metadata;
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
use colored::Colorize;
|
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