From 05dcdd72d7771775034f22b07c49c660b48db1a1 Mon Sep 17 00:00:00 2001 From: echel0n Date: Fri, 6 Jun 2014 16:55:14 -0700 Subject: [PATCH 1/3] Fix for air-by-date/sports/anime provider searches --- sickbeard/providers/btn.py | 9 ++++---- sickbeard/providers/ezrss.py | 12 ++++++++--- sickbeard/providers/hdbits.py | 31 ++++++++++++++++++++++----- sickbeard/providers/hdtorrents.py | 9 +++++++- sickbeard/providers/iptorrents.py | 9 +++++++- sickbeard/providers/kat.py | 33 ++++++++++++++--------------- sickbeard/providers/nextgen.py | 9 +++++++- sickbeard/providers/scc.py | 9 +++++++- sickbeard/providers/speedcd.py | 9 +++++++- sickbeard/providers/thepiratebay.py | 33 +++++++++++++++++------------ sickbeard/providers/torrentday.py | 10 ++++++++- sickbeard/providers/torrentleech.py | 9 +++++++- 12 files changed, 132 insertions(+), 50 deletions(-) diff --git a/sickbeard/providers/btn.py b/sickbeard/providers/btn.py index 66e6bbb4..1445eac8 100644 --- a/sickbeard/providers/btn.py +++ b/sickbeard/providers/btn.py @@ -219,8 +219,7 @@ class BTNProvider(generic.TorrentProvider): # Search for the year of the air by date show whole_season_params['name'] = str(ep_obj.airdate).split('-')[0] elif ep_obj.show.is_anime: - whole_season_params['name'] = 'S' + str(ep_obj.scene_season) - #whole_season_params['name'] = "%d" % ep_obj.scene_absolute_number + whole_season_params['name'] = "%d" % ep_obj.scene_absolute_number else: whole_season_params['name'] = 'Season ' + str(ep_obj.scene_season) @@ -253,8 +252,10 @@ class BTNProvider(generic.TorrentProvider): # BTN uses dots in dates, we just search for the date since that # combined with the series identifier should result in just one episode - search_params['name'] = date_str.replace('-', '.') - elif not self.show.is_anime: + search_params['name'] = ep_obj.airdate.strftime('%b') + elif self.show.anime: + search_params['name'] = "%i" % int(ep_obj.scene_absolute_number) + else: # Do a general name search for the episode, formatted like SXXEYY search_params['name'] = "S%02dE%02d" % (ep_obj.scene_season, ep_obj.scene_episode) diff --git a/sickbeard/providers/ezrss.py b/sickbeard/providers/ezrss.py index 9da51227..316f83e0 100644 --- a/sickbeard/providers/ezrss.py +++ b/sickbeard/providers/ezrss.py @@ -81,8 +81,12 @@ class EZRSSProvider(generic.TorrentProvider): params['show_name'] = helpers.sanitizeSceneName(self.show.name, ezrss=True).replace('.', ' ').encode('utf-8') - if ep_obj.show.air_by_date or ep_obj.show.sports: - params['season'] = str(ep_obj.airdate).split('-')[0] + if ep_obj.show.air_by_date: + params['date'] = str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.sports: + params['date'] = str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.anime: + params['season'] = "%d" % ep_obj.scene_absolute_number else: params['season'] = ep_obj.scene_season @@ -99,8 +103,10 @@ class EZRSSProvider(generic.TorrentProvider): if self.show.air_by_date: params['date'] = str(ep_obj.airdate) - if self.show.sports: + elif self.show.sports: params['date'] = str(ep_obj.airdate) + elif self.show.anime: + params['episode'] = "%i" % int(ep_obj.scene_absolute_number) else: params['season'] = ep_obj.scene_season params['episode'] = ep_obj.scene_episode diff --git a/sickbeard/providers/hdbits.py b/sickbeard/providers/hdbits.py index 925bff1c..ab5829c1 100644 --- a/sickbeard/providers/hdbits.py +++ b/sickbeard/providers/hdbits.py @@ -158,11 +158,27 @@ class HDBitsProvider(generic.TorrentProvider): } if episode: - post_data['tvdb'] = { - 'id': show.indexerid, - 'season': episode.scene_season, - 'episode': episode.scene_episode - } + if show.air_by_date: + post_data['tvdb'] = { + 'id': show.indexerid, + 'episode': str(episode.airdate).replace('-', '|') + } + elif show.sports: + post_data['tvdb'] = { + 'id': show.indexerid, + 'episode': episode.airdate.strftime('%b') + } + elif show.anime: + post_data['tvdb'] = { + 'id': show.indexerid, + 'episode': "%i" % int(episode.scene_absolute_number) + } + else: + post_data['tvdb'] = { + 'id': show.indexerid, + 'season': episode.scene_season, + 'episode': episode.scene_episode + } if season: if show.air_by_date or show.sports: @@ -170,6 +186,11 @@ class HDBitsProvider(generic.TorrentProvider): 'id': show.indexerid, 'season': str(episode.airdate)[:7], } + elif show.anime: + post_data['tvdb'] = { + 'id': show.indexerid, + 'season': "%d" % episode.scene_absolute_number, + } else: post_data['tvdb'] = { 'id': show.indexerid, diff --git a/sickbeard/providers/hdtorrents.py b/sickbeard/providers/hdtorrents.py index 5de98cae..03fbc45d 100644 --- a/sickbeard/providers/hdtorrents.py +++ b/sickbeard/providers/hdtorrents.py @@ -125,7 +125,9 @@ class HDTorrentsProvider(generic.TorrentProvider): search_string = {'Season': []} for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + str(ep_obj.airdate).split('-')[0] + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number else: ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX @@ -151,6 +153,11 @@ class HDTorrentsProvider(generic.TorrentProvider): str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) + elif self.show.anime: + for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + ' ' + \ + "%i" % int(ep_obj.scene_absolute_number) + search_string['Episode'].append(ep_string) else: for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): ep_string = show_name_helpers.sanitizeSceneName(show_name) + ' ' + \ diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py index 37afda01..e6e50bdc 100644 --- a/sickbeard/providers/iptorrents.py +++ b/sickbeard/providers/iptorrents.py @@ -102,7 +102,9 @@ class IPTorrentsProvider(generic.TorrentProvider): search_string = {'Season': []} for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + str(ep_obj.airdate).split('-')[0] + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number else: ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX @@ -128,6 +130,11 @@ class IPTorrentsProvider(generic.TorrentProvider): str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) + elif self.show.anime: + for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + ' ' + \ + "%i" % int(ep_obj.scene_absolute_number) + search_string['Episode'].append(ep_string) else: for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): ep_string = show_name_helpers.sanitizeSceneName(show_name) + ' ' + \ diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index 6bd2aec3..a27f8af6 100644 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -174,23 +174,22 @@ class KATProvider(generic.TorrentProvider): def _get_season_search_strings(self, ep_obj): search_string = {'Season': []} - if not (ep_obj.show.air_by_date or ep_obj.show.sports): - for show_name in set(allPossibleShowNames(self.show)): - if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] - search_string['Season'].append(ep_string) - ep_string = show_name + ' Season ' + str(ep_obj.airdate).split('-')[0] - search_string['Season'].append(ep_string) - elif ep_obj.show.anime: - ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number - search_string['Season'].append(ep_string) - else: - ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) + ' -S%02d' % int( - ep_obj.scene_season) + 'E' + ' category:tv' #1) showName SXX -SXXE - search_string['Season'].append(ep_string) - ep_string = show_name + ' Season ' + str( - ep_obj.scene_season) + ' -Ep*' + ' category:tv' # 2) showName Season X - search_string['Season'].append(ep_string) + for show_name in set(allPossibleShowNames(self.show)): + if ep_obj.show.air_by_date or ep_obj.show.sports: + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + search_string['Season'].append(ep_string) + ep_string = show_name + ' Season ' + str(ep_obj.airdate).split('-')[0] + search_string['Season'].append(ep_string) + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number + search_string['Season'].append(ep_string) + else: + ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) + ' -S%02d' % int( + ep_obj.scene_season) + 'E' + ' category:tv' #1) showName SXX -SXXE + search_string['Season'].append(ep_string) + ep_string = show_name + ' Season ' + str( + ep_obj.scene_season) + ' -Ep*' + ' category:tv' # 2) showName Season X + search_string['Season'].append(ep_string) return [search_string] diff --git a/sickbeard/providers/nextgen.py b/sickbeard/providers/nextgen.py index c988c827..41fdbfa6 100644 --- a/sickbeard/providers/nextgen.py +++ b/sickbeard/providers/nextgen.py @@ -141,7 +141,9 @@ class NextGenProvider(generic.TorrentProvider): search_string = {'Season': []} for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + str(ep_obj.airdate).split('-')[0] + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number else: ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX @@ -167,6 +169,11 @@ class NextGenProvider(generic.TorrentProvider): str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) + elif self.show.anime: + for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + ' ' + \ + "%i" % int(ep_obj.scene_absolute_number) + search_string['Episode'].append(ep_string) else: for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): ep_string = show_name_helpers.sanitizeSceneName(show_name) + ' ' + \ diff --git a/sickbeard/providers/scc.py b/sickbeard/providers/scc.py index 7d7c9110..188b6c31 100644 --- a/sickbeard/providers/scc.py +++ b/sickbeard/providers/scc.py @@ -112,7 +112,9 @@ class SCCProvider(generic.TorrentProvider): search_string = {'Season': []} for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + str(ep_obj.airdate).split('-')[0] + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number else: ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX @@ -138,6 +140,11 @@ class SCCProvider(generic.TorrentProvider): str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) + elif self.show.anime: + for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + ' ' + \ + "%i" % int(ep_obj.scene_absolute_number) + search_string['Episode'].append(ep_string) else: for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): ep_string = show_name_helpers.sanitizeSceneName(show_name) + ' ' + \ diff --git a/sickbeard/providers/speedcd.py b/sickbeard/providers/speedcd.py index b42406c9..52e18dd4 100644 --- a/sickbeard/providers/speedcd.py +++ b/sickbeard/providers/speedcd.py @@ -102,7 +102,9 @@ class SpeedCDProvider(generic.TorrentProvider): search_string = {'Season': []} for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + str(ep_obj.airdate).split('-')[0] + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number else: ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX @@ -128,6 +130,11 @@ class SpeedCDProvider(generic.TorrentProvider): str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) + elif self.show.anime: + for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + ' ' + \ + "%i" % int(ep_obj.scene_absolute_number) + search_string['Episode'].append(ep_string) else: for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): ep_string = show_name_helpers.sanitizeSceneName(show_name) + ' ' + \ diff --git a/sickbeard/providers/thepiratebay.py b/sickbeard/providers/thepiratebay.py index 3b1c56c9..d3e58fa2 100644 --- a/sickbeard/providers/thepiratebay.py +++ b/sickbeard/providers/thepiratebay.py @@ -167,17 +167,22 @@ class ThePirateBayProvider(generic.TorrentProvider): def _get_season_search_strings(self, ep_obj): search_string = {'Season': []} - for show_name in set(allPossibleShowNames(self.show)) if not (ep_obj.show.air_by_date or ep_obj.show.sports) else []: - if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + str(ep_obj.airdate).split('-')[0] - else: - ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX - search_string['Season'].append(ep_string) - + for show_name in set(allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + search_string['Season'].append(ep_string) ep_string = show_name + ' Season ' + str(ep_obj.airdate).split('-')[0] + search_string['Season'].append(ep_string) + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number + search_string['Season'].append(ep_string) else: - ep_string = show_name + ' Season ' + str(ep_obj.scene_season) + ' -Ep*' #2) showName Season X + ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) + ' -S%02d' % int( + ep_obj.scene_season) + 'E' + ' category:tv' #1) showName SXX -SXXE + search_string['Season'].append(ep_string) + ep_string = show_name + ' Season ' + str( + ep_obj.scene_season) + ' -Ep*' + ' category:tv' # 2) showName Season X + search_string['Season'].append(ep_string) search_string['Season'].append(ep_string) @@ -198,18 +203,18 @@ class ThePirateBayProvider(generic.TorrentProvider): str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) + elif self.show.anime: + for show_name in set(allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + ' ' + \ + "%i" % int(ep_obj.scene_absolute_number) + search_string['Episode'].append(ep_string) else: for show_name in set(allPossibleShowNames(self.show)): ep_string = sanitizeSceneName(show_name) + ' ' + \ sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep_obj.scene_season, 'episodenumber': ep_obj.scene_episode} + '|' + \ sickbeard.config.naming_ep_type[0] % {'seasonnumber': ep_obj.scene_season, - 'episodenumber': ep_obj.scene_episode} + '|' + \ - sickbeard.config.naming_ep_type[3] % {'seasonnumber': ep_obj.scene_season, - 'episodenumber': ep_obj.scene_episode} - - ep_string += ' %s' % add_string - + 'episodenumber': ep_obj.scene_episode} + ' %s' % add_string search_string['Episode'].append(re.sub('\s+', ' ', ep_string)) return [search_string] diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py index 48660d10..01d878d0 100644 --- a/sickbeard/providers/torrentday.py +++ b/sickbeard/providers/torrentday.py @@ -133,7 +133,10 @@ class TorrentDayProvider(generic.TorrentProvider): search_string = {'Season': []} for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + str(ep_obj.airdate).split('-')[0] + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number + search_string['Season'].append(ep_string) else: ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX @@ -159,6 +162,11 @@ class TorrentDayProvider(generic.TorrentProvider): str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) + elif self.show.anime: + for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + ' ' + \ + "%i" % int(ep_obj.scene_absolute_number) + search_string['Episode'].append(ep_string) else: for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): ep_string = show_name_helpers.sanitizeSceneName(show_name) + ' ' + \ diff --git a/sickbeard/providers/torrentleech.py b/sickbeard/providers/torrentleech.py index db694040..7f586b2d 100644 --- a/sickbeard/providers/torrentleech.py +++ b/sickbeard/providers/torrentleech.py @@ -107,7 +107,9 @@ class TorrentLeechProvider(generic.TorrentProvider): search_string = {'Season': []} for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + str(ep_obj.airdate).split('-')[0] + ep_string = show_name + ' ' + str(ep_obj.airdate).split('-')[0] + elif ep_obj.show.anime: + ep_string = show_name + ' ' + "%d" % ep_obj.scene_absolute_number else: ep_string = show_name + ' S%02d' % int(ep_obj.scene_season) #1) showName SXX @@ -133,6 +135,11 @@ class TorrentLeechProvider(generic.TorrentProvider): str(ep_obj.airdate).replace('-', '|') + '|' + \ ep_obj.airdate.strftime('%b') search_string['Episode'].append(ep_string) + elif self.show.anime: + for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + ' ' + \ + "%i" % int(ep_obj.scene_absolute_number) + search_string['Episode'].append(ep_string) else: for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): ep_string = show_name_helpers.sanitizeSceneName(show_name) + ' ' + \ From 64b857ee57ee65e5547143ad428186a74632b24a Mon Sep 17 00:00:00 2001 From: echel0n Date: Fri, 6 Jun 2014 17:06:29 -0700 Subject: [PATCH 2/3] Fixed failed download handling. --- sickbeard/search_queue.py | 41 ++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/sickbeard/search_queue.py b/sickbeard/search_queue.py index d932bd0b..1eb53157 100644 --- a/sickbeard/search_queue.py +++ b/sickbeard/search_queue.py @@ -216,34 +216,35 @@ class FailedQueueItem(generic_queue.QueueItem): for season, episodes in self.segment.items(): for epObj in episodes: + logger.log(u"Marking episode as bad: [" + epObj.prettyName() + "]") + failed_history.markFailed(epObj) + (release, provider) = failed_history.findRelease(epObj) if release: - logger.log(u"Marking release as bad: " + release) - failed_history.markFailed(epObj) failed_history.logFailed(release) history.logFailed(epObj, release, provider) - failed_history.revertEpisode(epObj) - logger.log( - "Beginning failed download search for [" + epObj.prettyName() + "]") - try: - searchResult = search.searchProviders(self.show, season, [epObj], True) + failed_history.revertEpisode(epObj) + logger.log("Beginning failed download search for [" + epObj.prettyName() + "]") - # reset thread back to original name - threading.currentThread().name = self.thread_name + try: + searchResult = search.searchProviders(self.show, season, [epObj], True) - if searchResult: - for result in searchResult: - # just use the first result for now - logger.log(u"Downloading " + result.name + " from " + result.provider.name) - search.snatchEpisode(result) + # reset thread back to original name + threading.currentThread().name = self.thread_name - # give the CPU a break - time.sleep(common.cpu_presets[sickbeard.CPU_PRESET]) + if searchResult: + for result in searchResult: + # just use the first result for now + logger.log(u"Downloading " + result.name + " from " + result.provider.name) + search.snatchEpisode(result) - else: - logger.log(u"No valid episode found to retry for [" + epObj.prettyName() + "]") - except Exception, e: - logger.log(traceback.format_exc(), logger.DEBUG) + # give the CPU a break + time.sleep(common.cpu_presets[sickbeard.CPU_PRESET]) + + else: + logger.log(u"No valid episode found to retry for [" + epObj.prettyName() + "]") + except Exception, e: + logger.log(traceback.format_exc(), logger.DEBUG) self.finish() \ No newline at end of file From 08159e28722d4836f17c97b6f897103707a14985 Mon Sep 17 00:00:00 2001 From: echel0n Date: Fri, 6 Jun 2014 17:44:44 -0700 Subject: [PATCH 3/3] Updated post-process code. --- sickbeard/processTV.py | 126 +++++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 56 deletions(-) diff --git a/sickbeard/processTV.py b/sickbeard/processTV.py index ba4ccd09..e57fba5c 100644 --- a/sickbeard/processTV.py +++ b/sickbeard/processTV.py @@ -37,6 +37,64 @@ from lib.unrar2 import RarFile, RarInfo from lib.unrar2.rar_exceptions import * +def delete_folder(folder, check_empty=True): + + # check if it's a folder + if not ek.ek(os.path.isdir, folder): + return False + + # check if it isn't TV_DOWNLOAD_DIR + if sickbeard.TV_DOWNLOAD_DIR: + if helpers.real_path(folder) == helpers.real_path(sickbeard.TV_DOWNLOAD_DIR): + return False + + # check if it's empty folder when wanted checked + if check_empty: + check_files = ek.ek(os.listdir, folder) + if check_files: + return False + + # try deleting folder + try: + logger.log(u"Deleting folder: " + folder) + shutil.rmtree(folder) + except (OSError, IOError), e: + logger.log(u"Warning: unable to delete folder: " + folder + ": " + ex(e), logger.WARNING) + return False + + return True + +def delete_files(processPath, notwantedFiles): + global returnStr, process_result + + if not process_result: + return + + #Delete all file not needed + for cur_file in notwantedFiles: + + cur_file_path = ek.ek(os.path.join, processPath, cur_file) + + if not ek.ek(os.path.isfile, cur_file_path): + continue #Prevent error when a notwantedfiles is an associated files + + returnStr += logHelper(u"Deleting file " + cur_file, logger.DEBUG) + + #check first the read-only attribute + file_attribute = ek.ek(os.stat, cur_file_path)[0] + if (not file_attribute & stat.S_IWRITE): + # File is read-only, so make it writeable + returnStr += logHelper(u"Changing ReadOnly Flag for file " + cur_file, logger.DEBUG) + try: + ek.ek(os.chmod, cur_file_path, stat.S_IWRITE) + except OSError, e: + returnStr += logHelper(u"Cannot change permissions of " + cur_file_path + ': ' + str(e.strerror), + logger.DEBUG) + try: + ek.ek(os.remove, cur_file_path) + except OSError, e: + returnStr += logHelper(u"Unable to delete file " + cur_file + ': ' + str(e.strerror), logger.DEBUG) + def logHelper(logMessage, logLevel=logger.MESSAGE): logger.log(logMessage, logLevel) return logMessage + u"\n" @@ -106,13 +164,13 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior #Don't Link media when the media is extracted from a rar in the same path if process_method in ('hardlink', 'symlink') and videoInRar: - process_media(path, videoInRar, nzbName, 'move', force, is_priority) + process_result = process_media(path, videoInRar, nzbName, 'move', force, is_priority) delete_files(path, rarContent) for video in set(videoFiles) - set(videoInRar): - process_media(path, [video], nzbName, process_method, force, is_priority) + process_result = process_media(path, [video], nzbName, process_method, force, is_priority) else: for video in videoFiles: - process_media(path, [video], nzbName, process_method, force, is_priority) + process_result = process_media(path, [video], nzbName, process_method, force, is_priority) #Process Video File in all TV Subdir for dir in [x for x in dirs if validateDir(path, x, nzbNameOriginal, failed)]: @@ -147,8 +205,8 @@ def processDir(dirName, nzbName=None, process_method=None, force=False, is_prior if process_method == "move" and \ ek.ek(os.path.normpath, processPath) != ek.ek(os.path.normpath, sickbeard.TV_DOWNLOAD_DIR): - if processPath != sickbeard.TV_DOWNLOAD_DIR: - delete_dir(processPath) + if delete_folder(processPath, check_empty=False): + returnStr += logHelper(u"Deleted folder: " + processPath, logger.DEBUG) if process_result: returnStr += logHelper(u"Successfully processed") @@ -320,6 +378,7 @@ def already_postprocessed(dirName, videofile, force): def process_media(processPath, videoFiles, nzbName, process_method, force, is_priority): global process_result, returnStr + processor = None for cur_video_file in videoFiles: if already_postprocessed(processPath, cur_video_file, force): @@ -335,7 +394,8 @@ def process_media(processPath, videoFiles, nzbName, process_method, force, is_pr process_result = False process_fail_message = ex(e) - returnStr += processor.log + if processor: + returnStr += processor.log if process_result: returnStr += logHelper(u"Processing succeeded for " + cur_video_file_path) @@ -347,57 +407,10 @@ def process_media(processPath, videoFiles, nzbName, process_method, force, is_pr if not process_result: break - -def delete_files(processPath, notwantedFiles): - global returnStr, process_result - - if not process_result: - return - - #Delete all file not needed - for cur_file in notwantedFiles: - - cur_file_path = ek.ek(os.path.join, processPath, cur_file) - - if not ek.ek(os.path.isfile, cur_file_path): - continue #Prevent error when a notwantedfiles is an associated files - - returnStr += logHelper(u"Deleting file " + cur_file, logger.DEBUG) - - #check first the read-only attribute - file_attribute = ek.ek(os.stat, cur_file_path)[0] - if (not file_attribute & stat.S_IWRITE): - # File is read-only, so make it writeable - returnStr += logHelper(u"Changing ReadOnly Flag for file " + cur_file, logger.DEBUG) - try: - ek.ek(os.chmod, cur_file_path, stat.S_IWRITE) - except OSError, e: - returnStr += logHelper(u"Cannot change permissions of " + cur_file_path + ': ' + str(e.strerror), - logger.DEBUG) - try: - ek.ek(os.remove, cur_file_path) - except OSError, e: - returnStr += logHelper(u"Unable to delete file " + cur_file + ': ' + str(e.strerror), logger.DEBUG) - - -def delete_dir(processPath): - global returnStr - - if not ek.ek(os.listdir, processPath) == []: - returnStr += logHelper( - u"Skipping Deleting folder " + processPath + ' because some files was not deleted/processed', logger.DEBUG) - return - - returnStr += logHelper(u"Deleting folder " + processPath, logger.DEBUG) - - try: - shutil.rmtree(processPath) - except (OSError, IOError), e: - returnStr += logHelper(u"Warning: unable to remove the folder " + processPath + ": " + ex(e), logger.WARNING) - - def get_path_dir_files(dirName, nzbName, type): path = "" + dirs = [] + files = [] if dirName == sickbeard.TV_DOWNLOAD_DIR and not nzbName or type == "manual": #Scheduled Post Processing Active #Get at first all the subdir in the dirName @@ -436,7 +449,8 @@ def process_failed(dirName, nzbName): returnStr += processor.log if sickbeard.DELETE_FAILED and process_result: - delete_dir(dirName) + if delete_folder(dirName, check_empty=False): + returnStr += logHelper(u"Deleted folder: " + dirName, logger.DEBUG) if process_result: returnStr += logHelper(u"Failed Download Processing succeeded: (" + str(nzbName) + ", " + dirName + ")")