From d536d43b6f78ef692c4996e7ca019898c114df68 Mon Sep 17 00:00:00 2001 From: echel0n Date: Fri, 5 Dec 2014 18:03:20 -0800 Subject: [PATCH] Fixed issue #954 - Default EP status now hardcoded with a default of SKIPPED. Fixed a issue that was causing show status to be set to NoneType randomly. Fixed misc comparisons that were causing improper code executions. Misc PEP8 coding fixes. --- sickbeard/show_queue.py | 2 +- sickbeard/tv.py | 149 ++++++++++++++++++---------------------- sickbeard/webserve.py | 4 +- 3 files changed, 70 insertions(+), 85 deletions(-) diff --git a/sickbeard/show_queue.py b/sickbeard/show_queue.py index f76b0491..465055be 100644 --- a/sickbeard/show_queue.py +++ b/sickbeard/show_queue.py @@ -294,8 +294,8 @@ class QueueItemAdd(ShowQueueItem): self.show.paused = self.paused if self.paused != None else False # set up default new/missing episode status - self.show.default_ep_status = self.default_status logger.log(u"Setting all episodes to the specified default status: " + str(self.show.default_ep_status)) + self.show.default_ep_status = self.default_status # be smartish about this if self.show.genre and "talk show" in self.show.genre.lower(): diff --git a/sickbeard/tv.py b/sickbeard/tv.py index c64adfce..fa388e14 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -87,7 +87,7 @@ class TVShow(object): self._startyear = 0 self._paused = 0 self._air_by_date = 0 - self._subtitles = int(sickbeard.SUBTITLES_DEFAULT if sickbeard.SUBTITLES_DEFAULT else 0) + self._subtitles = int(sickbeard.SUBTITLES_DEFAULT) self._dvdorder = 0 self._archive_firstmatch = 0 self._lang = lang @@ -97,7 +97,7 @@ class TVShow(object): self._scene = 0 self._rls_ignore_words = "" self._rls_require_words = "" - self._default_ep_status = "" + self._default_ep_status = SKIPPED self.dirty = True self._location = "" @@ -216,19 +216,21 @@ class TVShow(object): ep_list = [] for cur_result in results: cur_ep = self.getEpisode(int(cur_result["season"]), int(cur_result["episode"])) - if cur_ep: - cur_ep.relatedEps = [] - if cur_ep.location: - # if there is a location, check if it's a multi-episode (share_location > 0) and put them in relatedEps - if cur_result["share_location"] > 0: - related_eps_result = myDB.select( - "SELECT * FROM tv_episodes WHERE showid = ? AND season = ? AND location = ? AND episode != ? ORDER BY episode ASC", - [self.indexerid, cur_ep.season, cur_ep.location, cur_ep.episode]) - for cur_related_ep in related_eps_result: - related_ep = self.getEpisode(int(cur_related_ep["season"]), int(cur_related_ep["episode"])) - if related_ep not in cur_ep.relatedEps: - cur_ep.relatedEps.append(related_ep) - ep_list.append(cur_ep) + if not cur_ep: + continue + + cur_ep.relatedEps = [] + if cur_ep.location: + # if there is a location, check if it's a multi-episode (share_location > 0) and put them in relatedEps + if cur_result["share_location"] > 0: + related_eps_result = myDB.select( + "SELECT * FROM tv_episodes WHERE showid = ? AND season = ? AND location = ? AND episode != ? ORDER BY episode ASC", + [self.indexerid, cur_ep.season, cur_ep.location, cur_ep.episode]) + for cur_related_ep in related_eps_result: + related_ep = self.getEpisode(int(cur_related_ep["season"]), int(cur_related_ep["episode"])) + if related_ep and related_ep not in cur_ep.relatedEps: + cur_ep.relatedEps.append(related_ep) + ep_list.append(cur_ep) return ep_list @@ -279,16 +281,8 @@ class TVShow(object): def should_update(self, update_date=datetime.date.today()): - cur_indexerid = self.indexerid - - # In some situations self.status = None.. need to figure out where that is! - #if not self.status: - # self.status = '' - # logger.log("Status missing for showid: [%s] with status: [%s]" % - # (cur_indexerid, self.status), logger.DEBUG) - - # if show is not 'Ended' always update (status 'Continuing' or '') - if 'Ended' not in self.status: + # if show is not 'Ended' always update (status 'Continuing') + if not self.status or 'Ended' not in self.status: return True # run logic against the current show latest aired and next unaired data to see if we should bypass 'Ended' status @@ -301,7 +295,7 @@ class TVShow(object): myDB = db.DBConnection() sql_result = myDB.select( "SELECT * FROM tv_episodes WHERE showid = ? AND season > '0' AND airdate > '1' AND status > '1' ORDER BY airdate DESC LIMIT 1", - [cur_indexerid]) + [self.indexerid]) if sql_result: last_airdate = datetime.date.fromordinal(sql_result[0]['airdate']) @@ -311,7 +305,7 @@ class TVShow(object): # get next upcoming UNAIRED episode to compare against today + graceperiod sql_result = myDB.select( "SELECT * FROM tv_episodes WHERE showid = ? AND season > '0' AND airdate > '1' AND status = '1' ORDER BY airdate ASC LIMIT 1", - [cur_indexerid]) + [self.indexerid]) if sql_result: next_airdate = datetime.date.fromordinal(sql_result[0]['airdate']) @@ -369,6 +363,9 @@ class TVShow(object): logger.log(str(self.indexerid) + u": Retrieving/creating episode " + str(epResult["season"]) + "x" + str( epResult["episode"]), logger.DEBUG) curEp = self.getEpisode(epResult["season"], epResult["episode"]) + if not curEp: + continue + curEp.createMetaFiles() @@ -502,6 +499,8 @@ class TVShow(object): try: curEp = self.getEpisode(curSeason, curEpisode) + if not curEp: + raise exceptions.EpisodeNotFoundException # if we found out that the ep is no longer on TVDB then delete it from our database too if deleteEp: @@ -553,6 +552,8 @@ class TVShow(object): continue try: ep = self.getEpisode(season, episode) + if not ep: + raise exceptions.EpisodeNotFoundException except exceptions.EpisodeNotFoundException: logger.log( str(self.indexerid) + ": " + sickbeard.indexerApi(self.indexer).name + " object for " + str( @@ -644,11 +645,13 @@ class TVShow(object): checkQualityAgain = False same_file = False - curEp = self.getEpisode(season, episode) - if curEp == None: + curEp = self.getEpisode(season, episode) + if not curEp: try: curEp = self.getEpisode(season, episode, file) + if not curEp: + raise exceptions.EpisodeNotFoundException except exceptions.EpisodeNotFoundException: logger.log(str(self.indexerid) + u": Unable to figure out what this file is, skipping", logger.ERROR) @@ -677,11 +680,13 @@ class TVShow(object): rootEp = curEp else: if curEp not in rootEp.relatedEps: - rootEp.relatedEps.append(curEp) + with rootEp.lock: + rootEp.relatedEps.append(curEp) # if it's a new file then if not same_file: - curEp.release_name = '' + with curEp.lock: + curEp.release_name = '' # if they replace a file on me I'll make some attempt at re-checking the quality unless I know it's the same file if checkQualityAgain and not same_file: @@ -689,7 +694,8 @@ class TVShow(object): logger.log(u"Since this file has been renamed, I checked " + file + " and found quality " + Quality.qualityStrings[newQuality], logger.DEBUG) if newQuality != Quality.UNKNOWN: - curEp.status = Quality.compositeStatus(DOWNLOADED, newQuality) + with curEp.lock: + curEp.status = Quality.compositeStatus(DOWNLOADED, newQuality) # check for status/quality changes as long as it's a new file @@ -736,7 +742,7 @@ class TVShow(object): # creating metafiles on the root should be good enough - if sickbeard.USE_FAILED_DOWNLOADS and rootEp is not None: + if rootEp: with rootEp.lock: rootEp.createMetaFiles() @@ -755,64 +761,38 @@ class TVShow(object): logger.log(str(self.indexerid) + ": Unable to find the show in the database") return else: - if not self.indexer: - self.indexer = int(sqlResults[0]["indexer"]) + self.indexer = int(sqlResults[0]["indexer"] or 0) + if not self.name: self.name = sqlResults[0]["show_name"] if not self.network: self.network = sqlResults[0]["network"] if not self.genre: self.genre = sqlResults[0]["genre"] - if self.classification is None: + if not self.classification: self.classification = sqlResults[0]["classification"] self.runtime = sqlResults[0]["runtime"] self.status = sqlResults[0]["status"] - if not self.status: + if self.status is None: self.status = "" self.airs = sqlResults[0]["airs"] - if not self.airs: + if self.airs is None: self.airs = "" - self.startyear = sqlResults[0]["startyear"] - if not self.startyear: - self.startyear = 0 - - self.air_by_date = sqlResults[0]["air_by_date"] - if not self.air_by_date: - self.air_by_date = 0 - - self.anime = sqlResults[0]["anime"] - if self.anime == None: - self.anime = 0 - - self.sports = sqlResults[0]["sports"] - if not self.sports: - self.sports = 0 - - self.scene = sqlResults[0]["scene"] - if not self.scene: - self.scene = 0 - - self.subtitles = sqlResults[0]["subtitles"] - if self.subtitles: - self.subtitles = 1 - else: - self.subtitles = 0 - - self.dvdorder = sqlResults[0]["dvdorder"] - if not self.dvdorder: - self.dvdorder = 0 - - self.archive_firstmatch = sqlResults[0]["archive_firstmatch"] - if not self.archive_firstmatch: - self.archive_firstmatch = 0 - - self.quality = int(sqlResults[0]["quality"]) - self.flatten_folders = int(sqlResults[0]["flatten_folders"]) - self.paused = int(sqlResults[0]["paused"]) + self.startyear = int(sqlResults[0]["startyear"] or 0) + self.air_by_date = int(sqlResults[0]["air_by_date"] or 0) + self.anime = int(sqlResults[0]["anime"] or 0) + self.sports = int(sqlResults[0]["sports"] or 0) + self.scene = int(sqlResults[0]["scene"] or 0) + self.subtitles = int(sqlResults[0]["subtitles"] or 0) + self.dvdorder = int(sqlResults[0]["dvdorder"] or 0) + self.archive_firstmatch = int(sqlResults[0]["archive_firstmatch"] or 0) + self.quality = int(sqlResults[0]["quality"] or UNKNOWN) + self.flatten_folders = int(sqlResults[0]["flatten_folders"] or 0) + self.paused = int(sqlResults[0]["paused"] or 0) try: self.location = sqlResults[0]["location"] @@ -828,9 +808,7 @@ class TVShow(object): self.rls_ignore_words = sqlResults[0]["rls_ignore_words"] self.rls_require_words = sqlResults[0]["rls_require_words"] - self.default_ep_status = sqlResults[0]["default_ep_status"] - if not self.default_ep_status: - self.default_ep_status = "" + self.default_ep_status = int(sqlResults[0]["default_ep_status"] or SKIPPED) if not self.imdbid: self.imdbid = sqlResults[0]["imdb_id"] @@ -889,6 +867,9 @@ class TVShow(object): if getattr(myEp, 'airs_dayofweek', None) is not None and getattr(myEp, 'airs_time', None) is not None: self.airs = myEp["airs_dayofweek"] + " " + myEp["airs_time"] + if self.airs is None: + self.airs = '' + if getattr(myEp, 'firstaired', None) is not None: self.startyear = int(str(myEp["firstaired"]).split('-')[0]) @@ -1076,6 +1057,8 @@ class TVShow(object): try: curEp = self.getEpisode(season, episode) + if not curEp: + raise exceptions.EpisodeDeletedException except exceptions.EpisodeDeletedException: logger.log(u"The episode was deleted while we were refreshing it, moving on to the next one", logger.DEBUG) @@ -1106,7 +1089,8 @@ class TVShow(object): else: # the file exists, set its modify file stamp if sickbeard.AIRDATE_EPISODES: - curEp.airdateModifyStamp() + with curEp.lock: + curEp.airdateModifyStamp() if len(sql_l) > 0: myDB = db.DBConnection() @@ -1747,9 +1731,12 @@ class TVEpisode(object): # if we don't have the file and the airdate is in the past else: if self.status == UNAIRED: - self.status = WANTED + if self.season > 0: + self.status = WANTED + else: + self.status = SKIPPED - # if we somehow are still UNKNOWN then just use the shows defined default status + # if we somehow are still UNKNOWN then just use the shows defined default status or SKIPPED elif self.status == UNKNOWN: self.status = self.show.default_ep_status diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 8b4c6a48..dfda0aee 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -4160,15 +4160,13 @@ class Home(MainHandler): try: sickbeard.showQueueScheduler.action.updateShow(showObj, bool(force)) # @UndefinedVariable except exceptions.CantUpdateException, e: - ui.notifications.error("Unable to update this show.", - ex(e)) + ui.notifications.error("Unable to update this show.", ex(e)) # just give it some time time.sleep(cpu_presets[sickbeard.CPU_PRESET]) redirect("/home/displayShow?show=" + str(showObj.indexerid)) - def subtitleShow(self, show=None, force=0): if show is None: