From 1c96d64ae76cfb167a16e5089d57cd502d96f8da Mon Sep 17 00:00:00 2001 From: Stewie Date: Mon, 11 Apr 2022 19:02:03 -0400 Subject: [PATCH] Adding upload_xdelta function to upload patch to google drive --- RepoFunctions.py | 2 +- ToolsTOR.py | 10 +++---- ToolsTales.py | 9 +++--- ToolsTales_Executable.py | 34 ++++++++++++++++++----- __pycache__/RepoFunctions.cpython-38.pyc | Bin 0 -> 868 bytes __pycache__/ToolsTOR.cpython-38.pyc | Bin 9774 -> 9839 bytes __pycache__/ToolsTales.cpython-38.pyc | Bin 23748 -> 23755 bytes 7 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 __pycache__/RepoFunctions.cpython-38.pyc diff --git a/RepoFunctions.py b/RepoFunctions.py index 32de3ef..a6c1529 100644 --- a/RepoFunctions.py +++ b/RepoFunctions.py @@ -26,6 +26,6 @@ def refresh_repo(repo_name): base_path = os.path.join(os.getcwd(), "..", repo_name) print("Repo to refresh: {}".format(base_path)) listFile = subprocess.run( - ["git", "pull", repo_name], + ["git", "pull"], cwd=base_path ) diff --git a/ToolsTOR.py b/ToolsTOR.py index 6ec56b2..8ec51f7 100644 --- a/ToolsTOR.py +++ b/ToolsTOR.py @@ -24,14 +24,14 @@ class ToolsTOR(ToolsTales): #Path to used - datBinOriginal = '../Data/TOR/Disc/Original/DAT.BIN' - datBinNew = '../Data/TOR/Disc/New/DAT.BIN' - elfOriginal = '../Data/TOR/Disc/Original/SLPS_254.50' - elfNew = '../Data/TOR/Disc/New/SLPS_254.50' + datBinOriginal = '../Data/Tales-Of-Rebirth/Disc/Original/DAT.BIN' + datBinNew = '../Data/Tales-Of-Rebirth/Disc/New/DAT.BIN' + elfOriginal = '../Data/Tales-Of-Rebirth/Disc/Original/SLPS_254.50' + elfNew = '../Data/Tales-Of-Rebirth/Disc/New/SLPS_254.50' storyPathArchives= '../Tales-Of-Rebirth/Data/TOR/Story/New/' #Story XML files will be extracted here storyPathXML = '../Tales-Of-Rebirth/Data/TOR/Story/XML/' #SCPK will be repacked here skitPathArchives = '../Tales-Of-Rebirth/Data/TOR/Skits/' #Skits XML files will be extracted here - datPathExtract = '../Data/TOR/DAT/' + datPathExtract = '../Data/Tales-Of-Rebirth/DAT/' def __init__(self, tbl): diff --git a/ToolsTales.py b/ToolsTales.py index ffa6acd..ca20ba5 100644 --- a/ToolsTales.py +++ b/ToolsTales.py @@ -31,7 +31,7 @@ class ToolsTales: self.repo_name = repo_name self.basePath = os.getcwd() - with open("../{}/Data/Misc/{}".format(repo_name, tblFile), encoding="utf-8") as f: + with open("../{}/Data/{}/Misc/{}".format(repo_name, gameName, tblFile), encoding="utf-8") as f: jsonRaw = json.load(f) if self.repo_name == "Tales-of-Destiny-DC": self.jsonTblTags ={ k1:{ int(k2) if (k1 != "TBL") else k2:v2 for k2,v2 in jsonRaw[k1].items()} for k1,v1 in jsonRaw.items()} @@ -45,7 +45,7 @@ class ToolsTales: self.icolors = dict([[i, j] for j, i in self.jsonTblTags['COLOR'].items()]) - with open("../{}/Data/Menu/MenuFiles.json".format(repo_name)) as f: + with open("../{}/Data/{}/Menu/MenuFiles.json".format(repo_name, gameName)) as f: self.menu_files_json = json.load(f) @@ -635,11 +635,12 @@ class ToolsTales: # ############################# - def insert_Menu_File(self, menu_file_path): + def pack_Menu_File(self, menu_file_path): #Load all the banks for insertion and load XML new_text_offsets = dict() + file_node = [ele for ele in self.menu_files_json if ele['File_Extract'] == menu_file_path][0] xml_file_name = "../{}/Data/{}/Menu/XML/".format(self.repo_name, self.gameName) + self.get_file_name(menu_file_path)+'.xml' @@ -652,7 +653,7 @@ class ToolsTales: #Copy the original file - new_file_path = "../Data/TOR/Menu/New/{}".format(os.path.basename(file_node['File_Original'])) + new_file_path = "../Data/{}/Menu/New/{}".format(self.repo_name, os.path.basename(file_node['File_Original'])) shutil.copy( file_node['File_Extract'], new_file_path) #Open the new file with r+b diff --git a/ToolsTales_Executable.py b/ToolsTales_Executable.py index 6981932..6176bbf 100644 --- a/ToolsTales_Executable.py +++ b/ToolsTales_Executable.py @@ -9,15 +9,37 @@ import requests import subprocess import ApacheAutomate import RepoFunctions +from pydrive.auth import GoogleAuth +from pydrive.drive import GoogleDrive SCRIPT_VERSION = "0.3" +GoogleAuth.DEFAULT_SETTINGS['client_config_file'] = "../client_secrets.json" -def generate_xdelta_patch(original_path, new_path, xdelta_name="Tales-Of-Rebirth_Patch_New.xdelta"): - +def generate_xdelta_patch(repo_name, xdelta_name="Tales-Of-Rebirth_Patch_New.xdelta"): + + print("Create xdelta patch") + original_path = "../Data/{}/Disc/Original/{}.iso".format(repo_name, repo_name) + new_path = "../Data/{}/Disc/New/{}.iso".format(repo_name, repo_name) subprocess.run(["xdelta", "-s", original_path, new_path, xdelta_name]) - +def upload_xdelta(xdelta_name, folder_name): + + gauth = GoogleAuth() + drive = GoogleDrive(gauth) + + xdelta_name = r"G:\TalesHacking\PythonLib_Playground\Data\Tales-Of-Rebirth\Disc\New\Tales-Of-Rebirth_patch.xdelta" + + folder_id = '1txy2BI8tTFDPT9vmIbFELW2qmxC_ZjW0' + + gfile = drive.CreateFile({'parents': [{'id': folder_id}]}) + + + file_name = os.path.basename(xdelta_name) + gfile['title'] = file_name + + gfile.SetContentFile(xdelta_name) + gfile.Upload() # Upload the file. def get_directory_path(path): return os.path.dirname(os.path.abspath(path)) @@ -200,13 +222,11 @@ if __name__ == "__main__": if args.file == "SLPS": #SLPS - tales_instance.insert_Menu_File("../Data/TOR/Disc/Original/SLPS_254.50") + tales_instance.pack_Menu_File("../Data/Tales-Of-Rebirth/Disc/Original/SLPS_254.50") ApacheAutomate.apache_job(['SLPS_254.50'], "Tales-Of-Rebirth") - print("new SLPS is found inside Data/{}/Menu/New".format(game_name)) - #Other files for menu stuff - + generate_xdelta_patch("Tales-Of-Rebirth", "../Data/Tales-Of-Rebirth/Disc/New/Tales-Of-Rebirth_patch.xdelta") if args.action == "unpack": if args.file == "Main": diff --git a/__pycache__/RepoFunctions.cpython-38.pyc b/__pycache__/RepoFunctions.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e583c23d4b89d046fa889bc44aa53d12fc6a9425 GIT binary patch literal 868 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 SMuUt&${S!y1Sj{zSO5SpP7OZ* delta 7421 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