From f302ef3d770a9400ae7b7fd101539136d89e1c84 Mon Sep 17 00:00:00 2001 From: echel0n Date: Sat, 13 Dec 2014 09:09:05 -0800 Subject: [PATCH] Fixed more issues with mass editing of shows and episode status editing. --- sickbeard/webserve.py | 339 +++++++++++++++++++++++++----------------- 1 file changed, 203 insertions(+), 136 deletions(-) diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 7c68412a..06518b99 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -24,7 +24,6 @@ import time import urllib import re import datetime -import urlparse import sickbeard from sickbeard import config, sab @@ -79,6 +78,7 @@ from concurrent.futures import ThreadPoolExecutor route_locks = {} + class PageTemplate(Template): def __init__(self, rh, *args, **kwargs): kwargs['file'] = os.path.join(sickbeard.PROG_DIR, "gui/" + sickbeard.GUI_NAME + "/interfaces/default/", kwargs['file']) @@ -134,13 +134,13 @@ class BaseHandler(RequestHandler): def set_default_headers(self): self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') - + def write_error(self, status_code, **kwargs): # handle 404 http errors if status_code == 404: url = self.request.uri if self.request.uri.startswith(sickbeard.WEB_ROOT): - url = url[len(sickbeard.WEB_ROOT)+1:] + url = url[len(sickbeard.WEB_ROOT) + 1:] if url[:3] != 'api': return self.redirect(url) @@ -180,7 +180,11 @@ class BaseHandler(RequestHandler): else: return True + class WebHandler(BaseHandler): + def __init__(self, *args, **kwargs): + super(WebHandler, self).__init__(*args, **kwargs) + io_loop = IOLoop.current() executor = ThreadPoolExecutor(50) @@ -225,52 +229,13 @@ class WebHandler(BaseHandler): logger.log('Failed sending webui reponse: %s' % (traceback.format_exc()), logger.DEBUG) raise - def _genericMessage(self, subject, message): - t = PageTemplate(rh=self, file="genericMessage.tmpl") - t.submenu = self.HomeMenu() - t.subject = subject - t.message = message - return t - - def _getEpisode(self, show, season=None, episode=None, absolute=None): - if show is None: - return "Invalid show parameters" - - showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) - - if showObj is None: - return "Invalid show paramaters" - - if absolute: - epObj = showObj.getEpisode(absolute_number=int(absolute)) - elif season and episode: - epObj = showObj.getEpisode(int(season), int(episode)) - else: - return "Invalid paramaters" - - if epObj is None: - return "Episode couldn't be retrieved" - - return epObj - - def haveKODI(self): - return sickbeard.USE_KODI and sickbeard.KODI_UPDATE_LIBRARY - - def havePLEX(self): - return sickbeard.USE_PLEX and sickbeard.PLEX_UPDATE_LIBRARY - - def haveTORRENT(self): - if sickbeard.USE_TORRENTS and sickbeard.TORRENT_METHOD != 'blackhole' \ - and (sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'https' - or not sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'http:'): - return True - else: - return False - # post uses get method post = get class LoginHandler(BaseHandler): + def __init__(self, *args, **kwargs): + super(LoginHandler, self).__init__(*args, **kwargs) + def get(self, *args, **kwargs): if self.get_current_user(): self.redirect('/home/') @@ -297,11 +262,18 @@ class LoginHandler(BaseHandler): class LogoutHandler(BaseHandler): + def __init__(self, *args, **kwargs): + super(LogoutHandler, self).__init__(*args, **kwargs) + def get(self, *args, **kwargs): self.clear_cookie("user") self.redirect('/login/') -class KeyHandler(RequestHandler): + +class KeyHandler(BaseHandler): + def __init__(self, *args, **kwargs): + super(KeyHandler, self).__init__(*args, **kwargs) + def get(self, *args, **kwargs): api_key = None @@ -324,6 +296,9 @@ class KeyHandler(RequestHandler): @route('(.*)(/?)') class WebRoot(WebHandler): + def __init__(self, *args, **kwargs): + super(WebRoot, self).__init__(*args, **kwargs) + def index(self): return self.redirect('/home/') @@ -371,7 +346,7 @@ class WebRoot(WebHandler): else: default_image_name = 'banner.png' - #image_path = ek.ek(os.path.join, sickbeard.PROG_DIR, 'gui', 'slick', 'images', default_image_name) + # image_path = ek.ek(os.path.join, sickbeard.PROG_DIR, 'gui', 'slick', 'images', default_image_name) static_image_path = os.path.join('/images', default_image_name) if show and sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)): cache_obj = image_cache.ImageCache() @@ -608,6 +583,9 @@ class WebRoot(WebHandler): @route('/ui(/?.*)') class UI(WebRoot): + def __init__(self, *args, **kwargs): + super(UI, self).__init__(*args, **kwargs) + def add_message(self): ui.notifications.message('Test 1', 'This is test number 1') ui.notifications.error('Test 2', 'This is test number 2') @@ -628,6 +606,9 @@ class UI(WebRoot): @route('/browser(/?.*)') class WebFileBrowser(WebRoot): + def __init__(self, *args, **kwargs): + super(WebFileBrowser, self).__init__(*args, **kwargs) + def index(self, path='', includeFiles=False, *args, **kwargs): self.set_header("Content-Type", "application/json") return json.dumps(foldersAtPath(path, True, bool(int(includeFiles)))) @@ -642,6 +623,9 @@ class WebFileBrowser(WebRoot): @route('/home(/?.*)') class Home(WebRoot): + def __init__(self, *args, **kwargs): + super(Home, self).__init__(*args, **kwargs) + def HomeMenu(self): menu = [ {'title': 'Add Shows', 'path': 'home/addShows/', }, @@ -653,6 +637,34 @@ class Home(WebRoot): return menu + def _genericMessage(self, subject, message): + t = PageTemplate(rh=self, file="genericMessage.tmpl") + t.submenu = self.HomeMenu() + t.subject = subject + t.message = message + return t + + def _getEpisode(self, show, season=None, episode=None, absolute=None): + if show is None: + return "Invalid show parameters" + + showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) + + if showObj is None: + return "Invalid show paramaters" + + if absolute: + epObj = showObj.getEpisode(absolute_number=int(absolute)) + elif season and episode: + epObj = showObj.getEpisode(int(season), int(episode)) + else: + return "Invalid paramaters" + + if epObj is None: + return "Episode couldn't be retrieved" + + return epObj + def index(self): t = PageTemplate(rh=self, file="home.tmpl") if sickbeard.ANIME_SPLIT_HOME: @@ -678,7 +690,7 @@ class Home(WebRoot): else: return "Error: Unsupported Request. Send jsonp request with 'callback' variable in the query string." - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') self.set_header('Content-Type', 'text/javascript') self.set_header('Access-Control-Allow-Origin', '*') self.set_header('Access-Control-Allow-Headers', 'x-requested-with') @@ -689,8 +701,22 @@ class Home(WebRoot): else: return callback + '(' + json.dumps({"msg": "nope"}) + ');' + def haveKODI(self): + return sickbeard.USE_KODI and sickbeard.KODI_UPDATE_LIBRARY + + def havePLEX(self): + return sickbeard.USE_PLEX and sickbeard.PLEX_UPDATE_LIBRARY + + def haveTORRENT(self): + if sickbeard.USE_TORRENTS and sickbeard.TORRENT_METHOD != 'blackhole' \ + and (sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'https' + or not sickbeard.ENABLE_HTTPS and sickbeard.TORRENT_HOST[:5] == 'http:'): + return True + else: + return False + def testSABnzbd(self, host=None, username=None, password=None, apikey=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_url(host) @@ -706,7 +732,7 @@ class Home(WebRoot): def testTorrent(self, torrent_method=None, host=None, username=None, password=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_url(host) @@ -718,7 +744,7 @@ class Home(WebRoot): def testGrowl(self, host=None, password=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_host(host, default_port=23053) @@ -735,7 +761,7 @@ class Home(WebRoot): def testProwl(self, prowl_api=None, prowl_priority=0): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.prowl_notifier.test_notify(prowl_api, prowl_priority) if result: @@ -745,7 +771,7 @@ class Home(WebRoot): def testBoxcar(self, username=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.boxcar_notifier.test_notify(username) if result: @@ -755,7 +781,7 @@ class Home(WebRoot): def testBoxcar2(self, accesstoken=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.boxcar2_notifier.test_notify(accesstoken) if result: @@ -765,7 +791,7 @@ class Home(WebRoot): def testPushover(self, userKey=None, apiKey=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.pushover_notifier.test_notify(userKey, apiKey) if result: @@ -775,13 +801,13 @@ class Home(WebRoot): def twitterStep1(self): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') return notifiers.twitter_notifier._get_authorization() def twitterStep2(self, key): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.twitter_notifier._get_credentials(key) logger.log(u"result: " + str(result)) @@ -792,7 +818,7 @@ class Home(WebRoot): def testTwitter(self): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.twitter_notifier.test_notify() if result: @@ -802,7 +828,7 @@ class Home(WebRoot): def testKODI(self, host=None, username=None, password=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_hosts(host) finalResult = '' @@ -818,7 +844,7 @@ class Home(WebRoot): def testPLEX(self, host=None, username=None, password=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') finalResult = '' for curHost in [x.strip() for x in host.split(",")]: @@ -833,7 +859,7 @@ class Home(WebRoot): def testLibnotify(self): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') if notifiers.libnotify_notifier.test_notify(): return "Tried sending desktop notification via libnotify" @@ -842,7 +868,7 @@ class Home(WebRoot): def testNMJ(self, host=None, database=None, mount=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_host(host) result = notifiers.nmj_notifier.test_notify(urllib.unquote_plus(host), database, mount) @@ -853,7 +879,7 @@ class Home(WebRoot): def settingsNMJ(self, host=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_host(host) result = notifiers.nmj_notifier.notify_settings(urllib.unquote_plus(host)) @@ -865,7 +891,7 @@ class Home(WebRoot): def testNMJv2(self, host=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_host(host) result = notifiers.nmjv2_notifier.test_notify(urllib.unquote_plus(host)) @@ -876,7 +902,7 @@ class Home(WebRoot): def settingsNMJv2(self, host=None, dbloc=None, instance=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_host(host) result = notifiers.nmjv2_notifier.notify_settings(urllib.unquote_plus(host), dbloc, instance) @@ -889,12 +915,12 @@ class Home(WebRoot): def testTrakt(self, api=None, username=None, password=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') return notifiers.trakt_notifier.test_notify(api, username, password) def loadShowNotifyLists(self): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') myDB = db.DBConnection() rows = myDB.select("SELECT show_id, show_name, notify_list FROM tv_shows ORDER BY show_name ASC") @@ -909,7 +935,7 @@ class Home(WebRoot): def testEmail(self, host=None, port=None, smtp_from=None, use_tls=None, user=None, pwd=None, to=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') host = config.clean_host(host) if notifiers.email_notifier.test_notify(host, port, smtp_from, use_tls, user, pwd, to): @@ -919,7 +945,7 @@ class Home(WebRoot): def testNMA(self, nma_api=None, nma_priority=0): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.nma_notifier.test_notify(nma_api, nma_priority) if result: @@ -929,7 +955,7 @@ class Home(WebRoot): def testPushalot(self, authorizationToken=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.pushalot_notifier.test_notify(authorizationToken) if result: @@ -939,7 +965,7 @@ class Home(WebRoot): def testPushbullet(self, api=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.pushbullet_notifier.test_notify(api) if result: @@ -949,7 +975,7 @@ class Home(WebRoot): def getPushbulletDevices(self, api=None): - #self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') + # self.set_header('Cache-Control', 'max-age=0,no-cache,no-store') result = notifiers.pushbullet_notifier.get_devices(api) if result: @@ -993,14 +1019,14 @@ class Home(WebRoot): return self.redirect('/home/') if sickbeard.versionCheckScheduler.action.update(): - # do a hard restart - sickbeard.events.put(sickbeard.events.SystemEvent.RESTART) + # do a hard restart + sickbeard.events.put(sickbeard.events.SystemEvent.RESTART) - t = PageTemplate(rh=self, file="restart_bare.tmpl") - return t + t = PageTemplate(rh=self, file="restart_bare.tmpl") + return t else: - return self._genericMessage("Update Failed", - "Update wasn't successful, not restarting. Check your log for more information.") + return self._genericMessage("Update Failed", + "Update wasn't successful, not restarting. Check your log for more information.") def branchCheckout(self, branch): sickbeard.BRANCH = branch @@ -1038,29 +1064,29 @@ class Home(WebRoot): show_message = '' - if sickbeard.showQueueScheduler.action.isBeingAdded(showObj): # @UndefinedVariable + if sickbeard.showQueueScheduler.action.isBeingAdded(showObj): show_message = 'This show is in the process of being downloaded - the info below is incomplete.' - elif sickbeard.showQueueScheduler.action.isBeingUpdated(showObj): # @UndefinedVariable + elif sickbeard.showQueueScheduler.action.isBeingUpdated(showObj): show_message = 'The information on this page is in the process of being updated.' - elif sickbeard.showQueueScheduler.action.isBeingRefreshed(showObj): # @UndefinedVariable + elif sickbeard.showQueueScheduler.action.isBeingRefreshed(showObj): show_message = 'The episodes below are currently being refreshed from disk' - elif sickbeard.showQueueScheduler.action.isBeingSubtitled(showObj): # @UndefinedVariable + elif sickbeard.showQueueScheduler.action.isBeingSubtitled(showObj): show_message = 'Currently downloading subtitles for this show' - elif sickbeard.showQueueScheduler.action.isInRefreshQueue(showObj): # @UndefinedVariable + elif sickbeard.showQueueScheduler.action.isInRefreshQueue(showObj): show_message = 'This show is queued to be refreshed.' - elif sickbeard.showQueueScheduler.action.isInUpdateQueue(showObj): # @UndefinedVariable + elif sickbeard.showQueueScheduler.action.isInUpdateQueue(showObj): show_message = 'This show is queued and awaiting an update.' - elif sickbeard.showQueueScheduler.action.isInSubtitleQueue(showObj): # @UndefinedVariable + elif sickbeard.showQueueScheduler.action.isInSubtitleQueue(showObj): show_message = 'This show is queued and awaiting subtitles download.' - if not sickbeard.showQueueScheduler.action.isBeingAdded(showObj): # @UndefinedVariable - if not sickbeard.showQueueScheduler.action.isBeingUpdated(showObj): # @UndefinedVariable + if not sickbeard.showQueueScheduler.action.isBeingAdded(showObj): + if not sickbeard.showQueueScheduler.action.isBeingUpdated(showObj): t.submenu.append( {'title': 'Remove', 'path': 'home/deleteShow?show=%d' % showObj.indexerid, 'confirm': True}) t.submenu.append({'title': 'Re-scan files', 'path': 'home/refreshShow?show=%d' % showObj.indexerid}) @@ -1315,7 +1341,7 @@ class Home(WebRoot): if bool(showObj.flatten_folders) != bool(flatten_folders): showObj.flatten_folders = flatten_folders try: - sickbeard.showQueueScheduler.action.refreshShow(showObj) # @UndefinedVariable + sickbeard.showQueueScheduler.action.refreshShow(showObj) except exceptions.CantRefreshException, e: errors.append("Unable to refresh this show: " + ex(e)) @@ -1345,7 +1371,7 @@ class Home(WebRoot): try: showObj.location = location try: - sickbeard.showQueueScheduler.action.refreshShow(showObj) # @UndefinedVariable + sickbeard.showQueueScheduler.action.refreshShow(showObj) except exceptions.CantRefreshException, e: errors.append("Unable to refresh this show:" + ex(e)) # grab updated info from TVDB @@ -1361,7 +1387,7 @@ class Home(WebRoot): # force the update if do_update: try: - sickbeard.showQueueScheduler.action.updateShow(showObj, True) # @UndefinedVariable + sickbeard.showQueueScheduler.action.updateShow(showObj, True) time.sleep(cpu_presets[sickbeard.CPU_PRESET]) except exceptions.CantUpdateException, e: errors.append("Unable to force an update on the show.") @@ -1375,7 +1401,7 @@ class Home(WebRoot): if do_update_scene_numbering: try: - sickbeard.scene_numbering.xem_refresh(showObj.indexerid, showObj.indexer) # @UndefinedVariable + sickbeard.scene_numbering.xem_refresh(showObj.indexerid, showObj.indexer) time.sleep(cpu_presets[sickbeard.CPU_PRESET]) except exceptions.CantUpdateException, e: errors.append("Unable to force an update on scene numbering of the show.") @@ -1401,7 +1427,7 @@ class Home(WebRoot): return self._genericMessage("Error", "Unable to find the specified show") if sickbeard.showQueueScheduler.action.isBeingAdded( - showObj) or sickbeard.showQueueScheduler.action.isBeingUpdated(showObj): # @UndefinedVariable + showObj) or sickbeard.showQueueScheduler.action.isBeingUpdated(showObj): return self._genericMessage("Error", "Shows can't be deleted while they're being added or updated.") if sickbeard.USE_TRAKT and sickbeard.TRAKT_SYNC: @@ -1429,7 +1455,7 @@ class Home(WebRoot): # force the update from the DB try: - sickbeard.showQueueScheduler.action.refreshShow(showObj) # @UndefinedVariable + sickbeard.showQueueScheduler.action.refreshShow(showObj) except exceptions.CantRefreshException, e: ui.notifications.error("Unable to refresh this show.", ex(e)) @@ -1451,7 +1477,7 @@ class Home(WebRoot): # force the update try: - sickbeard.showQueueScheduler.action.updateShow(showObj, bool(force)) # @UndefinedVariable + sickbeard.showQueueScheduler.action.updateShow(showObj, bool(force)) except exceptions.CantUpdateException, e: ui.notifications.error("Unable to update this show.", ex(e)) @@ -1471,7 +1497,7 @@ class Home(WebRoot): return self._genericMessage("Error", "Unable to find the specified show") # search and download subtitles - sickbeard.showQueueScheduler.action.downloadSubtitles(showObj, bool(force)) # @UndefinedVariable + sickbeard.showQueueScheduler.action.downloadSubtitles(showObj, bool(force)) time.sleep(cpu_presets[sickbeard.CPU_PRESET]) @@ -1502,7 +1528,6 @@ class Home(WebRoot): ui.notifications.error("Unable to contact Plex Media Server host: " + sickbeard.PLEX_SERVER_HOST) return self.redirect('/home/') - def setStatus(self, show=None, eps=None, status=None, direct=False): if show is None or eps is None or status is None: @@ -1589,7 +1614,7 @@ class Home(WebRoot): for season, segment in segments.items(): cur_backlog_queue_item = search_queue.BacklogQueueItem(showObj, segment) - sickbeard.searchQueueScheduler.action.add_item(cur_backlog_queue_item) # @UndefinedVariable + sickbeard.searchQueueScheduler.action.add_item(cur_backlog_queue_item) msg += "
  • Season " + str(season) + "
  • " logger.log(u"Sending backlog for " + showObj.name + " season " + str( @@ -1606,7 +1631,7 @@ class Home(WebRoot): for season, segment in segments.items(): cur_failed_queue_item = search_queue.FailedQueueItem(showObj, [segment]) - sickbeard.searchQueueScheduler.action.add_item(cur_failed_queue_item) # @UndefinedVariable + sickbeard.searchQueueScheduler.action.add_item(cur_failed_queue_item) msg += "
  • Season " + str(season) + "
  • " logger.log(u"Retrying Search for " + showObj.name + " season " + str( @@ -1726,7 +1751,7 @@ class Home(WebRoot): # make a queue item for it and put it on the queue ep_queue_item = search_queue.ManualSearchQueueItem(ep_obj.show, ep_obj) - sickbeard.searchQueueScheduler.action.add_item(ep_queue_item) # @UndefinedVariable + sickbeard.searchQueueScheduler.action.add_item(ep_queue_item) if not ep_queue_item.started and ep_queue_item.success is None: return json.dumps( @@ -1748,19 +1773,19 @@ class Home(WebRoot): if isinstance(searchThread, sickbeard.search_queue.ManualSearchQueueItem): results.append({'episode': searchThread.segment.episode, - 'episodeindexid': searchThread.segment.indexerid, - 'season': searchThread.segment.season, - 'searchstatus': searchstatus, - 'status': statusStrings[searchThread.segment.status], - 'quality': self.getQualityClass(searchThread.segment)}) + 'episodeindexid': searchThread.segment.indexerid, + 'season': searchThread.segment.season, + 'searchstatus': searchstatus, + 'status': statusStrings[searchThread.segment.status], + 'quality': self.getQualityClass(searchThread.segment)}) else: for epObj in searchThread.segment: results.append({'episode': epObj.episode, - 'episodeindexid': epObj.indexerid, - 'season': epObj.season, - 'searchstatus': searchstatus, - 'status': statusStrings[epObj.status], - 'quality': self.getQualityClass(epObj)}) + 'episodeindexid': epObj.indexerid, + 'season': epObj.season, + 'searchstatus': searchstatus, + 'status': statusStrings[epObj.status], + 'quality': self.getQualityClass(epObj)}) return results @@ -1916,7 +1941,7 @@ class Home(WebRoot): # make a queue item for it and put it on the queue ep_queue_item = search_queue.FailedQueueItem(ep_obj.show, [ep_obj]) - sickbeard.searchQueueScheduler.action.add_item(ep_queue_item) # @UndefinedVariable + sickbeard.searchQueueScheduler.action.add_item(ep_queue_item) if not ep_queue_item.started and ep_queue_item.success is None: return json.dumps( @@ -1929,6 +1954,9 @@ class Home(WebRoot): @route('/home/postprocess(/?.*)') class HomePostProcess(Home): + def __init__(self, *args, **kwargs): + super(HomePostProcess, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="home_postprocess.tmpl") t.submenu = self.HomeMenu() @@ -1966,6 +1994,9 @@ class HomePostProcess(Home): @route('/home/addShows(/?.*)') class HomeAddShows(Home): + def __init__(self, *args, **kwargs): + super(HomeAddShows, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="home_addShows.tmpl") t.submenu = self.HomeMenu() @@ -2378,7 +2409,7 @@ class HomeAddShows(Home): # add the show sickbeard.showQueueScheduler.action.addShow(indexer, indexer_id, show_dir, int(defaultStatus), newQuality, flatten_folders, indexerLang, subtitles, anime, - scene) # @UndefinedVariable + scene) ui.notifications.message('Show added', 'Adding the specified show into ' + show_dir) return finishAddShow() @@ -2467,7 +2498,10 @@ class HomeAddShows(Home): @route('/manage(/?.*)') -class Manage(WebRoot): +class Manage(Home, WebRoot): + def __init__(self, *args, **kwargs): + super(Manage, self).__init__(*args, **kwargs) + def ManageMenu(self): menu = [ {'title': 'Backlog Overview', 'path': 'manage/backlogOverview/'}, @@ -2593,8 +2627,7 @@ class Manage(WebRoot): all_eps = [str(x["season"]) + 'x' + str(x["episode"]) for x in all_eps_results] to_change[cur_indexer_id] = all_eps - self.Home.setStatus(cur_indexer_id, '|'.join(to_change[cur_indexer_id]), - newStatus, direct=True) + self.setStatus(cur_indexer_id, '|'.join(to_change[cur_indexer_id]), newStatus, direct=True) return self.redirect('/manage/episodeStatuses/') @@ -2712,7 +2745,7 @@ class Manage(WebRoot): show_obj = helpers.findCertainShow(sickbeard.showList, int(indexer_id)) if show_obj: - sickbeard.backlogSearchScheduler.action.searchBacklog([show_obj]) # @UndefinedVariable + sickbeard.backlogSearchScheduler.action.searchBacklog([show_obj]) return self.redirect("/manage/backlogOverview/") @@ -2968,14 +3001,14 @@ class Manage(WebRoot): exceptions_list = [] - curErrors += self.Home.editShow(curShow, new_show_dir, anyQualities, - bestQualities, exceptions_list, - archive_firstmatch=new_archive_firstmatch, - flatten_folders=new_flatten_folders, - paused=new_paused, sports=new_sports, - subtitles=new_subtitles, anime=new_anime, - scene=new_scene, air_by_date=new_air_by_date, - directCall=True) + curErrors += self.editShow(curShow, new_show_dir, anyQualities, + bestQualities, exceptions_list, + archive_firstmatch=new_archive_firstmatch, + flatten_folders=new_flatten_folders, + paused=new_paused, sports=new_sports, + subtitles=new_subtitles, anime=new_anime, + scene=new_scene, air_by_date=new_air_by_date, + directCall=True) if curErrors: logger.log(u"Errors: " + str(curErrors), logger.ERROR) @@ -3055,7 +3088,7 @@ class Manage(WebRoot): if curShowID in toUpdate: try: - sickbeard.showQueueScheduler.action.updateShow(showObj, True) # @UndefinedVariable + sickbeard.showQueueScheduler.action.updateShow(showObj, True) updates.append(showObj.name) except exceptions.CantUpdateException, e: errors.append("Unable to update show " + showObj.name + ": " + ex(e)) @@ -3063,17 +3096,17 @@ class Manage(WebRoot): # don't bother refreshing shows that were updated anyway if curShowID in toRefresh and curShowID not in toUpdate: try: - sickbeard.showQueueScheduler.action.refreshShow(showObj) # @UndefinedVariable + sickbeard.showQueueScheduler.action.refreshShow(showObj) refreshes.append(showObj.name) except exceptions.CantRefreshException, e: errors.append("Unable to refresh show " + showObj.name + ": " + ex(e)) if curShowID in toRename: - sickbeard.showQueueScheduler.action.renameShowEpisodes(showObj) # @UndefinedVariable + sickbeard.showQueueScheduler.action.renameShowEpisodes(showObj) renames.append(showObj.name) if curShowID in toSubtitle: - sickbeard.showQueueScheduler.action.downloadSubtitles(showObj) # @UndefinedVariable + sickbeard.showQueueScheduler.action.downloadSubtitles(showObj) subtitles.append(showObj.name) if len(errors) > 0: @@ -3147,7 +3180,7 @@ class Manage(WebRoot): toRemove = toRemove.split("|") if toRemove is not None else [] for release in toRemove: - myDB.action('DELETE FROM failed WHERE release = ?', [release]) + myDB.action("DELETE FROM failed WHERE release = ?", [release]) if toRemove: return self.redirect('/manage/failedDownloads/') @@ -3162,13 +3195,16 @@ class Manage(WebRoot): @route('/manage/manageSearches(/?.*)') class ManageSearches(Manage): + def __init__(self, *args, **kwargs): + super(ManageSearches, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="manage_manageSearches.tmpl") # t.backlogPI = sickbeard.backlogSearchScheduler.action.getProgressIndicator() - t.backlogPaused = sickbeard.searchQueueScheduler.action.is_backlog_paused() # @UndefinedVariable - t.backlogRunning = sickbeard.searchQueueScheduler.action.is_backlog_in_progress() # @UndefinedVariable - t.dailySearchStatus = sickbeard.dailySearchScheduler.action.amActive # @UndefinedVariable - t.findPropersStatus = sickbeard.properFinderScheduler.action.amActive # @UndefinedVariable + t.backlogPaused = sickbeard.searchQueueScheduler.action.is_backlog_paused() + t.backlogRunning = sickbeard.searchQueueScheduler.action.is_backlog_in_progress() + t.dailySearchStatus = sickbeard.dailySearchScheduler.action.amActive + t.findPropersStatus = sickbeard.properFinderScheduler.action.amActive t.queueLength = sickbeard.searchQueueScheduler.action.queue_length() t.submenu = self.ManageMenu() @@ -3208,15 +3244,18 @@ class ManageSearches(Manage): def pauseBacklog(self, paused=None): if paused == "1": - sickbeard.searchQueueScheduler.action.pause_backlog() # @UndefinedVariable + sickbeard.searchQueueScheduler.action.pause_backlog() else: - sickbeard.searchQueueScheduler.action.unpause_backlog() # @UndefinedVariable + sickbeard.searchQueueScheduler.action.unpause_backlog() return self.redirect("/manage/manageSearches/") @route('/history(/?.*)') class History(WebRoot): + def __init__(self, *args, **kwargs): + super(History, self).__init__(*args, **kwargs) + def index(self, limit=100): # sqlResults = myDB.select("SELECT h.*, show_name, name FROM history h, tv_shows s, tv_episodes e WHERE h.showid=s.indexer_id AND h.showid=e.showid AND h.season=e.season AND h.episode=e.episode ORDER BY date DESC LIMIT "+str(numPerPage*(p-1))+", "+str(numPerPage)) @@ -3309,6 +3348,9 @@ class History(WebRoot): @route('/config(/?.*)') class Config(WebRoot): + def __init__(self, *args, **kwargs): + super(Config, self).__init__(*args, **kwargs) + def ConfigMenu(self): menu = [ {'title': 'General', 'path': 'config/general/'}, @@ -3332,6 +3374,9 @@ class Config(WebRoot): @route('/config/general(/?.*)') class ConfigGeneral(Config): + def __init__(self, *args, **kwargs): + super(ConfigGeneral, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="config_general.tmpl") t.submenu = self.ConfigMenu() @@ -3467,6 +3512,9 @@ class ConfigGeneral(Config): @route('/config/backuprestore(/?.*)') class ConfigBackupRestore(Config): + def __init__(self, *args, **kwargs): + super(ConfigBackupRestore, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="config_backuprestore.tmpl") t.submenu = self.ConfigMenu() @@ -3515,8 +3563,10 @@ class ConfigBackupRestore(Config): @route('/config/search(/?.*)') class ConfigSearch(Config): - def index(self): + def __init__(self, *args, **kwargs): + super(ConfigSearch, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="config_search.tmpl") t.submenu = self.ConfigMenu() return t @@ -3608,8 +3658,10 @@ class ConfigSearch(Config): @route('/config/postProcessing(/?.*)') class ConfigPostProcessing(Config): - def index(self): + def __init__(self, *args, **kwargs): + super(ConfigPostProcessing, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="config_postProcessing.tmpl") t.submenu = self.ConfigMenu() return t @@ -3808,6 +3860,9 @@ class ConfigPostProcessing(Config): @route('/config/providers(/?.*)') class ConfigProviders(Config): + def __init__(self, *args, **kwargs): + super(ConfigProviders, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="config_providers.tmpl") t.submenu = self.ConfigMenu() @@ -4247,6 +4302,9 @@ class ConfigProviders(Config): @route('/config/notifications(/?.*)') class ConfigNotifications(Config): + def __init__(self, *args, **kwargs): + super(ConfigNotifications, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="config_notifications.tmpl") t.submenu = self.ConfigMenu() @@ -4457,6 +4515,9 @@ class ConfigNotifications(Config): @route('/config/subtitles(/?.*)') class ConfigSubtitles(Config): + def __init__(self, *args, **kwargs): + super(ConfigSubtitles, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="config_subtitles.tmpl") t.submenu = self.ConfigMenu() @@ -4521,6 +4582,9 @@ class ConfigSubtitles(Config): @route('/config/anime(/?.*)') class ConfigAnime(Config): + def __init__(self, *args, **kwargs): + super(ConfigAnime, self).__init__(*args, **kwargs) + def index(self): t = PageTemplate(rh=self, file="config_anime.tmpl") @@ -4554,6 +4618,9 @@ class ConfigAnime(Config): @route('/errorlogs(/?.*)') class ErrorLogs(WebRoot): + def __init__(self, *args, **kwargs): + super(ErrorLogs, self).__init__(*args, **kwargs) + def ErrorLogsMenu(self): menu = [ {'title': 'Clear Errors', 'path': 'errorlogs/clearerrors/'},