diff --git a/sickbeard/generic_queue.py b/sickbeard/generic_queue.py index 9b04b9d..30c294a 100644 --- a/sickbeard/generic_queue.py +++ b/sickbeard/generic_queue.py @@ -21,10 +21,12 @@ import datetime import threading from . import logger +from exceptions_helper import ex +from six import integer_types # noinspection PyUnreachableCode if False: - from typing import AnyStr, List, Union + from typing import AnyStr, Callable, Dict, List, Tuple, Union from .search_queue import BaseSearchQueueItem from .show_queue import ShowQueueItem @@ -47,7 +49,9 @@ class GenericQueue(object): self.min_priority = 0 # type: int - self.lock = threading.Lock() + self.events = {} # type: Dict[int, List[Callable]] + + self.lock = threading.RLock() def pause(self): logger.log(u'Pausing queue') @@ -73,6 +77,37 @@ class GenericQueue(object): return item + def check_events(self): + pass + + def add_event(self, event_type, method): + # type: (int, Callable) -> None + if isinstance(event_type, integer_types) and callable(method): + if event_type not in self.events: + self.events[event_type] = [] + if method not in self.events[event_type]: + self.events[event_type].append(method) + + def remove_event(self, event_type, method): + # type: (int, Callable) -> None + if isinstance(event_type, integer_types) and callable(method): + if event_type in self.events and method in self.events[event_type]: + try: + self.events[event_type].remove(method) + if 0 == len(self.events[event_type]): + del self.events[event_type] + except (BaseException, Exception) as e: + logger.log('Error removing event method from queue: %s' % ex(e), logger.ERROR) + + def execute_events(self, event_type, *args, **kwargs): + # type: (int, Tuple, Dict) -> None + if event_type in self.events: + for event in self.events.get(event_type): + try: + event(*args, **kwargs) + except (BaseException, Exception) as e: + logger.log('Error executing Event: %s' % ex(e), logger.ERROR) + def run(self): # only start a new task if one isn't already going @@ -97,6 +132,8 @@ class GenericQueue(object): self.currentItem.name = self.queue_name + '-' + self.currentItem.name self.currentItem.start() + self.check_events() + class QueueItem(threading.Thread): def __init__(self, name, action_id=0): diff --git a/sickbeard/metadata/kodi.py b/sickbeard/metadata/kodi.py index 44dd1e0..c307bd8 100644 --- a/sickbeard/metadata/kodi.py +++ b/sickbeard/metadata/kodi.py @@ -421,5 +421,13 @@ class KODIMetadata(generic.GenericMetadata): cur_actor_thumb.text = '%s' % cur_actor_thumb_text +def set_nfo_uid_updated(*args, **kwargs): + from .. import db + if not db.DBConnection().has_flag('kodi_nfo_uid'): + db.DBConnection().set_flag('kodi_nfo_uid') + sickbeard.showQueueScheduler.action.remove_event(sickbeard.show_queue.DAILY_SHOW_UPDATE_FINISHED_EVENT, + set_nfo_uid_updated) + + # present a standard "interface" from the module metadata_class = KODIMetadata diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py index dd261eb..b6c3fa1 100644 --- a/sickbeard/show_queue.py +++ b/sickbeard/show_queue.py @@ -43,10 +43,22 @@ if False: from typing import AnyStr, Dict, List +DAILY_SHOW_UPDATE_FINISHED_EVENT = 1 + + class ShowQueue(generic_queue.GenericQueue): def __init__(self): generic_queue.GenericQueue.__init__(self) self.queue_name = 'SHOWQUEUE' + self.daily_update_running = False + if not db.DBConnection().has_flag('kodi_nfo_uid'): + self.add_event(DAILY_SHOW_UPDATE_FINISHED_EVENT, sickbeard.metadata.kodi.set_nfo_uid_updated) + + def check_events(self): + if self.daily_update_running and \ + not (self.isShowUpdateRunning() or sickbeard.showUpdateScheduler.action.amActive): + self.execute_events(DAILY_SHOW_UPDATE_FINISHED_EVENT) + self.daily_update_running = False def _isInQueue(self, show_obj, actions): # type: (TVShow, tuple) -> bool diff --git a/sickbeard/show_updater.py b/sickbeard/show_updater.py index 5a711fc..ed244f5 100644 --- a/sickbeard/show_updater.py +++ b/sickbeard/show_updater.py @@ -158,6 +158,9 @@ class ShowUpdater(object): except (exceptions_helper.CantUpdateException, exceptions_helper.CantRefreshException) as e: logger.log(u'Automatic update failed: ' + ex(e), logger.ERROR) + if len(pi_list): + sickbeard.showQueueScheduler.action.daily_update_running = True + ui.ProgressIndicators.setIndicator('dailyUpdate', ui.QueueProgressIndicator('Daily Update', pi_list)) logger.log(u'Added all shows to show queue for full update')