From c878c6d303c6463d559611b73910ac3c8f8b1f44 Mon Sep 17 00:00:00 2001 From: echel0n Date: Mon, 23 Jun 2014 20:25:20 -0700 Subject: [PATCH] Shows now perform a dirty check to confirm if any records have been altered before trying to save to the DB, improves overall performance and speed of sickrage. Browser does not get launched on restarts as a restarted check is performed now. --- SickBeard.py | 8 ++-- sickbeard/tv.py | 115 ++++++++++++++++++++++++++++++------------------ 2 files changed, 77 insertions(+), 46 deletions(-) diff --git a/SickBeard.py b/SickBeard.py index bcb9b6e0..e811e542 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -381,20 +381,20 @@ def main(): loadShowsFromDB() def startup(): - if sickbeard.restarted: - sickbeard.restarted = False - # Fire up all our threads sickbeard.start() # Launch browser if we're supposed to - if sickbeard.LAUNCH_BROWSER and not noLaunch and not sickbeard.DAEMON: + if sickbeard.LAUNCH_BROWSER and not noLaunch and not sickbeard.DAEMON and not sickbeard.restarted: sickbeard.launchBrowser(startPort) # Start an update if we're supposed to if forceUpdate or sickbeard.UPDATE_SHOWS_ON_START: sickbeard.showUpdateScheduler.action.run(force=True) # @UndefinedVariable + if sickbeard.restarted: + sickbeard.restarted = False + # create ioloop io_loop = IOLoop.current() diff --git a/sickbeard/tv.py b/sickbeard/tv.py index 24bea507..8221df84 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -53,42 +53,48 @@ from common import NAMING_DUPLICATE, NAMING_EXTEND, NAMING_LIMITED_EXTEND, NAMIN NAMING_LIMITED_EXTEND_E_PREFIXED +def dirty_setter(attr_name): + def wrapper(self, val): + if getattr(self, attr_name) != val: + setattr(self, attr_name, val) + self.dirty = True + + return wrapper + class TVShow(object): def __init__(self, indexer, indexerid, lang=""): - - self.indexerid = int(indexerid) - self.indexer = int(indexer) - self.name = "" + self._indexerid = int(indexerid) + self._indexer = int(indexer) + self._name = "" self._location = "" - self.imdbid = "" - self.network = "" - self.genre = "" - self.classification = "" - self.runtime = 0 - self.imdb_info = {} - self.quality = int(sickbeard.QUALITY_DEFAULT) - self.flatten_folders = int(sickbeard.FLATTEN_FOLDERS_DEFAULT) + self._imdbid = "" + self._network = "" + self._genre = "" + self._classification = "" + self._runtime = 0 + self._imdb_info = {} + self._quality = int(sickbeard.QUALITY_DEFAULT) + self._flatten_folders = int(sickbeard.FLATTEN_FOLDERS_DEFAULT) + self._status = "" + self._airs = "" + self._startyear = 0 + self._paused = 0 + self._air_by_date = 0 + self._subtitles = int(sickbeard.SUBTITLES_DEFAULT if sickbeard.SUBTITLES_DEFAULT else 0) + self._dvdorder = 0 + self._archive_firstmatch = 0 + self._lang = lang + self._last_update_indexer = 1 + self._sports = 0 + self._anime = 0 + self._scene = 0 + self._rls_ignore_words = "" + self._rls_require_words = "" - self.status = "" - self.airs = "" - self.startyear = 0 - self.paused = 0 - self.air_by_date = 0 - self.sports = 0 - self.subtitles = int(sickbeard.SUBTITLES_DEFAULT if sickbeard.SUBTITLES_DEFAULT else 0) - self.dvdorder = 0 - self.archive_firstmatch = 0 - self.lang = lang - self.last_update_indexer = 1 - self.anime = 0 - self.scene = 0 - - self.rls_ignore_words = "" - self.rls_require_words = "" + self.dirty = True self.lock = threading.Lock() - self._isDirGood = False - + self.isDirGood = False self.episodes = {} otherShow = helpers.findCertainShow(sickbeard.showList, self.indexerid) @@ -97,6 +103,34 @@ class TVShow(object): self.loadFromDB() + name = property(lambda self: self._name, dirty_setter("_name")) + indexerid = property(lambda self: self._indexerid, dirty_setter("_indexerid")) + indexer = property(lambda self: self._indexer, dirty_setter("_indexer")) + #location = property(lambda self: self._location, dirty_setter("_location")) + imdbid = property(lambda self: self._imdbid, dirty_setter("_imdbid")) + network = property(lambda self: self._network, dirty_setter("_network")) + genre = property(lambda self: self._genre, dirty_setter("_genre")) + classification = property(lambda self: self._classification, dirty_setter("_classification")) + runtime = property(lambda self: self._runtime, dirty_setter("_runtime")) + imdb_info = property(lambda self: self._imdb_info, dirty_setter("_imdb_info")) + quality = property(lambda self: self._quality, dirty_setter("_quality")) + flatten_folders = property(lambda self: self._flatten_folders, dirty_setter("_flatten_folders")) + status = property(lambda self: self._status, dirty_setter("_status")) + airs = property(lambda self: self._airs, dirty_setter("_airs")) + startyear = property(lambda self: self._startyear, dirty_setter("_startyear")) + paused = property(lambda self: self._paused, dirty_setter("_paused")) + air_by_date = property(lambda self: self._air_by_date, dirty_setter("_air_by_date")) + subtitles = property(lambda self: self._subtitles, dirty_setter("_subtitles")) + dvdorder = property(lambda self: self._dvdorder, dirty_setter("_dvdorder")) + archive_firstmatch = property(lambda self: self._archive_firstmatch, dirty_setter("_archive_firstmatch")) + lang = property(lambda self: self._lang, dirty_setter("_lang")) + last_update_indexer = property(lambda self: self._last_update_indexer, dirty_setter("_last_update_indexer")) + sports = property(lambda self: self._sports, dirty_setter("_sports")) + anime = property(lambda self: self._anime, dirty_setter("_anime")) + scene = property(lambda self: self._scene, dirty_setter("_scene")) + rls_ignore_words = property(lambda self: self._rls_ignore_words, dirty_setter("_rls_ignore_words")) + rls_require_words = property(lambda self: self._rls_require_words, dirty_setter("_rls_require_words")) + def _is_anime(self): if (self.anime > 0): return True @@ -139,7 +173,6 @@ class TVShow(object): self._isDirGood = True else: raise exceptions.NoNFOException("Invalid folder for the show!") - location = property(_getLocation, _setLocation) # delete references to anything that's not in the internal lists @@ -815,6 +848,9 @@ class TVShow(object): else: self.imdb_info = dict(zip(sqlResults[0].keys(), sqlResults[0])) + self.dirty = False + return True + def loadFromIndexer(self, cache=True, tvapi=None, cachedSeason=None): logger.log(str(self.indexerid) + u": Loading show info from " + sickbeard.indexerApi(self.indexer).name) @@ -1101,7 +1137,12 @@ class TVShow(object): return - def saveToDB(self): + def saveToDB(self, forceSave=False): + + if not self.dirty and not forceSave: + logger.log(str(self.indexerid) + u": Not saving show to db - record is not dirty", logger.DEBUG) + return + logger.log(str(self.indexerid) + u": Saving show info to database", logger.DEBUG) controlValueDict = {"indexer_id": self.indexerid} @@ -1262,16 +1303,6 @@ class TVShow(object): else: return Overview.GOOD - -def dirty_setter(attr_name): - def wrapper(self, val): - if getattr(self, attr_name) != val: - setattr(self, attr_name, val) - self.dirty = True - - return wrapper - - class TVEpisode(object): def __init__(self, show, season, episode, file=""): self._name = ""