From 15adc60c3b9a81176f2cae598195be2d62764f1f Mon Sep 17 00:00:00 2001 From: David Maisonave <47364845+David-Maisonave@users.noreply.github.com> Date: Wed, 6 Nov 2024 03:23:06 -0500 Subject: [PATCH] Fixed studio bug caused by new Stash version change. --- plugins/FileMonitor/StashPluginHelper.py | 30 +++++++++++++++++++++++ plugins/RenameFile/StashPluginHelper.py | 30 +++++++++++++++++++++++ plugins/RenameFile/renamefile.py | 31 +++++++++++++++--------- 3 files changed, 79 insertions(+), 12 deletions(-) diff --git a/plugins/FileMonitor/StashPluginHelper.py b/plugins/FileMonitor/StashPluginHelper.py index 4c643e6..d54c1a4 100644 --- a/plugins/FileMonitor/StashPluginHelper.py +++ b/plugins/FileMonitor/StashPluginHelper.py @@ -802,6 +802,36 @@ class StashPluginHelper(StashInterface): else: self.Log(f"Skipping Job ID({jobDetails['id']}); description={jobDetails['description']}; {jobDetails})") + def toJson(self, data, replaceSingleQuote=False): + if replaceSingleQuote: + data = data.replace("'", '"') + data = data.replace("\\", "\\\\") + data = data.replace("\\\\\\\\", "\\\\") + return json.loads(data) + + def isCorrectDbVersion(self, verNumber = 68): + results = self.sql_query("select version from schema_migrations") + # self.Log(results) + if len(results['rows']) == 0 or len(results['rows'][0]) == 0: + return False + return int(results['rows'][0][0]) == verNumber + + def renameFileNameInDB(self, fileId, oldName, newName): + if self.isCorrectDbVersion(): + query = f'update files set basename = "{newName}" where basename = "{oldName}" and id = {fileId};' + self.Trace(f"Executing query ({query})") + results = self.sql_commit(query) + if 'rows_affected' in results and results['rows_affected'] == 1: + return True + return False + + def getFileNameFromDB(self, id): + results = self.sql_query(f'select basename from files where id = {id};') + self.Trace(f"results = ({results})") + if len(results['rows']) == 0 or len(results['rows'][0]) == 0: + return None + return results['rows'][0][0] + # ############################################################################################################ # Functions which are candidates to be added to parent class use snake_case naming convention. # ############################################################################################################ diff --git a/plugins/RenameFile/StashPluginHelper.py b/plugins/RenameFile/StashPluginHelper.py index 4c643e6..d54c1a4 100644 --- a/plugins/RenameFile/StashPluginHelper.py +++ b/plugins/RenameFile/StashPluginHelper.py @@ -802,6 +802,36 @@ class StashPluginHelper(StashInterface): else: self.Log(f"Skipping Job ID({jobDetails['id']}); description={jobDetails['description']}; {jobDetails})") + def toJson(self, data, replaceSingleQuote=False): + if replaceSingleQuote: + data = data.replace("'", '"') + data = data.replace("\\", "\\\\") + data = data.replace("\\\\\\\\", "\\\\") + return json.loads(data) + + def isCorrectDbVersion(self, verNumber = 68): + results = self.sql_query("select version from schema_migrations") + # self.Log(results) + if len(results['rows']) == 0 or len(results['rows'][0]) == 0: + return False + return int(results['rows'][0][0]) == verNumber + + def renameFileNameInDB(self, fileId, oldName, newName): + if self.isCorrectDbVersion(): + query = f'update files set basename = "{newName}" where basename = "{oldName}" and id = {fileId};' + self.Trace(f"Executing query ({query})") + results = self.sql_commit(query) + if 'rows_affected' in results and results['rows_affected'] == 1: + return True + return False + + def getFileNameFromDB(self, id): + results = self.sql_query(f'select basename from files where id = {id};') + self.Trace(f"results = ({results})") + if len(results['rows']) == 0 or len(results['rows'][0]) == 0: + return None + return results['rows'][0][0] + # ############################################################################################################ # Functions which are candidates to be added to parent class use snake_case naming convention. # ############################################################################################################ diff --git a/plugins/RenameFile/renamefile.py b/plugins/RenameFile/renamefile.py index 4db9c9d..8c85ea0 100644 --- a/plugins/RenameFile/renamefile.py +++ b/plugins/RenameFile/renamefile.py @@ -78,10 +78,12 @@ try: if stash.JSON_INPUT['args']['hookContext']['input']: if stash.JSON_INPUT['args']['hookContext']['input'] == None: doNothing = True + stash.Log("input = None") else: inputToUpdateScenePost = True # This avoids calling rename logic twice except: pass + stash.Warn("Exception thrown") if dry_run: stash.Log("Dry run mode is enabled.") @@ -182,21 +184,22 @@ def form_filename(original_file_stem, scene_details): stash.Log(f"Skipping tag not in whitelist: {tag_name}") stash.Trace(f"(tag_keys_added={tag_keys_added})") + stash.Trace(f"scene_details = {scene_details}") + for key in fieldKeyList: if key == 'studio': if stash.pluginSettings["studioAppend"]: - studio_name = scene_details.get('studio', {}) + studio_name = scene_details.get('code', {}) stash.Trace(f"(studio_name={studio_name})") if studio_name: - studio_name = scene_details.get('studio', {}).get('name', '') - stash.Trace(f"(studio_name={studio_name})") - if studio_name: - studio_name += POSTFIX_STYLES.get('studio') - if include_keyField_if_in_name or studio_name.lower() not in title.lower(): - if WRAPPER_STYLES.get('studio'): - filename_parts.append(f"{WRAPPER_STYLES['studio'][0]}{studio_name}{WRAPPER_STYLES['studio'][1]}") - else: - filename_parts.append(studio_name) + studio_name += POSTFIX_STYLES.get('studio') + if include_keyField_if_in_name or studio_name.lower() not in title.lower(): + if WRAPPER_STYLES.get('studio'): + filename_parts.append(f"{WRAPPER_STYLES['studio'][0]}{studio_name}{WRAPPER_STYLES['studio'][1]}") + else: + filename_parts.append(studio_name) + else: + stash.Trace("Skipping studio because of user setting studioAppend disabled.") elif key == 'title': if title: # This value has already been fetch in start of function because it needs to be defined before tags and performers title += POSTFIX_STYLES.get('title') @@ -310,7 +313,9 @@ def rename_scene(scene_id): maxScanCountForUpdate = 10 if scene_details['title'] == None or scene_details['title'] == "": if renameEvenIfTitleEmpty == False: + stash.Log("Nothing to do because title is empty.") return None + stash.Warn("Title is empty.") maxScanCountDefault = 1 maxScanCountForUpdate = 1 if not os.path.isfile(original_file_path) and not taskqueue.clearDupTagsJobOnTaskQueue() and not taskqueue.deleteTaggedScenesJobOnTaskQueue() and not taskqueue.tooManyScanOnTaskQueue(maxScanCountDefault): @@ -340,7 +345,7 @@ def rename_scene(scene_id): new_filename = truncated_filename + '_' + hash_suffix + Path(original_file_path).suffix newFilenameWithExt = new_filename + Path(original_file_path).suffix new_file_path = f"{original_parent_directory}{os.sep}{new_filename}{Path(original_file_name).suffix}" - stash.Trace(f"(original_file_name={original_file_name})(new_file_path={new_file_path})") + stash.Trace(f"(original_file_name={original_file_name}) (newFilenameWithExt={newFilenameWithExt})(new_file_path={new_file_path}) (FileID={scene_details['files'][0]['id']})") if original_file_name == newFilenameWithExt or original_file_name == new_filename: stash.Log(f"Nothing to do, because new file name matches original file name: (newFilenameWithExt={newFilenameWithExt})") return None @@ -375,7 +380,9 @@ def rename_scene(scene_id): # ToDo: Add delay rename here raise - if not taskqueue.tooManyScanOnTaskQueue(maxScanCountForUpdate): + if stash.renameFileNameInDB(scene_details['files'][0]['id'], original_file_name, newFilenameWithExt): + stash.Trace("DB rename success") + elif not taskqueue.tooManyScanOnTaskQueue(maxScanCountForUpdate): stash.Trace(f"Calling [metadata_scan] for path {original_parent_directory.resolve().as_posix()}") stash.metadata_scan(paths=[original_parent_directory.resolve().as_posix()]) time.sleep(POST_SCAN_DELAY) # After a scan, need a few seconds delay before fetching data.