forked from Github/Axter-Stash
Added logic to restart when job in task queue
This commit is contained in:
@@ -102,7 +102,7 @@ class StashPluginHelper:
|
|||||||
if stash_url and len(stash_url): self.STASH_URL = stash_url
|
if stash_url and len(stash_url): self.STASH_URL = stash_url
|
||||||
self.MAIN_SCRIPT_NAME = mainScriptName if mainScriptName != "" else __main__.__file__
|
self.MAIN_SCRIPT_NAME = mainScriptName if mainScriptName != "" else __main__.__file__
|
||||||
self.PLUGIN_ID = pluginID if pluginID != "" else pathlib.Path(self.MAIN_SCRIPT_NAME).stem.lower()
|
self.PLUGIN_ID = pluginID if pluginID != "" else pathlib.Path(self.MAIN_SCRIPT_NAME).stem.lower()
|
||||||
print(f"self.MAIN_SCRIPT_NAME={self.MAIN_SCRIPT_NAME}, self.PLUGIN_ID={self.PLUGIN_ID}", file=sys.stderr)
|
# print(f"self.MAIN_SCRIPT_NAME={self.MAIN_SCRIPT_NAME}, self.PLUGIN_ID={self.PLUGIN_ID}", file=sys.stderr)
|
||||||
self.LOG_FILE_NAME = logFilePath if logFilePath != "" else f"{pathlib.Path(self.MAIN_SCRIPT_NAME).resolve().parent}{os.sep}{pathlib.Path(self.MAIN_SCRIPT_NAME).stem}.log"
|
self.LOG_FILE_NAME = logFilePath if logFilePath != "" else f"{pathlib.Path(self.MAIN_SCRIPT_NAME).resolve().parent}{os.sep}{pathlib.Path(self.MAIN_SCRIPT_NAME).stem}.log"
|
||||||
self.LOG_FILE_DIR = pathlib.Path(self.LOG_FILE_NAME).resolve().parent
|
self.LOG_FILE_DIR = pathlib.Path(self.LOG_FILE_NAME).resolve().parent
|
||||||
RFH = RotatingFileHandler(
|
RFH = RotatingFileHandler(
|
||||||
|
|||||||
1
plugins/.gitignore
vendored
1
plugins/.gitignore
vendored
@@ -33,6 +33,7 @@ renamefile_settings.cpython-310.pyc
|
|||||||
/WindowsSymbolicLinkCleaner
|
/WindowsSymbolicLinkCleaner
|
||||||
/DeleteMe
|
/DeleteMe
|
||||||
/ATestPlugin
|
/ATestPlugin
|
||||||
|
/FileMonitor/working
|
||||||
|
|
||||||
## Ignore Visual Studio temporary files, build results, and
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
## files generated by popular Visual Studio add-ons.
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ class StashPluginHelper:
|
|||||||
if stash_url and len(stash_url): self.STASH_URL = stash_url
|
if stash_url and len(stash_url): self.STASH_URL = stash_url
|
||||||
self.MAIN_SCRIPT_NAME = mainScriptName if mainScriptName != "" else __main__.__file__
|
self.MAIN_SCRIPT_NAME = mainScriptName if mainScriptName != "" else __main__.__file__
|
||||||
self.PLUGIN_ID = pluginID if pluginID != "" else pathlib.Path(self.MAIN_SCRIPT_NAME).stem.lower()
|
self.PLUGIN_ID = pluginID if pluginID != "" else pathlib.Path(self.MAIN_SCRIPT_NAME).stem.lower()
|
||||||
print(f"self.MAIN_SCRIPT_NAME={self.MAIN_SCRIPT_NAME}, self.PLUGIN_ID={self.PLUGIN_ID}", file=sys.stderr)
|
# print(f"self.MAIN_SCRIPT_NAME={self.MAIN_SCRIPT_NAME}, self.PLUGIN_ID={self.PLUGIN_ID}", file=sys.stderr)
|
||||||
self.LOG_FILE_NAME = logFilePath if logFilePath != "" else f"{pathlib.Path(self.MAIN_SCRIPT_NAME).resolve().parent}{os.sep}{pathlib.Path(self.MAIN_SCRIPT_NAME).stem}.log"
|
self.LOG_FILE_NAME = logFilePath if logFilePath != "" else f"{pathlib.Path(self.MAIN_SCRIPT_NAME).resolve().parent}{os.sep}{pathlib.Path(self.MAIN_SCRIPT_NAME).stem}.log"
|
||||||
self.LOG_FILE_DIR = pathlib.Path(self.LOG_FILE_NAME).resolve().parent
|
self.LOG_FILE_DIR = pathlib.Path(self.LOG_FILE_NAME).resolve().parent
|
||||||
RFH = RotatingFileHandler(
|
RFH = RotatingFileHandler(
|
||||||
|
|||||||
@@ -22,8 +22,15 @@ parser.add_argument('--url', '-u', dest='stash_url', type=str, help='Add Stash U
|
|||||||
parser.add_argument('--trace', '-t', dest='trace', action='store_true', help='Enables debug trace mode.')
|
parser.add_argument('--trace', '-t', dest='trace', action='store_true', help='Enables debug trace mode.')
|
||||||
parser.add_argument('--stop', '-s', dest='stop', action='store_true', help='Stop (kill) a running FileMonitor task.')
|
parser.add_argument('--stop', '-s', dest='stop', action='store_true', help='Stop (kill) a running FileMonitor task.')
|
||||||
parser.add_argument('--restart', '-r', dest='restart', action='store_true', help='Restart FileMonitor.')
|
parser.add_argument('--restart', '-r', dest='restart', action='store_true', help='Restart FileMonitor.')
|
||||||
|
parser.add_argument('--silent', '--quit', '-q', dest='quit', action='store_true', help='Run in silent mode. No output to console or stderr. Use this when running from pythonw.exe')
|
||||||
parse_args = parser.parse_args()
|
parse_args = parser.parse_args()
|
||||||
|
|
||||||
|
logToErrSet = 0
|
||||||
|
logToNormSet = 0
|
||||||
|
if parse_args.quit:
|
||||||
|
logToErrSet = 1
|
||||||
|
logToNormSet = 1
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
"recursiveDisabled": False,
|
"recursiveDisabled": False,
|
||||||
"zzdebugTracing": False,
|
"zzdebugTracing": False,
|
||||||
@@ -33,7 +40,10 @@ plugin = StashPluginHelper(
|
|||||||
stash_url=parse_args.stash_url,
|
stash_url=parse_args.stash_url,
|
||||||
debugTracing=parse_args.trace,
|
debugTracing=parse_args.trace,
|
||||||
settings=settings,
|
settings=settings,
|
||||||
config=config)
|
config=config,
|
||||||
|
logToErrSet=logToErrSet,
|
||||||
|
logToNormSet=logToNormSet
|
||||||
|
)
|
||||||
plugin.Status()
|
plugin.Status()
|
||||||
plugin.Log(f"\nStarting (__file__={__file__}) (plugin.CALLED_AS_STASH_PLUGIN={plugin.CALLED_AS_STASH_PLUGIN}) (plugin.DEBUG_TRACING={plugin.DEBUG_TRACING}) (plugin.DRY_RUN={plugin.DRY_RUN}) (plugin.PLUGIN_TASK_NAME={plugin.PLUGIN_TASK_NAME})************************************************")
|
plugin.Log(f"\nStarting (__file__={__file__}) (plugin.CALLED_AS_STASH_PLUGIN={plugin.CALLED_AS_STASH_PLUGIN}) (plugin.DEBUG_TRACING={plugin.DEBUG_TRACING}) (plugin.DRY_RUN={plugin.DRY_RUN}) (plugin.PLUGIN_TASK_NAME={plugin.PLUGIN_TASK_NAME})************************************************")
|
||||||
|
|
||||||
@@ -69,6 +79,22 @@ if plugin.DRY_RUN:
|
|||||||
plugin.Log("Dry run mode is enabled.")
|
plugin.Log("Dry run mode is enabled.")
|
||||||
plugin.Trace(f"(SCAN_MODIFIED={SCAN_MODIFIED}) (SCAN_ON_ANY_EVENT={SCAN_ON_ANY_EVENT}) (RECURSIVE={RECURSIVE})")
|
plugin.Trace(f"(SCAN_MODIFIED={SCAN_MODIFIED}) (SCAN_ON_ANY_EVENT={SCAN_ON_ANY_EVENT}) (RECURSIVE={RECURSIVE})")
|
||||||
|
|
||||||
|
def isJobWaitingToRun():
|
||||||
|
i = 1
|
||||||
|
while i < 999:
|
||||||
|
jobDetails = plugin.STASH_INTERFACE.find_job(i)
|
||||||
|
if jobDetails:
|
||||||
|
plugin.Trace(f"(Job ID({i})={jobDetails})")
|
||||||
|
if jobDetails['status'] == "READY" and jobDetails['description'] != "Running plugin task: Start Library Monitor":
|
||||||
|
return i
|
||||||
|
else:
|
||||||
|
plugin.Trace(f"Last job {i}")
|
||||||
|
break
|
||||||
|
i += 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
plugin.Trace(f"isJobWaitingToRun() = {isJobWaitingToRun()})")
|
||||||
|
|
||||||
def start_library_monitor():
|
def start_library_monitor():
|
||||||
global shouldUpdate
|
global shouldUpdate
|
||||||
global TargetPaths
|
global TargetPaths
|
||||||
@@ -154,6 +180,8 @@ def start_library_monitor():
|
|||||||
observer.schedule(event_handler, path, recursive=RECURSIVE)
|
observer.schedule(event_handler, path, recursive=RECURSIVE)
|
||||||
plugin.Trace(f"Observing {path}")
|
plugin.Trace(f"Observing {path}")
|
||||||
observer.start()
|
observer.start()
|
||||||
|
JobIsRunning = False
|
||||||
|
PutPluginBackOnTaskQueAndExit = False
|
||||||
plugin.Trace("Starting loop")
|
plugin.Trace("Starting loop")
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
@@ -161,11 +189,19 @@ def start_library_monitor():
|
|||||||
with mutex:
|
with mutex:
|
||||||
while not shouldUpdate:
|
while not shouldUpdate:
|
||||||
plugin.Trace("Wait start")
|
plugin.Trace("Wait start")
|
||||||
signal.wait(timeout=SIGNAL_TIMEOUT)
|
if plugin.CALLED_AS_STASH_PLUGIN:
|
||||||
|
signal.wait(timeout=SIGNAL_TIMEOUT)
|
||||||
|
else:
|
||||||
|
signal.wait()
|
||||||
plugin.Trace("Wait end")
|
plugin.Trace("Wait end")
|
||||||
if shm_buffer[0] != CONTINUE_RUNNING_SIG:
|
if shm_buffer[0] != CONTINUE_RUNNING_SIG:
|
||||||
plugin.Log(f"Breaking out of loop. (shm_buffer[0]={shm_buffer[0]})")
|
plugin.Log(f"Breaking out of loop. (shm_buffer[0]={shm_buffer[0]})")
|
||||||
break
|
break
|
||||||
|
JobIdInTheQue = isJobWaitingToRun()
|
||||||
|
if plugin.CALLED_AS_STASH_PLUGIN and JobIdInTheQue:
|
||||||
|
plugin.Log(f"Another task (JobID={JobIdInTheQue}) is waiting on the queue. Will restart FileMonitor to allow other task to run.")
|
||||||
|
JobIsRunning = True
|
||||||
|
shouldUpdate = True
|
||||||
shouldUpdate = False
|
shouldUpdate = False
|
||||||
TmpTargetPaths = []
|
TmpTargetPaths = []
|
||||||
for TargetPath in TargetPaths:
|
for TargetPath in TargetPaths:
|
||||||
@@ -186,16 +222,19 @@ def start_library_monitor():
|
|||||||
if RUN_GENERATE_CONTENT:
|
if RUN_GENERATE_CONTENT:
|
||||||
plugin.STASH_INTERFACE.metadata_generate()
|
plugin.STASH_INTERFACE.metadata_generate()
|
||||||
if plugin.CALLED_AS_STASH_PLUGIN and shm_buffer[0] == CONTINUE_RUNNING_SIG:
|
if plugin.CALLED_AS_STASH_PLUGIN and shm_buffer[0] == CONTINUE_RUNNING_SIG:
|
||||||
plugin.STASH_INTERFACE.run_plugin_task(plugin_id=plugin.PLUGIN_ID, task_name="Start Library Monitor")
|
PutPluginBackOnTaskQueAndExit = True
|
||||||
plugin.Trace("Exiting plugin so that metadata_scan task can run.")
|
|
||||||
return
|
|
||||||
else:
|
else:
|
||||||
plugin.Trace("Nothing to scan.")
|
plugin.Trace("Nothing to scan.")
|
||||||
|
|
||||||
if shm_buffer[0] != CONTINUE_RUNNING_SIG:
|
if shm_buffer[0] != CONTINUE_RUNNING_SIG:
|
||||||
plugin.Log(f"Exiting Change File Monitor. (shm_buffer[0]={shm_buffer[0]})")
|
plugin.Log(f"Exiting Change File Monitor. (shm_buffer[0]={shm_buffer[0]})")
|
||||||
shm_a.close()
|
shm_a.close()
|
||||||
shm_a.unlink() # Call unlink only once to release the shared memory
|
shm_a.unlink() # Call unlink only once to release the shared memory
|
||||||
raise KeyboardInterrupt
|
raise KeyboardInterrupt
|
||||||
|
elif JobIsRunning or PutPluginBackOnTaskQueAndExit:
|
||||||
|
plugin.STASH_INTERFACE.run_plugin_task(plugin_id=plugin.PLUGIN_ID, task_name="Start Library Monitor")
|
||||||
|
plugin.Trace("Exiting plugin so that other task can run.")
|
||||||
|
return
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
observer.stop()
|
observer.stop()
|
||||||
plugin.Trace("Stopping observer")
|
plugin.Trace("Stopping observer")
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ config = {
|
|||||||
"onAnyEvent": False,
|
"onAnyEvent": False,
|
||||||
# Enable to monitor changes in file system for modification flag. This option is NOT needed for Windows, because on Windows changes are triggered via CREATE, DELETE, and MOVE flags. Other OS may differ.
|
# Enable to monitor changes in file system for modification flag. This option is NOT needed for Windows, because on Windows changes are triggered via CREATE, DELETE, and MOVE flags. Other OS may differ.
|
||||||
"scanModified": False,
|
"scanModified": False,
|
||||||
# Timeout in seconds. This is how often it will check if a stop signal is sent.
|
# Timeout in seconds. This is how often it will check if another job (Task) is in the queue.
|
||||||
"timeOut": 3600,
|
"timeOut": 60, # Not needed when running in command line mode.
|
||||||
# Enable to exit FileMonitor by creating special file in plugin folder\working
|
# Enable to exit FileMonitor by creating special file in plugin folder\working
|
||||||
"createSpecFileToExit": True,
|
"createSpecFileToExit": True,
|
||||||
# Enable to delete special file imediately after it's created in stop process
|
# Enable to delete special file imediately after it's created in stop process
|
||||||
|
|||||||
Reference in New Issue
Block a user