diff --git a/produksjonsystem.py b/produksjonsystem.py new file mode 100755 index 00000000..e45e7007 --- /dev/null +++ b/produksjonsystem.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 + +import sys +import time + +from watchdog.observers import Observer +from watchdog.events import PatternMatchingEventHandler +from pathlib import Path + +if sys.version_info[0] != 3: + print("# This script requires Python version 3.x") + sys.exit(1) + +class MyHandler(PatternMatchingEventHandler): + base = None + queue = [] + + def __init__(self, base): + super(MyHandler, self).__init__() + self.base = base + + def process(self, event): + source_path = Path(event.src_path).relative_to(self.base) + dest_path = None + if hasattr(event, 'dest_path'): + dest_path = Path(event.dest_path).relative_to(self.base) + + if str(source_path) == ".": + return # ignore + + book = source_path.parts[0] + + nicetext = event.event_type + " " + book + if len(source_path.parts) > 1 or dest_path: + nicetext += ':' + if len(source_path.parts) > 1: + nicetext += ' directory ' if event.is_directory else ' file ' + nicetext += '/'.join(source_path.parts[1:]) + if dest_path: + nicetext += ' to ' + if len(dest_path.parts) > 1: + nicetext += '/'.join(dest_path.parts[1:]) + ' in ' + if source_path.parts[0] != dest_path.parts[0]: + nicetext += ' book '+dest_path.parts[0] + nicetext = " ".join(nicetext.split()) + print(nicetext) + + book_event = { + 'book': book, + 'source': str(source_path), + 'dest': str(dest_path), + 'nicetext': nicetext, + 'event_type': str(event.event_type), + 'is_directory': event.is_directory + } + + book_in_queue = False + for queue_item in self.queue: + if queue_item['book'] == book: + book_in_queue = True + event_in_queue = False + for queue_event in queue_item['events']: + if queue_event == book_event: + event_in_queue = True + if not event_in_queue: + queue_item['events'].append(book_event) + queue_item['last_event'] = int(time.time()) + break + if not book_in_queue: + self.queue.append({ + 'book': book, + 'events': [ book_event ], + 'last_event': int(time.time()) + }) + + def on_created(self, event): + self.process(event) + + def on_modified(self, event): + self.process(event) + + def on_moved(self, event): + self.process(event) + + def on_deleted(self, event): + self.process(event) + + def handle_book_events(self): + x = [b['book'] + ": " + str(int(time.time()) - b['last_event']) for b in self.queue] + + books = [b for b in self.queue if int(time.time()) - b['last_event'] > 10] + if not len(books): + return + book = books[0] + + new_queue = [b for b in self.queue if b is not book] + self.queue = new_queue + print("processing book: "+book['book']) + + +if __name__ == '__main__': + args = sys.argv[1:] + myHandler = MyHandler(args[0]) + observer = Observer() + observer.schedule(myHandler, path=myHandler.base if args else '.', recursive=True) + observer.start() + + try: + while True: + time.sleep(1) + myHandler.handle_book_events() + except KeyboardInterrupt: + observer.stop() + + observer.join() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..c3c7dd3f --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +watchdog==0.8.3 diff --git a/test.sh b/test.sh new file mode 100755 index 00000000..f97fdac5 --- /dev/null +++ b/test.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +# fail and exit on first error +set -e + +# go to script dir +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd "$DIR" + +# make resource dir for testing and start produksjonsystem +mkdir -p target/resources +./produksjonsystem.py "$DIR/target/resources" & +sleep 1 + +# do some basic stuff +cd target/resources +touch foo.xml +sleep 0.5 +echo bar >> foo.xml +sleep 0.5 +mv foo.xml bar.xml +sleep 0.5 +rm bar.xml +sleep 2 + +mkdir -p book1 +sleep 0.5 +touch book1/ncc.html +sleep 0.5 +touch book1/audio1.mp3 +sleep 0.5 +touch book1/audio2.mp3 +sleep 0.5 +touch book1/content.html +sleep 0.5 +touch book1/image.png +sleep 2 + +mkdir -p book2 +sleep 0.5 +touch book2/ncc.html +sleep 0.5 +mv book1/image.png book2/image.png + +sleep 15 + +rm * -r + +# stop produksjonsystem +ps aux | grep produksjonsystem.py | grep -v grep | awk '{print $2}' | xargs kill +wait 2>/dev/null +sleep 1