From cbaafca0d192fc3e0877fc9aa0506589025d4237 Mon Sep 17 00:00:00 2001 From: NinjaCheetah <58050615+NinjaCheetah@users.noreply.github.com> Date: Wed, 29 May 2024 12:48:44 -0400 Subject: [PATCH] Working basic code to extract a U8 archive --- src/libWiiPy/types.py | 1 - src/libWiiPy/u8.py | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/libWiiPy/types.py b/src/libWiiPy/types.py index 48d8d91..9dd6813 100644 --- a/src/libWiiPy/types.py +++ b/src/libWiiPy/types.py @@ -1,6 +1,5 @@ # "types.py" from libWiiPy by NinjaCheetah & Contributors # https://github.com/NinjaCheetah/libWiiPy -from builtins import type from dataclasses import dataclass diff --git a/src/libWiiPy/u8.py b/src/libWiiPy/u8.py index ef16df7..69a5ad4 100644 --- a/src/libWiiPy/u8.py +++ b/src/libWiiPy/u8.py @@ -5,6 +5,7 @@ import io import binascii +import os from typing import List from .types import U8Node @@ -75,9 +76,34 @@ class U8Archive: self.u8_file_data_list.append(u8_data.read(node.size)) else: self.u8_file_data_list.append(b'') - # This does nothing for now. - next_dir = 0 - for node in range(len(self.u8_node_list)): - if self.u8_node_list[node].type == 256 and node != 0: - next_dir = self.u8_node_list[node].size + + def extract_to_folder(self, output_folder) -> None: + if os.path.isdir(output_folder): + raise ValueError("Output folder already exists!") + if self.u8_node_list is []: + raise ValueError("No U8 file is loaded!") + + os.mkdir(output_folder) + + current_dir = "" + for node in range(len(self.u8_node_list)): + if self.u8_node_list[node].name_offset != 0: + if self.u8_node_list[node].type == 256: + if self.u8_node_list[node].data_offset == 0: + os.mkdir(os.path.join(output_folder, self.file_name_list[node])) + current_dir = self.file_name_list[node] + elif self.u8_node_list[node].data_offset < node: + lower_path = os.path.join(output_folder, current_dir) + os.mkdir(os.path.join(lower_path, self.file_name_list[node])) + current_dir = os.path.join(current_dir, self.file_name_list[node]) + elif self.u8_node_list[node].type == 0: + lower_path = os.path.join(output_folder, current_dir) + output_file = open(os.path.join(lower_path, self.file_name_list[node]), "wb") + output_file.write(self.u8_file_data_list[node]) + output_file.close() + + def pack_from_folder(self, input_folder) -> None: + if not os.path.isdir(input_folder): + raise ValueError("Input folder does not exist!") +