diff --git a/bazarr/indexer/file_watcher.py b/bazarr/indexer/file_watcher.py index 98513dc1f..76ce12d7d 100644 --- a/bazarr/indexer/file_watcher.py +++ b/bazarr/indexer/file_watcher.py @@ -16,7 +16,7 @@ from list_subtitles import store_subtitles, store_subtitles_movie # temporarily disable warning for mac users warnings.simplefilter('ignore', category=UserWarning) if settings.general.filewatcher_type == 'local': - from watchdog_gevent import Observer + from watchdog import Observer else: from watchdog.observers.polling import PollingObserverVFS as Observer # then we enable it again just in case some other module would use this type of warnings diff --git a/libs/version.txt b/libs/version.txt index 2307e61c5..e0b10b4aa 100644 --- a/libs/version.txt +++ b/libs/version.txt @@ -46,7 +46,6 @@ twine=3.4.1 urllib3=1.23 waitress=2.0.0 watchdog=2.1.5 -watchdog-gevent=0.1.1 websocket-client=1.0.0 ## indirect dependencies diff --git a/libs/watchdog_gevent/__init__.py b/libs/watchdog_gevent/__init__.py deleted file mode 100644 index 1c8b4c6bf..000000000 --- a/libs/watchdog_gevent/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -import warnings - -from watchdog.observers import Observer - -try: - from .observers import GeventEmitter, GeventObserver - - Observer = GeventObserver -except (ImportError, RuntimeError) as e: # pragma: no cover - warnings.warn(str(e), ImportWarning, stacklevel=2) - - -__version__ = "0.1.1" -__all__ = [ - "GeventEmitter", - "GeventObserver", - "Observer", - "__version__" -] diff --git a/libs/watchdog_gevent/observers.py b/libs/watchdog_gevent/observers.py deleted file mode 100644 index b406f3403..000000000 --- a/libs/watchdog_gevent/observers.py +++ /dev/null @@ -1,147 +0,0 @@ -import os - -from watchdog.events import ( - DirDeletedEvent, - DirCreatedEvent, - DirModifiedEvent, - FileDeletedEvent, - FileCreatedEvent, - FileModifiedEvent -) -from watchdog.observers.api import ( - EventEmitter, - BaseObserver, - DEFAULT_EMITTER_TIMEOUT, - DEFAULT_OBSERVER_TIMEOUT -) - - -try: - import gevent - import gevent.monkey - import gevent.pool - import gevent.queue - import gevent.threading -except ImportError: # pragma: no cover - raise ImportError( - "gevent observers require the gevent package. Run " - "'pip install gevent' and try again." - ) - - -if not gevent.monkey.is_module_patched("threading"): # pragma: no cover - raise RuntimeError( - "gevent observers require the 'threading' module to be " - "monkeypatched by gevent." - ) - - -def _get_contents(path): - try: - if os.path.isdir(path): - return set(os.listdir(path)) - - return None - except Exception: # pragma: no cover - return None - - -class GeventEmitter(EventEmitter): - """gevent-based emitter. - """ - - def __init__(self, event_queue, watch, timeout=DEFAULT_EMITTER_TIMEOUT): - EventEmitter.__init__(self, event_queue, watch, timeout) - - self._hub = gevent.get_hub() - self._watchlist = set() - self._workers = gevent.pool.Group() - self._add(watch.path, watch.is_recursive) - - def queue_events(self, timeout): - gevent.sleep(timeout) - - def _add(self, path, recursive=True): - if not os.path.isabs(path): - path = os.path.abspath(path) - - if os.path.isdir(path): - if recursive: - for filename in os.listdir(path): - gevent.sleep(0.00001) - self._add(os.path.join(path, filename)) - - self._workers.spawn(self._watch_dir, path) - else: - self._workers.spawn(self._watch_file, path) - - def _loop(self, path): - watcher = self._hub.loop.stat(path, self.timeout / 2) - - while path in self._watchlist: - try: - with gevent.Timeout(self.timeout): - self._hub.wait(watcher) - - except gevent.Timeout: - continue - - except gevent.hub.LoopExit: - break - - yield os.path.exists(path) - - def _watch_dir(self, path): - contents = _get_contents(path) - if contents is None: - return - - self._watchlist.add(path) - for exists in self._loop(path): - current_contents = _get_contents(path) - if current_contents is None: - break - - added_contents = current_contents - contents - for filename in added_contents: - filepath = os.path.join(path, filename) - self._add(filepath) - - if os.path.isdir(filepath): - self.queue_event(DirCreatedEvent(filepath)) - else: - self.queue_event(FileCreatedEvent(filepath)) - - contents = current_contents - if os.path.exists(path): - self.queue_event(DirModifiedEvent(path)) - - for filename in contents: - filepath = os.path.join(path, filename) - self._watchlist.discard(filepath) - self._watchlist.discard(path) - self.queue_event(DirDeletedEvent(path)) - - def _watch_file(self, path): - self._watchlist.add(path) - for exists in self._loop(path): - if not exists: - break - - self.queue_event(FileModifiedEvent(path)) - - self._watchlist.discard(path) - self.queue_event(FileDeletedEvent(path)) - - -class GeventObserver(BaseObserver): - """Observer thread that watches directories using gevent. - Requires gevent monkeypatching to be turned on before import. - """ - - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__( - self, - timeout=timeout, - emitter_class=GeventEmitter, - )