From e7b340f1a05c4ef9a28a427d34ff12f14113c95c Mon Sep 17 00:00:00 2001
From: Alexander Schmidt <alex@treefish.org>
Date: Mon, 19 Oct 2020 14:13:16 +0200
Subject: [PATCH] continue with daemon implementation

---
 src/bunch.py            | 11 ++++++++---
 src/dirtrigger.py       | 43 ++++++++++++++++++++++++++++++++++++++---
 src/photosort-daemon.py |  3 +++
 3 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/src/bunch.py b/src/bunch.py
index 713a618..b61ffce 100644
--- a/src/bunch.py
+++ b/src/bunch.py
@@ -37,8 +37,12 @@ class Bunch:
         self._worker_thread.join()
         logging.info("Stopped bunch %s.", self._id)
 
+    def is_running(self):
+        return self._worker_thread.is_alive()
+
     def _worker(self):
-        # start triggers
+        for source in self._sources:
+            source.trigger.start()
 
         while not self._stop:
             for source in self._sources:
@@ -46,7 +50,7 @@ class Bunch:
                     if source.trigger.is_triggering():
                         logging.info("Got source trigger for bunch %s.", self._id)
                         source.trigger.reset()
-                        source.migrator.migrate()
+                        source.migrator.migrate(source.cleanup)
                         if source.cleanup:
                             source.migrator.cleanup()
                 except Exception as e:
@@ -54,4 +58,5 @@ class Bunch:
                                   self._id, str(e))
             time.sleep(10.0)
 
-        # stop triggers
+        for source in self._sources:
+            source.trigger.stop()
diff --git a/src/dirtrigger.py b/src/dirtrigger.py
index f8f67cf..7978df3 100644
--- a/src/dirtrigger.py
+++ b/src/dirtrigger.py
@@ -1,6 +1,43 @@
-class DirTrigger:
+import threading
+import time
+from watchdog.events import FileSystemEventHandler
+from watchdog.observers import Observer
+
+class DirTrigger(FileSystemEventHandler):
+    COOL_TIME = 10
+    MAX_TIME = 86400
+
     def __init__(self, dir_path):
-        pass
+        self._got_event = False
+        self._last_event_time = 0.0
+        self._last_reset_time = 0.0
+        self._lock = threading.Lock()
+        self._observer = Observer()
+        self._observer.schedule(self, path=dir_path, recursive=True)
+
+    def start(self):
+        self._observer.start()
+
+    def stop(self):
+        self._observer.stop()
 
     def is_triggering(self):
-        return False
+        self._lock.acquire()
+        try:
+            return ( self._got_event and
+                     (time.time() - self._last_event_time > DirTrigger.COOL_TIME) ) or \
+                     time.time() - self._last_reset_time > DirTrigger.MAX_TIME
+        finally:
+            self._lock.release()
+
+    def reset(self):
+        self._got_event = False
+        self._last_reset_time = time.time()
+
+    def on_any_event(self, event):
+        self._lock.acquire()
+        try:
+            self._got_event = True
+            self._last_event_time = time.time()
+        finally:
+            self._lock.release()
diff --git a/src/photosort-daemon.py b/src/photosort-daemon.py
index 9bb7213..cdd652d 100755
--- a/src/photosort-daemon.py
+++ b/src/photosort-daemon.py
@@ -42,6 +42,9 @@ for bunch in bunches:
     bunch.start()
 
 while not stop:
+    for bunch in bunches:
+        if not bunch.is_running():
+            stop = True
     time.sleep(2.0)
 
 for bunch in bunches:
-- 
2.39.5