diff --git a/.gitignore b/.gitignore index c18dd8d..bb1e37f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ __pycache__/ +*.ifs +*_ifs +*.pyc diff --git a/handlers/GenericFolder.py b/handlers/GenericFolder.py index 186fb4b..992c1b7 100644 --- a/handlers/GenericFolder.py +++ b/handlers/GenericFolder.py @@ -6,7 +6,7 @@ import lxml.etree as etree from . import get_folder_handlers, escapes from .GenericFile import GenericFile -class GenericFolder(): +class GenericFolder(object): def __init__(self, ifs, name, time, files, folders): self.ifs = ifs diff --git a/handlers/ImageFile.py b/handlers/ImageFile.py index 0c78bcd..aa56a6e 100644 --- a/handlers/ImageFile.py +++ b/handlers/ImageFile.py @@ -2,6 +2,7 @@ from io import BytesIO from struct import unpack, pack from os.path import getmtime, isfile, join, dirname from os import utime, mkdir +import errno from PIL import Image import lxml.etree as etree @@ -23,7 +24,7 @@ dxt5_end = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \ class ImageFile(GenericFile): def __init__(self, gen_file, image_elem, fmt, compress): - super().__init__(gen_file.ifs, gen_file.path, + super(ImageFile, self).__init__(gen_file.ifs, gen_file.path, gen_file.name + '.png', gen_file.time, gen_file.start, gen_file.size) self._packed_name = gen_file._packed_name @@ -46,7 +47,7 @@ class ImageFile(GenericFile): raise Exception('ImageFile must be instantiated from existing element') def _load_from_ifs(self, convert_kbin = False): - data = super()._load_from_ifs() + data = super(ImageFile, self)._load_from_ifs() if self.compress == 'avslz': uncompressed_size = unpack('>I', data[:4])[0] @@ -137,8 +138,17 @@ class ImageFile(GenericFile): return data def _mkdir(self, dir): - try: - mkdir(dir) - except FileExistsError: - pass + try: # python 3 + try: + mkdir(dir) + except FileExistsError: + pass + except NameError: # python 2 + try: + mkdir(dir) + except OSError as e: + if e.errno == errno.EEXIST: + pass + else: + raise diff --git a/handlers/MD5Folder.py b/handlers/MD5Folder.py index c54ec22..cdc9527 100644 --- a/handlers/MD5Folder.py +++ b/handlers/MD5Folder.py @@ -7,7 +7,7 @@ from . import GenericFolder class MD5Folder(GenericFolder): def __init__(self, ifs, name, time, files, folders): - super().__init__(ifs, name, time, files, folders) + super(MD5Folder, self).__init__(ifs, name, time, files, folders) for filename, file in self.files.items(): if filename.endswith('.xml'): @@ -20,13 +20,13 @@ class MD5Folder(GenericFolder): @classmethod def from_xml(cls, ifs, element, name = '', md5_tag = None, extension = None): - self = super().from_xml(ifs, element, name) + self = super(MD5Folder, cls).from_xml(ifs, element, name) self._apply_md5(md5_tag, extension) return self @classmethod def from_filesystem(cls, ifs, tree, name = '', md5_tag = None, extension = None): - self = super().from_filesystem(ifs, tree, name) + self = super(MD5Folder, cls).from_filesystem(ifs, tree, name) self._apply_md5(md5_tag, extension) return self diff --git a/handlers/TexFolder.py b/handlers/TexFolder.py index 03eb9aa..69771a9 100644 --- a/handlers/TexFolder.py +++ b/handlers/TexFolder.py @@ -2,18 +2,18 @@ from . import MD5Folder, GenericFile, ImageFile class TexFolder(MD5Folder): def __init__(self, ifs, name, time, files, folders): - super().__init__(ifs, name, time, files, folders) + super(TexFolder, self).__init__(ifs, name, time, files, folders) self.compress = self.info_kbin.xml_doc.attrib.get('compress') @classmethod def from_xml(cls, ifs, element, name = ''): - self = super().from_xml(ifs, element, name, 'image', '.png') + self = super(TexFolder, cls).from_xml(ifs, element, name, 'image', '.png') self._create_images() return self @classmethod def from_filesystem(cls, ifs, tree, name = ''): - self = super().from_filesystem(ifs, tree, name, 'image', '.png') + self = super(TexFolder, cls).from_filesystem(ifs, tree, name, 'image', '.png') self._create_images() return self diff --git a/handlers/lz77.py b/handlers/lz77.py index 4d08359..10c46e6 100644 --- a/handlers/lz77.py +++ b/handlers/lz77.py @@ -17,7 +17,8 @@ def decompress(input): decompressed = bytearray() while True: - flag = input.read(1)[0] + # wrap in bytes for py2 + flag = bytes(input.read(1))[0] for i in range(8): if (flag >> i) & 1 == 1: decompressed.append(input.read(1)[0]) diff --git a/ifstools.py b/ifstools.py index b92c5dc..43113c6 100644 --- a/ifstools.py +++ b/ifstools.py @@ -1,5 +1,6 @@ from os.path import basename, dirname, splitext, join, isdir, isfile, getmtime from os import mkdir, utime, walk +import errno from io import BytesIO import hashlib import lxml.etree as etree @@ -181,10 +182,19 @@ class IFS: utime(outdir, (timestamp, timestamp)) def _mkdir(self, dir): - try: - mkdir(dir) - except FileExistsError: - pass + try: # python 3 + try: + mkdir(dir) + except FileExistsError: + pass + except NameError: # python 2 + try: + mkdir(dir) + except OSError as e: + if e.errno == errno.EEXIST: + pass + else: + raise def load_file(self, start, size): start = self.header_end+start diff --git a/requirements.txt b/requirements.txt index 0fa99ed..75660a2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ lxml tqdm pillow +future git+https://github.com/mon/kbinxml.git \ No newline at end of file