handle watchdog's file created event using the on_modified

handler

+ move processing thumbnails and album colors to the populate class
+ move processing artist colors behind the populate call in run_periodic_checks
This commit is contained in:
geoffrey45 2023-01-25 13:43:09 +03:00
parent 5b71b95d66
commit 6818f9b0e8
3 changed files with 37 additions and 5 deletions

View File

@ -28,10 +28,6 @@ def run_periodic_checks():
except PopulateCancelledError: except PopulateCancelledError:
pass pass
ProcessTrackThumbnails()
ProcessAlbumColors()
ProcessArtistColors()
if utils.Ping()(): if utils.Ping()():
try: try:
CheckArtistImages() CheckArtistImages()
@ -40,4 +36,6 @@ def run_periodic_checks():
"Internet connection lost. Downloading artist images stopped." "Internet connection lost. Downloading artist images stopped."
) )
ProcessArtistColors()
time.sleep(300) time.sleep(300)

View File

@ -7,6 +7,7 @@ from app.db.sqlite.tracks import SQLiteTrackMethods
from app.db.sqlite.settings import SettingsSQLMethods as sdb from app.db.sqlite.settings import SettingsSQLMethods as sdb
from app.db.sqlite.favorite import SQLiteFavoriteMethods as favdb from app.db.sqlite.favorite import SQLiteFavoriteMethods as favdb
from app.db.store import Store from app.db.store import Store
from app.lib.colorlib import ProcessAlbumColors
from app.lib.taglib import extract_thumb, get_tags from app.lib.taglib import extract_thumb, get_tags
from app.logger import log from app.logger import log
@ -65,6 +66,9 @@ class Populate:
self.tag_untagged(untagged, key) self.tag_untagged(untagged, key)
ProcessTrackThumbnails()
ProcessAlbumColors()
@staticmethod @staticmethod
def filter_untagged(tracks: list[Track], files: list[str]): def filter_untagged(tracks: list[Track], files: list[str]):
tagged_files = [t.filepath for t in tracks] tagged_files = [t.filepath for t in tracks]

View File

@ -40,6 +40,8 @@ class Watcher:
while trials < 10: while trials < 10:
try: try:
dirs = sdb.get_root_dirs() dirs = sdb.get_root_dirs()
dirs = [rf"{d}" for d in dirs]
dir_map = [ dir_map = [
{"original": d, "realpath": os.path.realpath(d)} for d in dirs {"original": d, "realpath": os.path.realpath(d)} for d in dirs
] ]
@ -59,7 +61,7 @@ class Watcher:
) )
return return
dir_map = [d for d in dir_map if d['realpath'] != d['original']] dir_map = [d for d in dir_map if d["realpath"] != d["original"]]
if len(dirs) > 0 and dirs[0] == "$home": if len(dirs) > 0 and dirs[0] == "$home":
dirs = [settings.USER_HOME_DIR] dirs = [settings.USER_HOME_DIR]
@ -179,6 +181,8 @@ def remove_track(filepath: str) -> None:
class Handler(PatternMatchingEventHandler): class Handler(PatternMatchingEventHandler):
files_to_process = [] files_to_process = []
files_to_process_windows = []
root_dirs = [] root_dirs = []
dir_map = [] dir_map = []
@ -208,6 +212,7 @@ class Handler(PatternMatchingEventHandler):
Fired when a supported file is created. Fired when a supported file is created.
""" """
self.files_to_process.append(event.src_path) self.files_to_process.append(event.src_path)
self.files_to_process_windows.append(event.src_path)
def on_deleted(self, event): def on_deleted(self, event):
""" """
@ -240,6 +245,7 @@ class Handler(PatternMatchingEventHandler):
def on_closed(self, event): def on_closed(self, event):
""" """
Fired when a created file is closed. Fired when a created file is closed.
NOT FIRED IN WINDOWS
""" """
try: try:
self.files_to_process.remove(event.src_path) self.files_to_process.remove(event.src_path)
@ -248,3 +254,27 @@ class Handler(PatternMatchingEventHandler):
add_track(path) add_track(path)
except ValueError: except ValueError:
pass pass
def on_modified(self, event):
# this event handler is triggered twice on windows
# for copy events. We need to test how this behaves in
# Linux.
if event.src_path not in self.files_to_process_windows:
return
file_size = -1
while file_size != os.path.getsize(event.src_path):
file_size = os.path.getsize(event.src_path)
time.sleep(0.1)
try:
os.rename(event.src_path, event.src_path)
path = self.get_abs_path(event.src_path)
remove_track(path)
add_track(path)
self.files_to_process_windows.remove(event.src_path)
except OSError:
print("File is locked, skipping")
pass