Added advance multiple options

This commit is contained in:
David Maisonave
2024-11-04 04:22:50 -05:00
parent 6862a8496c
commit 579c7c5b72
4 changed files with 1738 additions and 1584 deletions

View File

@@ -3,8 +3,13 @@
# Get the latest developers version from following link: https://github.com/David-Maisonave/Axter-Stash/tree/main/plugins/DupFileManager # Get the latest developers version from following link: https://github.com/David-Maisonave/Axter-Stash/tree/main/plugins/DupFileManager
# Note: To call this script outside of Stash, pass argument --url # Note: To call this script outside of Stash, pass argument --url
# Example: python DupFileManager.py --url http://localhost:9999 -a # Example: python DupFileManager.py --url http://localhost:9999 -a
import ModulesValidate try:
ModulesValidate.modulesInstalled(["send2trash", "requests"], silent=True) import ModulesValidate
ModulesValidate.modulesInstalled(["send2trash", "requests"], silent=True)
except Exception as e:
import traceback, sys
tb = traceback.format_exc()
print(f"ModulesValidate Exception. Error: {e}\nTraceBack={tb}", file=sys.stderr)
import os, sys, time, pathlib, argparse, platform, shutil, traceback, logging, requests import os, sys, time, pathlib, argparse, platform, shutil, traceback, logging, requests
from datetime import datetime from datetime import datetime
from StashPluginHelper import StashPluginHelper from StashPluginHelper import StashPluginHelper
@@ -60,7 +65,7 @@ stash = StashPluginHelper(
) )
stash.convertToAscii = True stash.convertToAscii = True
advanceMenuOptions = [ "pathToDelete", "pathToDeleteBlacklist", "sizeToDeleteLess", "sizeToDeleteGreater", "sizeToDeleteBlacklistLess", "sizeToDeleteBlacklistGreater", "durationToDeleteLess", "durationToDeleteGreater", "durationToDeleteBlacklistLess", "durationToDeleteBlacklistGreater", advanceMenuOptions = [ "applyCombo", "applyComboBlacklist", "pathToDelete", "pathToDeleteBlacklist", "sizeToDeleteLess", "sizeToDeleteGreater", "sizeToDeleteBlacklistLess", "sizeToDeleteBlacklistGreater", "durationToDeleteLess", "durationToDeleteGreater", "durationToDeleteBlacklistLess", "durationToDeleteBlacklistGreater",
"commonResToDeleteLess", "commonResToDeleteEq", "commonResToDeleteGreater", "commonResToDeleteBlacklistLess", "commonResToDeleteBlacklistEq", "commonResToDeleteBlacklistGreater", "resolutionToDeleteLess", "resolutionToDeleteEq", "resolutionToDeleteGreater", "commonResToDeleteLess", "commonResToDeleteEq", "commonResToDeleteGreater", "commonResToDeleteBlacklistLess", "commonResToDeleteBlacklistEq", "commonResToDeleteBlacklistGreater", "resolutionToDeleteLess", "resolutionToDeleteEq", "resolutionToDeleteGreater",
"resolutionToDeleteBlacklistLess", "resolutionToDeleteBlacklistEq", "resolutionToDeleteBlacklistGreater", "ratingToDeleteLess", "ratingToDeleteEq", "ratingToDeleteGreater", "ratingToDeleteBlacklistLess", "ratingToDeleteBlacklistEq", "ratingToDeleteBlacklistGreater", "resolutionToDeleteBlacklistLess", "resolutionToDeleteBlacklistEq", "resolutionToDeleteBlacklistGreater", "ratingToDeleteLess", "ratingToDeleteEq", "ratingToDeleteGreater", "ratingToDeleteBlacklistLess", "ratingToDeleteBlacklistEq", "ratingToDeleteBlacklistGreater",
"tagToDelete", "tagToDeleteBlacklist", "titleToDelete", "titleToDeleteBlacklist", "pathStrToDelete", "pathStrToDeleteBlacklist"] "tagToDelete", "tagToDeleteBlacklist", "titleToDelete", "titleToDeleteBlacklist", "pathStrToDelete", "pathStrToDeleteBlacklist"]
@@ -503,7 +508,7 @@ def isWorseKeepCandidate(DupFileToKeep, Scene):
def killScanningJobs(): def killScanningJobs():
try: try:
if killScanningPostProcess: if killScanningPostProcess:
stash.stopJobs(0, "Scanning...") stash.stopJobs(1, "Scanning...")
except Exception as e: except Exception as e:
tb = traceback.format_exc() tb = traceback.format_exc()
stash.Error(f"Exception while trying to kill scan jobs; Error: {e}\nTraceBack={tb}") stash.Error(f"Exception while trying to kill scan jobs; Error: {e}\nTraceBack={tb}")
@@ -914,7 +919,45 @@ def findCurrentTagId(tagNames):
return tagId[0]['id'] return tagId[0]['id']
return "-1" return "-1"
def getAdvanceMenuOptionSelected(): def toJson(data):
import json
# data = data.replace("'", '"')
data = data.replace("\\", "\\\\")
data = data.replace("\\\\\\\\", "\\\\")
return json.loads(data)
def getAnAdvanceMenuOptionSelected(taskName, target, isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, fileNotExistToDelete, compareToLess, compareToGreater):
stash.Log(f"Processing taskName = {taskName}, target = {target}")
if "Blacklist" in taskName:
isBlackList = True
if "Less" in taskName:
compareToLess = True
if "Greater" in taskName:
compareToGreater = True
if "pathToDelete" in taskName:
pathToDelete = target.lower()
elif "sizeToDelete" in taskName:
sizeToDelete = int(target)
elif "durationToDelete" in taskName:
durationToDelete = int(target)
elif "commonResToDelete" in taskName:
resolutionToDelete = int(target)
elif "resolutionToDelete" in taskName:
resolutionToDelete = int(target)
elif "ratingToDelete" in taskName:
ratingToDelete = int(target) * 20
elif "tagToDelete" in taskName:
tagToDelete = target.lower()
elif "titleToDelete" in taskName:
titleToDelete = target.lower()
elif "pathStrToDelete" in taskName:
pathStrToDelete = target.lower()
elif "fileNotExistToDelete" in taskName:
fileNotExistToDelete = True
return isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, fileNotExistToDelete, compareToLess, compareToGreater
def getAdvanceMenuOptionSelected(advanceMenuOptionSelected):
isBlackList = False isBlackList = False
pathToDelete = "" pathToDelete = ""
sizeToDelete = -1 sizeToDelete = -1
@@ -924,35 +967,18 @@ def getAdvanceMenuOptionSelected():
tagToDelete = "" tagToDelete = ""
titleToDelete = "" titleToDelete = ""
pathStrToDelete = "" pathStrToDelete = ""
fileNotExistToDelete = False
compareToLess = False compareToLess = False
compareToGreater = False compareToGreater = False
if 'Target' in stash.JSON_INPUT['args']: if advanceMenuOptionSelected:
if "Blacklist" in stash.PLUGIN_TASK_NAME: if 'Target' in stash.JSON_INPUT['args']:
isBlackList = True if "applyCombo" in stash.PLUGIN_TASK_NAME:
if "Less" in stash.PLUGIN_TASK_NAME: jsonObject = toJson(stash.JSON_INPUT['args']['Target'])
compareToLess = True for taskName in jsonObject:
if "Greater" in stash.PLUGIN_TASK_NAME: isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, fileNotExistToDelete, compareToLess, compareToGreater = getAnAdvanceMenuOptionSelected(taskName, jsonObject[taskName], isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, compareToLess, compareToGreater)
compareToGreater = True else:
return getAnAdvanceMenuOptionSelected(stash.PLUGIN_TASK_NAME, stash.JSON_INPUT['args']['Target'], isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, compareToLess, compareToGreater)
if "pathToDelete" in stash.PLUGIN_TASK_NAME: return isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, fileNotExistToDelete, compareToLess, compareToGreater
pathToDelete = stash.JSON_INPUT['args']['Target'].lower()
elif "sizeToDelete" in stash.PLUGIN_TASK_NAME:
sizeToDelete = int(stash.JSON_INPUT['args']['Target'])
elif "durationToDelete" in stash.PLUGIN_TASK_NAME:
durationToDelete = int(stash.JSON_INPUT['args']['Target'])
elif "commonResToDelete" in stash.PLUGIN_TASK_NAME:
resolutionToDelete = int(stash.JSON_INPUT['args']['Target'])
elif "resolutionToDelete" in stash.PLUGIN_TASK_NAME:
resolutionToDelete = int(stash.JSON_INPUT['args']['Target'])
elif "ratingToDelete" in stash.PLUGIN_TASK_NAME:
ratingToDelete = int(stash.JSON_INPUT['args']['Target']) * 20
elif "tagToDelete" in stash.PLUGIN_TASK_NAME:
tagToDelete = stash.JSON_INPUT['args']['Target'].lower()
elif "titleToDelete" in stash.PLUGIN_TASK_NAME:
titleToDelete = stash.JSON_INPUT['args']['Target'].lower()
elif "pathStrToDelete" in stash.PLUGIN_TASK_NAME:
pathStrToDelete = stash.JSON_INPUT['args']['Target'].lower()
return isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, compareToLess, compareToGreater
def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=False, tagId=-1, advanceMenuOptionSelected=False): def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=False, tagId=-1, advanceMenuOptionSelected=False):
if tagId == -1: if tagId == -1:
@@ -965,19 +991,10 @@ def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=F
if clearAllDupfileManagerTags: if clearAllDupfileManagerTags:
excludedTags = [duplicateMarkForDeletion, duplicateWhitelistTag, excludeDupFileDeleteTag, graylistMarkForDeletion, longerDurationLowerResolution] excludedTags = [duplicateMarkForDeletion, duplicateWhitelistTag, excludeDupFileDeleteTag, graylistMarkForDeletion, longerDurationLowerResolution]
isBlackList = False isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, fileNotExistToDelete, compareToLess, compareToGreater = getAdvanceMenuOptionSelected(advanceMenuOptionSelected)
pathToDelete = "" if advanceMenuOptionSelected and deleteScenes and pathToDelete == "" and tagToDelete == "" and titleToDelete == "" and pathStrToDelete == "" and sizeToDelete == -1 and durationToDelete == -1 and resolutionToDelete == -1 and ratingToDelete == -1 and fileNotExistToDelete == False:
sizeToDelete = -1 stash.Error("Running advance menu option with no options enabled.")
durationToDelete = -1 return
resolutionToDelete = -1
ratingToDelete = -1
tagToDelete = ""
titleToDelete = ""
pathStrToDelete = ""
compareToLess = False
compareToGreater = False
if advanceMenuOptionSelected:
isBlackList, pathToDelete, sizeToDelete, durationToDelete, resolutionToDelete, ratingToDelete, tagToDelete, titleToDelete, pathStrToDelete, compareToLess, compareToGreater = getAdvanceMenuOptionSelected()
QtyDup = 0 QtyDup = 0
QtyDeleted = 0 QtyDeleted = 0
@@ -1037,16 +1054,15 @@ def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=F
if isBlackList: if isBlackList:
if not stash.startsWithInList(blacklist, scene['files'][0]['path']): if not stash.startsWithInList(blacklist, scene['files'][0]['path']):
continue continue
if pathToDelete != "": if pathToDelete != "":
if not DupFileName.lower().startswith(pathToDelete): if not DupFileName.lower().startswith(pathToDelete):
stash.Debug(f"Skipping file {DupFileName} because it does not start with {pathToDelete}.") stash.Debug(f"Skipping file {DupFileName} because it does not start with {pathToDelete}.")
continue continue
elif pathStrToDelete != "": if pathStrToDelete != "":
if not pathStrToDelete in DupFileName.lower(): if not pathStrToDelete in DupFileName.lower():
stash.Debug(f"Skipping file {DupFileName} because it does not contain value {pathStrToDelete}.") stash.Debug(f"Skipping file {DupFileName} because it does not contain value {pathStrToDelete}.")
continue continue
elif sizeToDelete != -1: if sizeToDelete != -1:
compareTo = int(scene['files'][0]['size']) compareTo = int(scene['files'][0]['size'])
if compareToLess: if compareToLess:
if not (compareTo < sizeToDelete): if not (compareTo < sizeToDelete):
@@ -1057,7 +1073,7 @@ def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=F
else: else:
if not compareTo == sizeToDelete: if not compareTo == sizeToDelete:
continue continue
elif durationToDelete != -1: if durationToDelete != -1:
compareTo = int(scene['files'][0]['duration']) compareTo = int(scene['files'][0]['duration'])
if compareToLess: if compareToLess:
if not (compareTo < durationToDelete): if not (compareTo < durationToDelete):
@@ -1068,7 +1084,7 @@ def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=F
else: else:
if not compareTo == durationToDelete: if not compareTo == durationToDelete:
continue continue
elif resolutionToDelete != -1: if resolutionToDelete != -1:
compareTo = int(scene['files'][0]['width']) * int(scene['files'][0]['height']) compareTo = int(scene['files'][0]['width']) * int(scene['files'][0]['height'])
if compareToLess: if compareToLess:
if not (compareTo < resolutionToDelete): if not (compareTo < resolutionToDelete):
@@ -1079,7 +1095,7 @@ def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=F
else: else:
if not compareTo == resolutionToDelete: if not compareTo == resolutionToDelete:
continue continue
elif ratingToDelete != -1: if ratingToDelete != -1:
if scene['rating100'] == "None": if scene['rating100'] == "None":
compareTo = 0 compareTo = 0
else: else:
@@ -1093,11 +1109,11 @@ def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=F
else: else:
if not compareTo == resolutionToDelete: if not compareTo == resolutionToDelete:
continue continue
elif titleToDelete != "": if titleToDelete != "":
if not titleToDelete in scene['title'].lower(): if not titleToDelete in scene['title'].lower():
stash.Debug(f"Skipping file {DupFileName} because it does not contain value {titleToDelete} in title ({scene['title']}).") stash.Debug(f"Skipping file {DupFileName} because it does not contain value {titleToDelete} in title ({scene['title']}).")
continue continue
elif tagToDelete != "": if tagToDelete != "":
doProcessThis = False doProcessThis = False
for tag in scene['tags']: for tag in scene['tags']:
if tag['name'].lower() == tagToDelete: if tag['name'].lower() == tagToDelete:
@@ -1105,8 +1121,9 @@ def manageTagggedDuplicates(deleteScenes=False, clearTag=False, setGrayListTag=F
break break
if doProcessThis == False: if doProcessThis == False:
continue continue
else: if fileNotExistToDelete:
continue if os.path.isfile(scene['files'][0]['path']):
continue
stash.Warn(f"Deleting duplicate '{DupFileName}'", toAscii=True, printTo=LOG_STASH_N_PLUGIN) stash.Warn(f"Deleting duplicate '{DupFileName}'", toAscii=True, printTo=LOG_STASH_N_PLUGIN)
if alternateTrashCanPath != "": if alternateTrashCanPath != "":
destPath = f"{alternateTrashCanPath }{os.sep}{DupFileNameOnly}" destPath = f"{alternateTrashCanPath }{os.sep}{DupFileNameOnly}"

File diff suppressed because it is too large Load Diff

View File

@@ -3,8 +3,13 @@
# Get the latest developers version from following link: https://github.com/David-Maisonave/Axter-Stash/tree/main/plugins/FileMonitor # Get the latest developers version from following link: https://github.com/David-Maisonave/Axter-Stash/tree/main/plugins/FileMonitor
# Note: To call this script outside of Stash, pass argument --url and the Stash URL. # Note: To call this script outside of Stash, pass argument --url and the Stash URL.
# Example: python filemonitor.py --url http://localhost:9999 # Example: python filemonitor.py --url http://localhost:9999
import ModulesValidate try:
ModulesValidate.modulesInstalled(["stashapp-tools", "watchdog", "schedule", "requests"]) import ModulesValidate
ModulesValidate.modulesInstalled(["stashapp-tools", "watchdog", "schedule", "requests"])
except Exception as e:
import traceback, sys
tb = traceback.format_exc()
print(f"ModulesValidate Exception. Error: {e}\nTraceBack={tb}", file=sys.stderr)
from StashPluginHelper import StashPluginHelper from StashPluginHelper import StashPluginHelper
import os, sys, time, pathlib, argparse, platform, traceback, logging import os, sys, time, pathlib, argparse, platform, traceback, logging
from StashPluginHelper import taskQueue from StashPluginHelper import taskQueue

View File

@@ -2,8 +2,14 @@
# By David Maisonave (aka Axter) Jul-2024 (https://www.axter.com/) # By David Maisonave (aka Axter) Jul-2024 (https://www.axter.com/)
# Get the latest developers version from following link: https://github.com/David-Maisonave/Axter-Stash/tree/main/plugins/RenameFile # Get the latest developers version from following link: https://github.com/David-Maisonave/Axter-Stash/tree/main/plugins/RenameFile
# Based on source code from https://github.com/Serechops/Serechops-Stash/tree/main/plugins/Renamer # Based on source code from https://github.com/Serechops/Serechops-Stash/tree/main/plugins/Renamer
import ModulesValidate try:
ModulesValidate.modulesInstalled(["stashapp-tools", "requests"]) import ModulesValidate
ModulesValidate.modulesInstalled(["stashapp-tools", "requests"])
except Exception as e:
import traceback, sys
tb = traceback.format_exc()
print(f"ModulesValidate Exception. Error: {e}\nTraceBack={tb}", file=sys.stderr)
import os, sys, shutil, json, hashlib, pathlib, logging, time, traceback import os, sys, shutil, json, hashlib, pathlib, logging, time, traceback
from pathlib import Path from pathlib import Path
import stashapi.log as log # Importing stashapi.log as log for critical events ONLY import stashapi.log as log # Importing stashapi.log as log for critical events ONLY