From 88f85f5f2759269b17aba701d9f34fffc2006a53 Mon Sep 17 00:00:00 2001 From: Gusborg Date: Mon, 27 May 2024 15:31:00 -0500 Subject: [PATCH] fixed week images crash, moved base64 images to constants, mostly made an error dialog (it doesnt work yet) --- psychtobase/main.py | 54 ++++++++++++++------------ psychtobase/src/Constants.py | 12 +++++- psychtobase/src/window.py | 74 +++++++++++++++++++++++++++--------- 3 files changed, 96 insertions(+), 44 deletions(-) diff --git a/psychtobase/main.py b/psychtobase/main.py index b0b8ff5..dd6292e 100644 --- a/psychtobase/main.py +++ b/psychtobase/main.py @@ -10,12 +10,11 @@ import threading from src.tools.CharacterTools import CharacterObject -from src.tools.ChartTools import ChartObject +from src.tools.ChartTools import ChartObject from src.tools import VocalSplit, WeekTools, StageTool, StageLuaParse from src import Utils if __name__ == '__main__': - log.setup() window.init() @@ -33,6 +32,8 @@ def folderMake(folder_path): Path(folder_path).mkdir(parents=True, exist_ok=True) except Exception as e: logging.error(f'Something went wrong: {e}') + else: + logging.warn(f'{folder_path} already exists!') def fileCopy(source, destination): if Path(source).exists(): @@ -53,11 +54,9 @@ def treeCopy(source, destination): logging.warn(f'Path {source} does not exist.') def convert(psych_mod_folder, result_folder, options): - runtime = time.time() + runtime = time.process_time() logging.info(Utils.coolText("NEW CONVERSION STARTED")) - - logging.info('Converting started...') logging.info(options) modName = psych_mod_folder # MOD FOLDER PSYCH ENGINE @@ -97,11 +96,11 @@ def convert(psych_mod_folder, result_folder, options): else: logging.warn('pack.png not found. Replacing it with default') try: - _polyEncode = b'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' + polymodIconpath = f'{result_folder}/{modFoldername}/{polymodIcon}' with open(polymodIconpath, 'wb') as output_file: #cause the image wasnt working in the executable - output_file.write(b64decode(_polyEncode)) + output_file.write(b64decode(Constants.BASE64_IMAGES.get('missingModImage'))) except Exception as e: logging.error(f'Could not write default file: {e}') @@ -128,7 +127,6 @@ def convert(psych_mod_folder, result_folder, options): songs = files.findAll(f'{psychChartFolder}*') for song in songs: - logging.info(f'Checking if {song} is a valid chart directory...') if Path(song).is_dir(): logging.info(f'Loading charts in {song}') @@ -223,7 +221,7 @@ def convert(psych_mod_folder, result_folder, options): folderMake(f'{result_folder}/{modFoldername}{bgCharacterAssets}') folderMake(f'{result_folder}/{modFoldername}{freeplayDir}') - for character in files.findAll(f'{psychCharacterAssets}*'): + for character in files.findAll(f'{psychCharacterAssets}*.png'): if Path(character).is_file(): logging.info(f'Copying asset {character}') try: @@ -257,8 +255,6 @@ def convert(psych_mod_folder, result_folder, options): logging.error(f"Failed to create character {keyForThisIcon}'s freeplay icon: {___exc}") except Exception as e: logging.error(f'Could not copy asset {character}: {e}') - else: - logging.warn(f'{character} is a directory, not a file! Skipped') songOptions = options.get('songs', { 'inst': False, @@ -274,7 +270,7 @@ def convert(psych_mod_folder, result_folder, options): folderMake(f'{result_folder}/{modFoldername}{bgSongs}') - _allSongFiles = files.findAll(f'{psychSongs}*') + _allSongFiles = files.findAll(f'{psychSongs}*.ogg') for song in _allSongFiles: _songKeyUnformatted = Path(song).name @@ -455,18 +451,29 @@ def convert(psych_mod_folder, result_folder, options): logging.info('Copying level titles...') dir = Constants.FILE_LOCS.get('WEEKIMAGE') - psychWeeks = modName + dir[0] + psychWeeks = f'{modName}{dir[0]}' baseLevels = dir[1] - allPng = files.findAll(f'{psychWeeks}*.png') - for asset in allPng: - logging.info(f'Copying {asset}') - try: - folderMake(f'{result_folder}/{modFoldername}{baseLevels}') - fileCopy(asset, - f'{result_folder}/{modFoldername}{baseLevels}{Path(asset).name}') - except Exception as e: - logging.error(f'Could not copy asset {asset}: {e}') + if Path(psychWeeks).exists(follow_symlinks=False): + allPng = files.findAll(f'{psychWeeks}*.png') + for asset in allPng: + logging.info(f'Copying week: {asset}') + try: + folderMake(f'{result_folder}/{modFoldername}{baseLevels}') + fileCopy(asset, + f'{result_folder}/{modFoldername}{baseLevels}{Path(asset).name}') + except Exception as e: + logging.error(f'Could not copy asset {asset}: {e}') + else: + logging.info(f'A week for {modName} has no story menu image, replacing with a default.') + with open(f'week{modName}.png', 'wb') as fh: + #id be surprised if this works + try: + folderMake(f'{result_folder}/{modFoldername}{baseLevels}') + Image.open(base64.b64decode(data[Constants.BASE64_IMAGES.get('missingWeek')])) + Image.save(f'{result_folder}/{modFoldername}{baseLevels}') + except Exception as e: + logging.error(f"Couldn't generate week image to {modFoldername}/{baseLevels}: {e}") if options.get('stages', False): logging.info('Converting stages...') @@ -533,6 +540,5 @@ def convert(psych_mod_folder, result_folder, options): except Exception as e: logging.error(f'Failed to copy {asset}: {e}') - #convlen = Utils.getRuntime(runtime) logging.info(Utils.coolText("CONVERSION COMPLETED")) - logging.info(f'Conversion done: Took {int(time.time() - runtime)}s') + logging.info(f'Conversion done: Took {runtime}s') diff --git a/psychtobase/src/Constants.py b/psychtobase/src/Constants.py index 166820c..75ff906 100644 --- a/psychtobase/src/Constants.py +++ b/psychtobase/src/Constants.py @@ -82,6 +82,14 @@ "generatedBy": "FNF Porter (by Gusborg, tposejank, BombasticTom & VocalFan)" } +BASE64_IMAGES = { + #to view these: https://base64.guru/converter/decode/image/png + "windowIcon": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAFVBMVEX/////3fv/fdtsPpT/LDdYtf8AKUvOkdnQAAAACXBIWXMAAC4jAAAuIwF4pT92AAABRUlEQVRIx73UQbLCIAwAUJzWvf03EC/gNBdgEfcuLDco9z/CB0JLgQDq/PlZ1clrkoZWIf4mTpcemLpg6oKpCy490BZTT5wm2QWyOWgf/Eh5bTUBC1oCQLqoN4HZA1sC7lx+oHwd3GQIC4ArIPe4fgnmKHgA8iC+AAPA3AOxxA24Pb8B5j1/bwJ75QAiqgzAlrdgREzFDoAAYiYGHmABgMCIRQlaFeUhjIDLsjzfB1ufDTwWime5D/eUW9oGcyqiCXzwYORBHCJuRZxDUtfAljcpULGA8cDUgLCp1RVY0yExTqrdzXpdPgVWjCo8hBUmA8KfLgagjS6AL+EQPaLhAPoyfk8mzKCSHvQWVUF4UcIqCLyUKAQtW9O6UYlcqHgYLDiepu2QA/p9jvlPAXXYwev4cSVBIv36sgj314Eo/wJ4If4nfgHb6rE0etNCVQAAAABJRU5ErkJggg==", + "missingWeek": "iVBORw0KGgoAAAANSUhEUgAAADAAAAAYAQMAAACGM+yfAAAAA1BMVEX///+nxBvIAAAACXBIWXMAAAsSAAALEgHS3X78AAAADElEQVQI12NgGBoAAACoAAHA+4ZOAAAAAElFTkSuQmCC", + "missingModImage": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEX///8AAABVwtN+AAAACXBIWXMAAAsSAAALEgHS3X78AAAAyUlEQVQoz2NgoBlghlAGDMwz0BnsSAwmdIYF838w40YN8/8DQAYbkCH/4AOQ8cOHmefjDiCjAsgoltzAwFKRw8xjLG3AwCJRw8xgPBvIYLBgBDMg4PcGKKP4A5TB+IEINwMZzZhCMJ0gZ4GNapY9+AHC4Dn8xwbCeNxTbwdi8D3mO2wPZhTzNZeDGGxARnIDiGHc1w5hGN77Xw9mGPyrrwepYWAoswe6nbGJgYGNzQLIAAYKGx/IQKDpEjx8EIb8D6hL+H8wDDAAAEa9OlI0tsK2AAAAAElFTkSuQmCC", + "errorIcon": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAQMAAABJtOi3AAAABlBMVEX/////ADNUioaFAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAeklEQVQI1zWOsQ3DMAwEX1AhF0bUJkBgruEqWkywvVk0ikZQ6ULQm3SQ5vAAn+QB0gGQBxxZEMiGSJ54GZ7kG6v0BVm6IMeWsHnFcGUHUQhdUlT/R7tTsIGlwymc9oavO7ZQE3KoduqM+Eh/YEljhnwV+nf6GdwuZnUBR3pJi8fgcMIAAAAASUVORK5CYII=" +} + CHARACTER = { "version": "1.0.0", "name": None, @@ -393,8 +401,8 @@ 'WEEKCHARACTERJSON': ['/images/menucharacters/', ''], # Embedded directly to the level.json - 'WEEKIMAGE': - ['/images/storymenu/','/images/storymenu/titles/'], + 'WEEKIMAGE': + ['/images/storymenu/', '/images/storymenu/titles/'], 'WEEKIMAGE_WEEKJSON': ['', 'storymenu/titles/'], diff --git a/psychtobase/src/window.py b/psychtobase/src/window.py index df0c044..9351e5b 100644 --- a/psychtobase/src/window.py +++ b/psychtobase/src/window.py @@ -11,11 +11,11 @@ import webbrowser from PyQt6.QtCore import QSize -from PyQt6.QtGui import QIcon, QPixmap -from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QCheckBox, QLabel, QLineEdit, QPushButton, QFileDialog, QDialog, QVBoxLayout, QRadioButton, QTextBrowser +from PyQt6.QtGui import QIcon, QPixmap, QImage +from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QCheckBox, QLabel, QLineEdit, QFileDialog, QDialog, QVBoxLayout, QRadioButton, QTextBrowser, QWidget -#the icon, in base64 (because its easier to compile) -icon = b64decode("iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAFVBMVEX/////3fv/fdtsPpT/LDdYtf8AKUvOkdnQAAAACXBIWXMAAC4jAAAuIwF4pT92AAABRUlEQVRIx73UQbLCIAwAUJzWvf03EC/gNBdgEfcuLDco9z/CB0JLgQDq/PlZ1clrkoZWIf4mTpcemLpg6oKpCy490BZTT5wm2QWyOWgf/Eh5bTUBC1oCQLqoN4HZA1sC7lx+oHwd3GQIC4ArIPe4fgnmKHgA8iC+AAPA3AOxxA24Pb8B5j1/bwJ75QAiqgzAlrdgREzFDoAAYiYGHmABgMCIRQlaFeUhjIDLsjzfB1ufDTwWime5D/eUW9oGcyqiCXzwYORBHCJuRZxDUtfAljcpULGA8cDUgLCp1RVY0yExTqrdzXpdPgVWjCo8hBUmA8KfLgagjS6AL+EQPaLhAPoyfk8mzKCSHvQWVUF4UcIqCLyUKAQtW9O6UYlcqHgYLDiepu2QA/p9jvlPAXXYwev4cSVBIv36sgj314Eo/wJ4If4nfgHb6rE0etNCVQAAAABJRU5ErkJggg==") +icon = b64decode(Constants.BASE64_IMAGES.get('windowIcon')) +_windowTitleSuffix = "v0.1 [BETA]" _defaultsFile = '.defaults' _vocalSplitEnabledByDefault = False @@ -61,6 +61,34 @@ def on_button_clicked(self): # print(self.input_values) self.close() + +class ErrorMessage(QDialog): + def __init__(self, text, actual_error_text): + super().__init__() + layout = QVBoxLayout() + self.setLayout(layout) + try: + text + except: + #if text isnt given itll set it to unknown error + text = 'Unknown Error' + try: + actual_error_text + except: + actual_error_text = "the fucking error handler had a bug dude, you're fucked" + self.setWindowTitle('Error!') + self.setFixedSize(QSize(400, 200)) + + pixmap = QPixmap() + pixmap.loadFromData(b64decode(Constants.BASE64_IMAGES.get('errorIcon'))) + self.errorIcon = QImage(pixmap) + + self.text = QLabel('Hello Bro', self) + self.text.move(20, 80) + self.text.resize(360, 40) + + self.openLog = QPushButton('Open log file', self) + self.openLog.clicked.connect(Window.openLogFile) class Window(QMainWindow): def closeEvent(self, event): @@ -84,7 +112,7 @@ def __init__(self): pixmap.loadFromData(icon) self.setWindowIcon(QIcon(pixmap)) - self.modLabel = QLabel("Path to your Psych Engine mod:", self) + self.modLabel = QLabel("Path to your Psych Engine mod:", self) self.baseGameLabel = QLabel("Path to Base Game mods folder:", self) self.modLabel.move(20, 20) self.modLabel.resize(220, 30) @@ -130,29 +158,23 @@ def __init__(self): self.onlyCharts = QRadioButton('Only Charts', self) self.onlyCharts.move(rX, 140) - self.onlyCharts.setToolTip("A default option. Quick for fast and only chart converting.") self.onlySongs = QRadioButton('Only Audio', self) self.onlySongs.move(rX, 170) - self.onlySongs.setToolTip("A default option. Quick for fast and only audio converting/copying.") self.onlyChars = QRadioButton('Only Characters', self) # not to be confused with onlyCharts self.onlyChars.move(rX, 200) self.onlyChars.resize(400, 30) - self.onlyChars.setToolTip("A default option. Quick for fast and only character converting.") self.onlyStages = QRadioButton('Only Stages', self) self.onlyStages.move(rX, 230) - self.onlyStages.setToolTip("A default option. Quick for fast and only stage converting.") self.fullMod = QRadioButton('Full Mod', self) self.fullMod.move(rX, 260) - self.fullMod.setToolTip("A default option. Quick for converting the entire mod.") self.fullMod.setChecked(True) # Default - self.iChoose = QRadioButton('Let me choose', self) + self.iChoose = QRadioButton('Custom', self) self.iChoose.move(rX, 290) - self.iChoose.setToolTip("Select this to customize your conversion experience.") self.onlyCharts.toggled.connect(self.radioCheck) self.onlySongs.toggled.connect(self.radioCheck) @@ -173,7 +195,7 @@ def __init__(self): self.logsLabel.resize(320, 270) self.helpButton = QPushButton("Report an issue", self) - self.helpButton.setToolTip('https://github.com/gusborg88/fnf-porter/issues/new') + self.helpButton.setToolTip('https://github.com/gusborg88/fnf-porter/issues/new/choose/') self.helpButton.move(130, 320) self.helpButton.resize(100, 30) self.helpButton.clicked.connect(self.goToIssues) @@ -317,6 +339,7 @@ def __init__(self): self.radioCheck(True, True) + def allToDefaults(self, checked = True, enabled = False): self.charts.setChecked(checked) self.songs.setChecked(checked) @@ -442,7 +465,6 @@ def convertCallback(self, what): result_path = self.baseGameLineEdit.text() if Path(result_path).exists(): logging.warn(f'Folder {result_path} already existed before porting, files may have been overwritten.') - #i was trying to get this to be a window but it wasnt working options = Constants.DEFAULT_OPTIONS options['charts'] = self.charts.isChecked() if self.songs.isChecked(): @@ -473,11 +495,15 @@ def convertCallback(self, what): logging.error(f'Problems with your save file: {e}') if psych_mod_folder_path != None and result_path != None: - main.convert(psych_mod_folder_path, result_path, options) + try: + main.convert(psych_mod_folder_path, result_path, options) + except Exception as e: + self.throwError('poop', {e}) + else: + logging.warn('Select an input folder or output folder first!') def goToIssues(self): - #note this is a custom link that puts some things into the body, it should be the same as in readme.md - webbrowser.open('https://github.com/gusborg88/fnf-porter/issues/new?body=Log+file+output+(check+logs+folder):%0A```%0A%0A```') + webbrowser.open('https://github.com/gusborg88/fnf-porter/issues/new/choose') def goToGB(self): _GB_ToolID = '16982' @@ -505,6 +531,10 @@ def open_dialog(self, title, inputs, button, body): return values + def throwError(self, text, actual_error_text): + self.newError = ErrorMessage(text, actual_error_text) + self.newError().show + def prompt(self, inputs, title, body): button = 'Continue' return self.open_dialog(title=title, inputs=inputs, button=button, body=body) @@ -517,7 +547,15 @@ def init(): logging.info('Initiating window') # initiate the window - window.show() + try: + window.show() + except Exception as e: + #why does this never fire + logging.critical(f'Window could not show! {e}') + + #work in progress + #Window.throwError(self=QDialog, text='d', actual_error_text='poooop') + print('pooop') app.exec()