Compare commits

...

9 Commits

Author SHA1 Message Date
tanner 79bf32b35c Adjust log message 2026-04-24 10:28:36 -06:00
tanner 2eb104f4c3 fix: Reduce log spam for missing watch paths
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2026-04-24 10:25:58 -06:00
tanner 941fb535f6 fix: Make watch setup resilient to unmounted paths
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2026-04-24 10:20:15 -06:00
tanner d811483e94 fix: Only trigger Immich scan on file events
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-12-17 11:15:31 -07:00
tanner a92c0464d2 fix: Resolve AttributeError and clean up ignored watch descriptors
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-12-17 11:09:38 -07:00
tanner a0f3b2668b fix: Manually map inotify watch descriptors to paths to fix AttributeError
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-12-17 10:58:48 -07:00
tanner 04bb79111b Skip scan when folders are created 2025-11-25 16:58:17 -07:00
tanner 079deae811 feat: Recursively watch directories and add watches for new subfolders
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2025-11-25 15:12:52 -07:00
tanner 8dd622f9cf refactor: Use secrets module for WATCH_PATHS 2025-11-25 15:12:50 -07:00
+48 -4
View File
@@ -29,21 +29,65 @@ def trigger_scan():
logging.error(f"Failed to trigger scan: {e}") logging.error(f"Failed to trigger scan: {e}")
def add_watch_recursive(inotify, path, watch_flags, wd_to_path):
"""Walk a directory path and add watches recursively."""
logging.info(f"Watching {path} and its subdirectories recursively.")
for root, _, _ in os.walk(path):
try:
logging.info(f"Watching {root}")
wd = inotify.add_watch(root, watch_flags)
wd_to_path[wd] = root
except OSError as e:
logging.error(f"Error adding watch for {root}: {e}")
def main(): def main():
global timer global timer
watch_flags = flags.MODIFY | flags.CREATE | flags.DELETE | flags.MOVED_FROM | flags.MOVED_TO watch_flags = flags.MODIFY | flags.CREATE | flags.DELETE | flags.MOVED_FROM | flags.MOVED_TO
wd_to_path = {}
missing_paths = set()
with INotify() as inotify: with INotify() as inotify:
for path in WATCH_PATHS:
logging.info(f"Watching {path}")
inotify.add_watch(path, watch_flags)
try: try:
while True: while True:
watched_dirs = set(wd_to_path.values())
for path in secrets.WATCH_PATHS:
if path not in watched_dirs:
if os.path.exists(path):
if path in missing_paths:
logging.info(f"Watch path {path} is now available.")
missing_paths.remove(path)
add_watch_recursive(inotify, path, watch_flags, wd_to_path)
else:
if path not in missing_paths:
logging.warning(f"Watch path {path} does not exist. Re-checking every second...")
missing_paths.add(path)
events = inotify.read(timeout=1000) events = inotify.read(timeout=1000)
if events: if events:
scan_needed = False
for event in events: for event in events:
logging.debug(f"Event: {event!r}") logging.debug(f"Event: {event!r}")
if event.mask & flags.IGNORED:
logging.info(f"Watch for wd {event.wd} was removed (directory deleted?).")
if event.wd in wd_to_path:
logging.info(f"Removing path '{wd_to_path[event.wd]}' from watch mapping.")
del wd_to_path[event.wd]
continue
if event.mask & flags.ISDIR and (event.mask & flags.CREATE or event.mask & flags.MOVED_TO):
parent_dir_path = wd_to_path.get(event.wd)
if not parent_dir_path:
logging.warning(f"Could not find path for watch descriptor {event.wd}")
continue
new_dir_path = os.path.join(parent_dir_path, event.name)
logging.info(f"New directory {new_dir_path} detected, adding watches.")
add_watch_recursive(inotify, new_dir_path, watch_flags, wd_to_path)
continue
scan_needed = True
if scan_needed:
if timer: if timer:
timer.cancel() timer.cancel()
logging.info('Debounce cancelled timer.') logging.info('Debounce cancelled timer.')