Working basic code to extract a U8 archive

This commit is contained in:
Campbell 2024-05-29 12:48:44 -04:00
parent ede33dc503
commit cbaafca0d1
Signed by: NinjaCheetah
GPG Key ID: B547958AF96ED344
2 changed files with 31 additions and 6 deletions

View File

@ -1,6 +1,5 @@
# "types.py" from libWiiPy by NinjaCheetah & Contributors # "types.py" from libWiiPy by NinjaCheetah & Contributors
# https://github.com/NinjaCheetah/libWiiPy # https://github.com/NinjaCheetah/libWiiPy
from builtins import type
from dataclasses import dataclass from dataclasses import dataclass

View File

@ -5,6 +5,7 @@
import io import io
import binascii import binascii
import os
from typing import List from typing import List
from .types import U8Node from .types import U8Node
@ -75,9 +76,34 @@ class U8Archive:
self.u8_file_data_list.append(u8_data.read(node.size)) self.u8_file_data_list.append(u8_data.read(node.size))
else: else:
self.u8_file_data_list.append(b'') self.u8_file_data_list.append(b'')
# This does nothing for now.
next_dir = 0 def extract_to_folder(self, output_folder) -> None:
for node in range(len(self.u8_node_list)): if os.path.isdir(output_folder):
if self.u8_node_list[node].type == 256 and node != 0: raise ValueError("Output folder already exists!")
next_dir = self.u8_node_list[node].size 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!")