mirror of https://github.com/H-uru/korman.git
Adam Johnson
10 years ago
3 changed files with 100 additions and 17 deletions
@ -0,0 +1,74 @@ |
|||||||
|
# This file is part of Korman. |
||||||
|
# |
||||||
|
# Korman is free software: you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
# the Free Software Foundation, either version 3 of the License, or |
||||||
|
# (at your option) any later version. |
||||||
|
# |
||||||
|
# Korman is distributed in the hope that it will be useful, |
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
# GNU General Public License for more details. |
||||||
|
# |
||||||
|
# You should have received a copy of the GNU General Public License |
||||||
|
# along with Korman. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
|
||||||
|
import hashlib |
||||||
|
import os.path |
||||||
|
from PyHSPlasma import * |
||||||
|
|
||||||
|
def _hashfile(filename, hasher, block=0xFFFF): |
||||||
|
with open(filename, "rb") as handle: |
||||||
|
h = hasher() |
||||||
|
data = handle.read(block) |
||||||
|
while data: |
||||||
|
h.update(data) |
||||||
|
data = handle.read(block) |
||||||
|
return h.digest() |
||||||
|
|
||||||
|
class SumFile: |
||||||
|
def __init__(self): |
||||||
|
self._files = set() |
||||||
|
|
||||||
|
def append(self, filename): |
||||||
|
self._files.add(filename) |
||||||
|
|
||||||
|
def _collect_files(self, version): |
||||||
|
files = [] |
||||||
|
for file in self._files: |
||||||
|
filename = os.path.split(file)[1] |
||||||
|
extension = os.path.splitext(filename)[1].lower() |
||||||
|
if extension in {".age", ".csv", ".fni", ".loc", ".node", ".p2f", ".pfp", ".sub"}: |
||||||
|
filename = os.path.join("dat", filename) |
||||||
|
elif extension == ".prp" and version > pvPrime: |
||||||
|
# ABM and UU don't want the directory for PRPs... Bug? |
||||||
|
filename = os.path.join("dat", filename) |
||||||
|
elif extension in {".pak", ".py"}: |
||||||
|
filename = os.path.join("Python", filename) |
||||||
|
elif extension in {".avi", ".bik", ".oggv", ".webm"}: |
||||||
|
filename = os.path.join("avi", filename) |
||||||
|
elif extension in {".ogg", ".opus", ".wav"}: |
||||||
|
filename = os.path.join("sfx", filename) |
||||||
|
elif extension == ".sdl": |
||||||
|
filename = os.path.join("SDL", filename) |
||||||
|
# else the filename has no directory prefix... oh well |
||||||
|
|
||||||
|
md5 = _hashfile(file, hashlib.md5) |
||||||
|
timestamp = os.path.getmtime(file) |
||||||
|
files.append((filename, md5, int(timestamp))) |
||||||
|
return files |
||||||
|
|
||||||
|
|
||||||
|
def write(self, sumpath, version): |
||||||
|
"""Writes a .sum file for Uru ABM, PotS, Myst 5, etc.""" |
||||||
|
files = self._collect_files(version) |
||||||
|
enc = plEncryptedStream.kEncAes if version >= pvEoa else plEncryptedStream.kEncXtea |
||||||
|
|
||||||
|
with plEncryptedStream(version).open(sumpath, fmWrite, enc) as stream: |
||||||
|
stream.writeInt(len(files)) |
||||||
|
stream.writeInt(0) |
||||||
|
for file in files: |
||||||
|
stream.writeSafeStr(file[0]) |
||||||
|
stream.write(file[1]) |
||||||
|
stream.writeInt(file[2]) |
||||||
|
stream.writeInt(0) |
Loading…
Reference in new issue