diff --git a/gui/slick/images/network/vimeo.png b/gui/slick/images/network/vimeo.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c093f792ad2f2756929194f2a47abb3cbe001f Binary files /dev/null and b/gui/slick/images/network/vimeo.png differ diff --git a/gui/slick/images/network/xbox video.png b/gui/slick/images/network/xbox video.png new file mode 100644 index 0000000000000000000000000000000000000000..40c0cabc0a64048e8aeec0713a506913922335d4 Binary files /dev/null and b/gui/slick/images/network/xbox video.png differ diff --git a/gui/slick/interfaces/default/comingEpisodes.mako b/gui/slick/interfaces/default/comingEpisodes.mako index 074c3462501a10676264c3c6a93ed9d142786cd6..0c16007460a045b600c682a47662cde44cb55764 100644 --- a/gui/slick/interfaces/default/comingEpisodes.mako +++ b/gui/slick/interfaces/default/comingEpisodes.mako @@ -5,6 +5,7 @@ from sickbeard.common import qualityPresets, qualityPresetStrings import datetime import time + import re %> <% sort = sickbeard.COMING_EPS_SORT diff --git a/gui/slick/interfaces/default/config_notifications.mako b/gui/slick/interfaces/default/config_notifications.mako index 099c24bdd81a125543c6942404ecee770c43cbc1..f7b9a98344c7090ee766f5b4af31ad1670c7b368 100644 --- a/gui/slick/interfaces/default/config_notifications.mako +++ b/gui/slick/interfaces/default/config_notifications.mako @@ -985,6 +985,7 @@ <option value="echo" ${('', 'selected="selected"')[sickbeard.PUSHOVER_SOUND == 'echo']}>Pushover Echo (long)</option> <option value="updown" ${('', 'selected="selected"')[sickbeard.PUSHOVER_SOUND == 'updown']}>Up Down (long)</option> <option value="none" ${('', 'selected="selected"')[sickbeard.PUSHOVER_SOUND == 'none']}>None (silent)</option> + <option value="default" ${('', 'selected="selected"')[sickbeard.PUSHOVER_SOUND == 'default']}>Device specific</option> </select> </label> <label> diff --git a/gui/slick/interfaces/default/config_search.mako b/gui/slick/interfaces/default/config_search.mako index b6fb9c2424ae95171fd954f1ab1dcfed37c6b75b..fa888fff141e57cf6bba85fa275d2e77bb920ba7 100644 --- a/gui/slick/interfaces/default/config_search.mako +++ b/gui/slick/interfaces/default/config_search.mako @@ -132,26 +132,6 @@ </label> </div> - <div class="field-pair"> - <label for="dailysearch_startup"> - <span class="component-title">Daily search on startup</span> - <span class="component-desc"> - <input type="checkbox" name="dailysearch_startup" id="dailysearch_startup" ${('', 'checked="checked"')[bool(sickbeard.DAILYSEARCH_STARTUP)]}/> - <p>start daily search on startup of SickRage</p> - </span> - </label> - </div> - - <div class="field-pair"> - <label for="backlog_startup"> - <span class="component-title">Run backlog on startup</span> - <span class="component-desc"> - <input type="checkbox" name="backlog_startup" id="backlog_startup" ${('', 'checked="checked"')[bool(sickbeard.BACKLOG_STARTUP)]}/> - <p>start processing backlogged episodes on startup of SickRage</p> - </span> - </label> - </div> - <div class="field-pair"> <input id="use_failed_downloads" type="checkbox" class="enabler" name="use_failed_downloads" ${('', 'checked="checked"')[bool(sickbeard.USE_FAILED_DOWNLOADS)]} /> <label for="use_failed_downloads"> diff --git a/gui/slick/interfaces/default/displayShow.mako b/gui/slick/interfaces/default/displayShow.mako index 83345e35dc8aefe4e2085c9b5e4ea028f0c1e615..9df75375cf7ed0b3ba2f28e561b41b1ceb611746 100644 --- a/gui/slick/interfaces/default/displayShow.mako +++ b/gui/slick/interfaces/default/displayShow.mako @@ -23,7 +23,7 @@ <script type="text/javascript" src="${sbRoot}/js/ratingTooltip.js?${sbPID}"></script> <script type="text/javascript" src="${sbRoot}/js/ajaxEpSearch.js?${sbPID}"></script> <script type="text/javascript" src="${sbRoot}/js/ajaxEpSubtitles.js?${sbPID}"></script> -<script type="text/javascript" src="${sbRoot}/js/lib/jquery.collapser.min.js?${sbPID}"></script> +##<script type="text/javascript" src="${sbRoot}/js/lib/jquery.collapser.min.js?${sbPID}"></script> <script type="text/javascript" charset="utf-8"> $(document).ready(function(){ <% fuzzydate = 'airdate' %> @@ -463,7 +463,7 @@ $(document).ready(function(){ % endif <% curSeason = int(epResult["season"]) %> % endif - <% epLoc = str(epResult["location"]) %> + <% epLoc = epResult["location"] %> <tr class="${Overview.overviewStrings[epCats[epStr]]} season-${curSeason} seasonstyle"> <td class="col-checkbox"> % if int(epResult["status"]) != UNAIRED: diff --git a/gui/slick/interfaces/default/home_popularShows.mako b/gui/slick/interfaces/default/home_popularShows.mako index 9519cf5fa7fcac89f10c9862157c1298f049fb27..6e9f94988a848225fddb784a522ca89b14c7948b 100644 --- a/gui/slick/interfaces/default/home_popularShows.mako +++ b/gui/slick/interfaces/default/home_popularShows.mako @@ -2,14 +2,20 @@ <%include file="/inc_top.mako"/> +<h2>Popular Shows</h2> +<br /> + % if not popular_shows: <h3>Fetching of IMDB Data failed. Are you online?</h3> + <strong>Exception:</strong> + <p>${imdb_exception}</p> + % else: % for cur_result in popular_shows: <div class="popularShow"> <div class="left"> - <img class="coverImage" src="${cur_result['image_url_large']}" /> + <img class="coverImage" src="${sbRoot}/cache/${cur_result['image_path']}" /> </div> <div class="right"> <h3>${cur_result['name']}</h3> @@ -20,7 +26,7 @@ <p>${cur_result['outline']}<span class="year"> - Released ${cur_result['year']}<span></p> <span class="imdb_url"><a href="${anon_url(cur_result['imdb_url'])}">View on IMDB</a></span> | - <span class="imdb_sickrage_search"><a href="/home/addShows/newShow/?search_string=${cur_result['name']}"> + <span class="imdb_sickrage_search"><a href="${sbRoot}/home/addShows/newShow/?search_string=${cur_result['name']}"> Add Show</a></span> </div> diff --git a/gui/slick/interfaces/default/status.mako b/gui/slick/interfaces/default/status.mako index 7be146ff6ea67f7a4ace1132d89cbf05d887aacb..a49750673935d11e4eba78ae890095baf4f15813 100644 --- a/gui/slick/interfaces/default/status.mako +++ b/gui/slick/interfaces/default/status.mako @@ -100,7 +100,11 @@ <td>N/A</td> % endtry % endif + % if service.start_time: <td align="right">${service.start_time}</td> + % else: + <td align="right"></td> + % endif <% cycleTime = (service.cycleTime.microseconds + (service.cycleTime.seconds + service.cycleTime.days * 24 * 3600) * 10**6) / 10**6 %> <td align="right">${helpers.pretty_time_delta(cycleTime)}</td> % if service.enable: @@ -205,11 +209,13 @@ </tr> </thead> <tbody> + % if sickbeard.TV_DOWNLOAD_DIR: <tr> <td>TV Download Directory</td> <td>${sickbeard.TV_DOWNLOAD_DIR}</td> <td>${tvdirFree} MB</td> </tr> + % endif <tr> <td rowspan=${len(rootDir)}>Media Root Directories</td> % for cur_dir in rootDir: diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index e2cbe3b30c9b9c86ae294f9b82eabfe0d8886388..83bb7398e301bf081d815abb94f000fd28919491 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -235,9 +235,7 @@ RANDOMIZE_PROVIDERS = False AUTOPOSTPROCESSER_FREQUENCY = None DAILYSEARCH_FREQUENCY = None UPDATE_FREQUENCY = None -DAILYSEARCH_STARTUP = False BACKLOG_FREQUENCY = None -BACKLOG_STARTUP = False SHOWUPDATE_HOUR = None DEFAULT_AUTOPOSTPROCESSER_FREQUENCY = 10 @@ -561,11 +559,11 @@ def initialize(consoleLogging=True): KODI_UPDATE_LIBRARY, KODI_HOST, KODI_USERNAME, KODI_PASSWORD, BACKLOG_FREQUENCY, \ USE_TRAKT, TRAKT_USERNAME, TRAKT_ACCESS_TOKEN, TRAKT_REFRESH_TOKEN, TRAKT_REMOVE_WATCHLIST, TRAKT_SYNC_WATCHLIST, TRAKT_REMOVE_SHOW_FROM_SICKRAGE, TRAKT_METHOD_ADD, TRAKT_START_PAUSED, traktCheckerScheduler, TRAKT_USE_RECOMMENDED, TRAKT_SYNC, TRAKT_SYNC_REMOVE, TRAKT_DEFAULT_INDEXER, TRAKT_REMOVE_SERIESLIST, TRAKT_TIMEOUT, TRAKT_BLACKLIST_NAME, USE_IMDB_POPULAR, \ USE_PLEX, PLEX_NOTIFY_ONSNATCH, PLEX_NOTIFY_ONDOWNLOAD, PLEX_NOTIFY_ONSUBTITLEDOWNLOAD, PLEX_UPDATE_LIBRARY, USE_PLEX_CLIENT, PLEX_CLIENT_USERNAME, PLEX_CLIENT_PASSWORD, \ - PLEX_SERVER_HOST, PLEX_SERVER_TOKEN, PLEX_HOST, PLEX_USERNAME, PLEX_PASSWORD, DEFAULT_BACKLOG_FREQUENCY, MIN_BACKLOG_FREQUENCY, BACKLOG_STARTUP, SKIP_REMOVED_FILES, \ + PLEX_SERVER_HOST, PLEX_SERVER_TOKEN, PLEX_HOST, PLEX_USERNAME, PLEX_PASSWORD, DEFAULT_BACKLOG_FREQUENCY, MIN_BACKLOG_FREQUENCY, SKIP_REMOVED_FILES, \ USE_EMBY, EMBY_HOST, EMBY_APIKEY, \ showUpdateScheduler, __INITIALIZED__, INDEXER_DEFAULT_LANGUAGE, EP_DEFAULT_DELETED_STATUS, LAUNCH_BROWSER, TRASH_REMOVE_SHOW, TRASH_ROTATE_LOGS, SORT_ARTICLE, showList, loadingShowList, \ NEWZNAB_DATA, NZBS, NZBS_UID, NZBS_HASH, INDEXER_DEFAULT, INDEXER_TIMEOUT, USENET_RETENTION, TORRENT_DIR, \ - QUALITY_DEFAULT, FLATTEN_FOLDERS_DEFAULT, SUBTITLES_DEFAULT, STATUS_DEFAULT, STATUS_DEFAULT_AFTER, DAILYSEARCH_STARTUP, \ + QUALITY_DEFAULT, FLATTEN_FOLDERS_DEFAULT, SUBTITLES_DEFAULT, STATUS_DEFAULT, STATUS_DEFAULT_AFTER, \ GROWL_NOTIFY_ONSNATCH, GROWL_NOTIFY_ONDOWNLOAD, GROWL_NOTIFY_ONSUBTITLEDOWNLOAD, TWITTER_NOTIFY_ONSNATCH, TWITTER_NOTIFY_ONDOWNLOAD, TWITTER_NOTIFY_ONSUBTITLEDOWNLOAD, USE_FREEMOBILE, FREEMOBILE_ID, FREEMOBILE_APIKEY, FREEMOBILE_NOTIFY_ONSNATCH, FREEMOBILE_NOTIFY_ONDOWNLOAD, FREEMOBILE_NOTIFY_ONSUBTITLEDOWNLOAD, \ USE_GROWL, GROWL_HOST, GROWL_PASSWORD, USE_PROWL, PROWL_NOTIFY_ONSNATCH, PROWL_NOTIFY_ONDOWNLOAD, PROWL_NOTIFY_ONSUBTITLEDOWNLOAD, PROWL_API, PROWL_PRIORITY, PROG_DIR, \ USE_PYTIVO, PYTIVO_NOTIFY_ONSNATCH, PYTIVO_NOTIFY_ONDOWNLOAD, PYTIVO_NOTIFY_ONSUBTITLEDOWNLOAD, PYTIVO_UPDATE_LIBRARY, PYTIVO_HOST, PYTIVO_SHARE_NAME, PYTIVO_TIVO_NAME, \ @@ -838,8 +836,6 @@ def initialize(consoleLogging=True): ALLOW_HIGH_PRIORITY = bool(check_setting_int(CFG, 'General', 'allow_high_priority', 1)) - DAILYSEARCH_STARTUP = bool(check_setting_int(CFG, 'General', 'dailysearch_startup', 1)) - BACKLOG_STARTUP = bool(check_setting_int(CFG, 'General', 'backlog_startup', 1)) SKIP_REMOVED_FILES = bool(check_setting_int(CFG, 'General', 'skip_removed_files', 0)) USENET_RETENTION = check_setting_int(CFG, 'General', 'usenet_retention', 500) @@ -1324,7 +1320,6 @@ def initialize(consoleLogging=True): # initialize schedulers # updaters - update_now = datetime.timedelta(minutes=0) versionCheckScheduler = scheduler.Scheduler(versionChecker.CheckVersion(), cycleTime=datetime.timedelta(hours=UPDATE_FREQUENCY), threadName="CHECKVERSION", @@ -1344,19 +1339,18 @@ def initialize(consoleLogging=True): cycleTime=datetime.timedelta(seconds=3), threadName="SEARCHQUEUE") + # TODO: update_interval should take last daily/backlog times into account! update_interval = datetime.timedelta(minutes=DAILYSEARCH_FREQUENCY) dailySearchScheduler = scheduler.Scheduler(dailysearcher.DailySearcher(), cycleTime=update_interval, threadName="DAILYSEARCHER", - run_delay=update_now if DAILYSEARCH_STARTUP - else update_interval) + run_delay=update_interval) update_interval = datetime.timedelta(minutes=BACKLOG_FREQUENCY) backlogSearchScheduler = searchBacklog.BacklogSearchScheduler(searchBacklog.BacklogSearcher(), cycleTime=update_interval, threadName="BACKLOG", - run_delay=update_now if BACKLOG_STARTUP - else update_interval) + run_delay=update_interval) search_intervals = {'15m': 15, '45m': 45, '90m': 90, '4h': 4 * 60, 'daily': 24 * 60} if CHECK_PROPERS_INTERVAL in search_intervals: @@ -1432,7 +1426,7 @@ def start(): searchQueueScheduler.enable = True searchQueueScheduler.start() - # start the queue checker + # start the proper finder if DOWNLOAD_PROPERS: properFinderScheduler.silent = False properFinderScheduler.enable = True @@ -1441,7 +1435,7 @@ def start(): properFinderScheduler.silent = True properFinderScheduler.start() - # start the proper finder + # start the post processor if PROCESS_AUTOMATICALLY: autoPostProcesserScheduler.silent = False autoPostProcesserScheduler.enable = True @@ -1659,8 +1653,6 @@ def save_config(): new_config['General']['randomize_providers'] = int(RANDOMIZE_PROVIDERS) new_config['General']['check_propers_interval'] = CHECK_PROPERS_INTERVAL new_config['General']['allow_high_priority'] = int(ALLOW_HIGH_PRIORITY) - new_config['General']['dailysearch_startup'] = int(DAILYSEARCH_STARTUP) - new_config['General']['backlog_startup'] = int(BACKLOG_STARTUP) new_config['General']['skip_removed_files'] = int(SKIP_REMOVED_FILES) new_config['General']['quality_default'] = int(QUALITY_DEFAULT) new_config['General']['status_default'] = int(STATUS_DEFAULT) diff --git a/sickbeard/clients/deluged_client.py b/sickbeard/clients/deluged_client.py index 800a2786a619c96a754a01cec8e1ab5290c8243d..da11cd432d7675ca29349f8a155d1dd11b9e60d3 100644 --- a/sickbeard/clients/deluged_client.py +++ b/sickbeard/clients/deluged_client.py @@ -94,7 +94,11 @@ class DelugeDAPI(GenericClient): def _set_torrent_path(self, result): - return True + path = sickbeard.TORRENT_PATH + if path: + if self.drpc.set_torrent_path(result.hash, path): + return True + return False def _set_torrent_pause(self, result): @@ -179,6 +183,19 @@ class DelugeRPC(object): self.disconnect() return True + def set_torrent_path(self, torrent_id, path): + try: + self.connect() + self.client.core.set_torrent_move_completed_path(torrent_id, path).get() + self.client.core.set_torrent_move_completed(torrent_id, 1).get() + except Exception as err: + logger.log('DelugeD: Failed to set path for torrent: ' + err + ' ' + traceback.format_exc(), logger.ERROR) + return False + finally: + if self.client: + self.disconnect() + return True + def pause_torrent(self, torrent_ids): try: self.connect() diff --git a/sickbeard/common.py b/sickbeard/common.py index 4544a7df05206c50d92491ca3016c81e7b0753f3..34f9fad114c4fae7b6b1529e96619f16b8c3b099 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -138,8 +138,8 @@ class Quality: SNATCHED: "Snatched", SNATCHED_PROPER: "Snatched (Proper)", FAILED: "Failed", - SNATCHED_BEST: "Snatched (Best)"} - + SNATCHED_BEST: "Snatched (Best)", + ARCHIVED: "Archived"} @staticmethod def _getStatusStrings(status): toReturn = {} @@ -275,7 +275,12 @@ class Quality: from hachoir_parser import createParser from hachoir_metadata import extractMetadata - parser = createParser(filename) + try: + parser = createParser(filename) + except Exception: + parser = None + pass + if not parser: return Quality.UNKNOWN @@ -285,6 +290,8 @@ class Quality: metadata = None pass + del parser + if not metadata: return Quality.UNKNOWN @@ -298,6 +305,8 @@ class Quality: if metagroup.has('height'): height = int(metagroup.get('height') or 0) + del metadata + if not height: return Quality.UNKNOWN @@ -342,13 +351,14 @@ class Quality: SNATCHED_PROPER = None FAILED = None SNATCHED_BEST = None - + ARCHIVED = None Quality.DOWNLOADED = [Quality.compositeStatus(DOWNLOADED, x) for x in Quality.qualityStrings.keys()] Quality.SNATCHED = [Quality.compositeStatus(SNATCHED, x) for x in Quality.qualityStrings.keys()] Quality.SNATCHED_PROPER = [Quality.compositeStatus(SNATCHED_PROPER, x) for x in Quality.qualityStrings.keys()] Quality.FAILED = [Quality.compositeStatus(FAILED, x) for x in Quality.qualityStrings.keys()] Quality.SNATCHED_BEST = [Quality.compositeStatus(SNATCHED_BEST, x) for x in Quality.qualityStrings.keys()] +Quality.ARCHIVED = [Quality.compositeStatus(ARCHIVED, x) for x in Quality.qualityStrings.keys()] SD = Quality.combineQualities([Quality.SDTV, Quality.SDDVD], []) HD = Quality.combineQualities( diff --git a/sickbeard/imdbPopular.py b/sickbeard/imdbPopular.py index 0b6396675c5f3f617662c8ecd685698e998fa9fe..44643242b246b932a0cab5f552c48fe7dc7269b9 100644 --- a/sickbeard/imdbPopular.py +++ b/sickbeard/imdbPopular.py @@ -1,17 +1,29 @@ +import re +import os import requests from bs4 import BeautifulSoup -import re from datetime import date -url = "http://www.imdb.com/search/title?at=0&sort=moviemeter&title_type=tv_series&year=%s,%s" % \ - (date.today().year - 1, date.today().year + 1) +import sickbeard +from sickbeard import helpers +from sickbeard import encodingKludge as ek + +class imdbPopular(): + def __init__(self): + + self.url = "http://www.imdb.com/search/title?at=0&sort=moviemeter&title_type=tv_series&year=%s,%s" % \ + (date.today().year - 1, date.today().year + 1) + + self.session = requests.Session() -def fetch_popular_shows(): - popular_shows = [] + def fetch_popular_shows(self): + popular_shows = [] - r = requests.get(url) - if r.status_code == 200: - soup = BeautifulSoup(r.text) + data = helpers.getURL(self.url, session=self.session) + if not data: + return None + + soup = BeautifulSoup(data, 'html.parser') results = soup.find("table", {"class": "results"}) rows = results.find_all("tr"); @@ -21,13 +33,14 @@ def fetch_popular_shows(): if image_td: image = image_td.find("img") - show['image_url'] = image['src'] - show['image_url_large'] = show['image_url'].replace( - "V1._SX54_CR0,0,54,74_.jpg","V1._SX108_CR0,0,108,148_.jpg") + show['image_url_large'] = self.change_size(image['src'],3) + show['image_path'] = os.path.join('images', 'imdb_popular', os.path.basename(show['image_url_large'])) + + self.cache_image(show['image_url_large']) td = row.find("td", {"class": "title"}) - if td: + if td: show['name'] = td.find("a").contents[0] show['imdb_url'] = "http://www.imdb.com" + td.find("a")["href"] show['year'] = td.find("span", {"class": "year_type"}).contents[0].split(" ")[0][1:] @@ -50,5 +63,34 @@ def fetch_popular_shows(): popular_shows.append(show) return popular_shows - else: - return None + + def change_size(self, image_url, factor=3): + match = re.search("^(.*)V1._(.{2})(.*?)_(.{2})(.*?),(.*?),(.*?),(.*?)_.jpg$", image_url) + + if match: + matches = match.groups() + os.path.basename(image_url) + matches = list(matches) + matches[2] = int(matches[2]) * factor + matches[4] = int(matches[4]) * factor + matches[5] = int(matches[5]) * factor + matches[6] = int(matches[6]) * factor + matches[7] = int(matches[7]) * factor + + return "%sV1._%s%s_%s%s,%s,%s,%s_.jpg" % (matches[0], matches[1], matches[2], matches[3], matches[4], + matches[5], matches[6], matches[7]) + else: + return image_url + + def cache_image(self, image_url): + path = ek.ek(os.path.abspath, ek.ek(os.path.join, sickbeard.CACHE_DIR, 'images', 'imdb_popular')) + + if not os.path.exists(path): + os.makedirs(path) + + full_path = os.path.join(path, os.path.basename(image_url)) + + if not os.path.isfile(full_path): + helpers.download_file(image_url, full_path, session=self.session) + +imdb_popular = imdbPopular() diff --git a/sickbeard/notifiers/pushover.py b/sickbeard/notifiers/pushover.py index 2eab3191a1938471b9264f30b1790e4233ceb453..6a76380cc5cc640a97a3145c3d0d725ae2f711c9 100644 --- a/sickbeard/notifiers/pushover.py +++ b/sickbeard/notifiers/pushover.py @@ -61,16 +61,28 @@ class PushoverNotifier: # send the request to pushover try: - args = { - "token": apiKey, - "user": userKey, - "title": title.encode('utf-8'), - "message": msg.encode('utf-8'), - "timestamp": int(time.time()), - "retry": 60, - "expire": 3600, - "sound": sound, - } + if sickbeard.PUSHOVER_SOUND != "default": + args = { + "token": apiKey, + "user": userKey, + "title": title.encode('utf-8'), + "message": msg.encode('utf-8'), + "timestamp": int(time.time()), + "retry": 60, + "expire": 3600, + "sound": sound, + } + else: + # sound is default, so don't send it + args = { + "token": apiKey, + "user": userKey, + "title": title.encode('utf-8'), + "message": msg.encode('utf-8'), + "timestamp": int(time.time()), + "retry": 60, + "expire": 3600, + } if sickbeard.PUSHOVER_DEVICE: args["device"] = sickbeard.PUSHOVER_DEVICE diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index bd5f37263c1422d85b9f3b5802c53d315b1aec65..db73bd7e944d9e4419421c3834cbf2298682875c 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -216,8 +216,8 @@ class NewznabProvider(generic.NZBProvider): if self.needs_auth and not self.key: logger.log(u"Incorrect authentication credentials for " + self.name + " : " + "API key is missing", - logger.DEBUG) - raise AuthException("Your authentication credentials for " + self.name + " are missing, check your config.") + logger.WARNING) + #raise AuthException("Your authentication credentials for " + self.name + " are missing, check your config.") return True diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py index 2a11ba34f5d54902fe607e42b3e288f1fd358296..27e35160e8e8d51696258333f1446573493c25b4 100644 --- a/sickbeard/providers/t411.py +++ b/sickbeard/providers/t411.py @@ -63,6 +63,8 @@ class T411Provider(generic.TorrentProvider): self.subcategories = [433, 637, 455, 639] + self.session = requests.Session() + def isEnabled(self): return self.enabled @@ -83,17 +85,15 @@ class T411Provider(generic.TorrentProvider): login_params = {'username': self.username, 'password': self.password} - self.session = requests.Session() - logger.log('Performing authentication to T411', logger.DEBUG) try: response = helpers.getURL(self.urls['login_page'], post_data=login_params, timeout=30, session=self.session, json=True) except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError), e: - logger.log(u'Unable to connect to ' + self.name + ' provider: ' + ex(e), logger.ERROR) + logger.log(u'Unable to connect to ' + self.name + ' provider: ' + ex(e), logger.WARNING) return False - if 'token' in response: + if response and 'token' in response: self.token = response['token'] self.tokenLastUpdate = time.time() self.uid = response['uid'].encode('ascii', 'ignore') @@ -101,12 +101,14 @@ class T411Provider(generic.TorrentProvider): logger.log('Using T411 Authorization token : ' + self.token, logger.DEBUG) return True else: - logger.log('T411 token not found in authentication response', logger.ERROR) + logger.log('T411 token not found in authentication response', logger.WARNING) return False def _get_season_search_strings(self, ep_obj): - search_string = {'Season': []} + if not ep_obj: + return [search_string] + 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] @@ -120,35 +122,26 @@ class T411Provider(generic.TorrentProvider): return [search_string] def _get_episode_search_strings(self, ep_obj, add_string=''): - search_string = {'Episode': []} - if not ep_obj: - return [] + return [search_string] - if self.show.air_by_date: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = sanitizeSceneName(show_name) + '.' + \ - str(ep_obj.airdate).replace('-', '|') - search_string['Episode'].append(ep_string) - elif self.show.sports: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = sanitizeSceneName(show_name) + '.' + \ - str(ep_obj.airdate).replace('-', '|') + '|' + \ + for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): + ep_string = sanitizeSceneName(show_name) + '.' + if self.show.air_by_date: + ep_string += str(ep_obj.airdate).replace('-', '|') + elif self.show.sports: + ep_string += 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) + '.' + \ - sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep_obj.scene_season, - 'episodenumber': ep_obj.scene_episode} + ' %s' % add_string + elif self.show.anime: + ep_string += "%i" % int(ep_obj.scene_absolute_number) + else: + ep_string += sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep_obj.scene_season, + 'episodenumber': ep_obj.scene_episode} - search_string['Episode'].append(re.sub('\s+', '.', ep_string)) + if add_string: + ep_string += ' %s' % add_string + search_string['Episode'].append(re.sub('\s+', '.', ep_string)) return [search_string] @@ -159,6 +152,9 @@ class T411Provider(generic.TorrentProvider): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} + if not self._doLogin(): + return results + for mode in search_params.keys(): for search_string in search_params[mode]: @@ -180,28 +176,28 @@ class T411Provider(generic.TorrentProvider): torrents = data['torrents'] - if len(torrents) > 0: - for torrent in torrents: - try: - torrent_name = torrent['name'] - torrent_id = torrent['id'] - torrent_download_url = (self.urls['download'] % torrent_id).encode('utf8') - - if not torrent_name or not torrent_download_url: - continue - - item = torrent_name, torrent_download_url - logger.log(u"Found result: " + torrent_name + " (" + torrent_download_url + ")", - logger.DEBUG) - items[mode].append(item) - except Exception as e: - logger.log(u"Invalid torrent data, skipping results: {0}".format(str(torrent)), logger.DEBUG) - continue - else: + if not torrents: logger.log(u"The Data returned from " + self.name + " do not contains any torrent", logger.WARNING) continue + for torrent in torrents: + try: + torrent_name = torrent['name'] + torrent_id = torrent['id'] + torrent_download_url = (self.urls['download'] % torrent_id).encode('utf8') + + if not torrent_name or not torrent_download_url: + continue + + item = torrent_name, torrent_download_url + logger.log(u"Found result: " + torrent_name + " (" + torrent_download_url + ")", + logger.DEBUG) + items[mode].append(item) + except Exception as e: + logger.log(u"Invalid torrent data, skipping results: {0}".format(str(torrent)), logger.DEBUG) + continue + except Exception, e: logger.log(u"Failed parsing " + self.name + " Traceback: " + traceback.format_exc(), logger.ERROR) @@ -243,9 +239,11 @@ class T411Provider(generic.TorrentProvider): curEp = self.show.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') - for item in self._doSearch(searchString[0]): + searchResults = self._doSearch(searchString[0]) + for item in searchResults: title, url = self._get_title_and_url(item) - results.append(classes.Proper(title, url, datetime.datetime.today(), self.show)) + if title and url: + results.append(classes.Proper(title, url, datetime.datetime.today(), self.show)) return results diff --git a/sickbeard/search.py b/sickbeard/search.py index 3969b457b502b48e7fa710b0b24c11e829f9d6ae..32c453fa27425185f2a818237f5f7e843bd93507 100644 --- a/sickbeard/search.py +++ b/sickbeard/search.py @@ -331,9 +331,7 @@ def wantedEpisodes(show, fromDate): highestBestQuality = 0 # if we need a better one then say yes - if (curStatus in (common.DOWNLOADED, common.SNATCHED, common.SNATCHED_PROPER, - common.SNATCHED_BEST) and curQuality < highestBestQuality) or curStatus == common.WANTED: - + if (curStatus in (common.DOWNLOADED, common.SNATCHED, common.SNATCHED_PROPER) and curQuality < highestBestQuality) or curStatus == common.WANTED: epObj = show.getEpisode(int(result["season"]), int(result["episode"])) epObj.wantedQuality = [i for i in allQualities if (i > curQuality and i != common.Quality.UNKNOWN)] wanted.append(epObj) diff --git a/sickbeard/searchBacklog.py b/sickbeard/searchBacklog.py index 0c36135bb080712f271c0235a726857bdd07cd1e..a7a710b90026502e84b92ea281ac5c2626ac71db 100644 --- a/sickbeard/searchBacklog.py +++ b/sickbeard/searchBacklog.py @@ -159,9 +159,7 @@ class BacklogSearcher: highestBestQuality = 0 # if we need a better one then say yes - if (curStatus in (common.DOWNLOADED, common.SNATCHED, common.SNATCHED_PROPER, - common.SNATCHED_BEST) and curQuality < highestBestQuality) or curStatus == common.WANTED: - + if (curStatus in (common.DOWNLOADED, common.SNATCHED, common.SNATCHED_PROPER) and curQuality < highestBestQuality) or curStatus == common.WANTED: epObj = show.getEpisode(int(result["season"]), int(result["episode"])) if epObj.season not in wanted: wanted[epObj.season] = [epObj] diff --git a/sickbeard/subtitles.py b/sickbeard/subtitles.py index cf1e6737d6151c42bad8a20d2217bc6e9d9c4cba..0b5477d3958f0872989fdda8794e9b1a22263bd0 100644 --- a/sickbeard/subtitles.py +++ b/sickbeard/subtitles.py @@ -123,8 +123,12 @@ class SubtitlesFinder(): The SubtitlesFinder will be executed every hour but will not necessarly search and download subtitles. Only if the defined rule is true """ + def __init__(self): + self.amActive = False def run(self, force=False): + + self.amActive = True if not sickbeard.USE_SUBTITLES: return @@ -135,7 +139,7 @@ class SubtitlesFinder(): logger.log(u'Checking for subtitles', logger.INFO) # get episodes on which we want subtitles - # criteria is: + # criteria is: # - show subtitles = 1 # - episode subtitles != config wanted languages or SINGLE (depends on config multi) # - search count < 2 and diff(airdate, now) > 1 week : now -> 1d @@ -168,22 +172,22 @@ class SubtitlesFinder(): # Old shows rule throwaway = datetime.datetime.strptime('20110101', '%Y%m%d') if ((epToSub['airdate_daydiff'] > 7 and epToSub['searchcount'] < 2 and now - datetime.datetime.strptime(epToSub['lastsearch'], '%Y-%m-%d %H:%M:%S') > datetime.timedelta(hours=rules['old'][epToSub['searchcount']])) or - # Recent shows rule + # Recent shows rule (epToSub['airdate_daydiff'] <= 7 and epToSub['searchcount'] < 7 and now - datetime.datetime.strptime(epToSub['lastsearch'], '%Y-%m-%d %H:%M:%S') > datetime.timedelta(hours=rules['new'][epToSub['searchcount']]))): logger.log('Downloading subtitles for episode %dx%d of show %s' % (epToSub['season'], epToSub['episode'], epToSub['show_name']), logger.DEBUG) - + showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(epToSub['showid'])) if not showObj: logger.log(u'Show not found', logger.DEBUG) return - + epObj = showObj.getEpisode(int(epToSub["season"]), int(epToSub["episode"])) if isinstance(epObj, str): logger.log(u'Episode not found', logger.DEBUG) return previous_subtitles = epObj.subtitles - + try: epObj.downloadSubtitles() except Exception as e: @@ -195,6 +199,8 @@ class SubtitlesFinder(): if newSubtitles: logger.log(u'Downloaded subtitles for S%02dE%02d in %s' % (epToSub["season"], epToSub["episode"], ', '.join(newSubtitles))) + self.amActive = False + def _getRules(self): """ Define the hours to wait between 2 subtitles search depending on: diff --git a/sickbeard/traktChecker.py b/sickbeard/traktChecker.py index cd02445533924c06f3a8122b0839f84ab5bb735e..2dd8bf67eb218bb5a649afe43c3d94cf7caa5236 100644 --- a/sickbeard/traktChecker.py +++ b/sickbeard/traktChecker.py @@ -67,8 +67,11 @@ class TraktChecker(): self.ShowWatchlist = {} self.EpisodeWatchlist = {} self.Collectionlist = {} + self.amActive = False def run(self, force=False): + + self.amActive = True # add shows from trakt.tv watchlist if sickbeard.TRAKT_SYNC_WATCHLIST: @@ -87,6 +90,8 @@ class TraktChecker(): self.syncLibrary() except Exception: logger.log(traceback.format_exc(), logger.DEBUG) + + self.amActive = False def findShow(self, indexer, indexerid): traktShow = None diff --git a/sickbeard/tv.py b/sickbeard/tv.py index cf6ae5a99826a9b4c16807623b3ab791882f3bc0..cb6f2ff3b9682e358d1b07c2e4312ebc72dee3fe 100644 --- a/sickbeard/tv.py +++ b/sickbeard/tv.py @@ -117,7 +117,7 @@ class TVShow(object): self.episodes = {} self.nextaired = "" self.release_groups = None - + otherShow = helpers.findCertainShow(sickbeard.showList, self.indexerid) if otherShow != None: raise exceptions.MultipleShowObjectsException("Can't create a show if it already exists") @@ -831,8 +831,8 @@ class TVShow(object): self.imdbid = sqlResults[0]["imdb_id"] if self.is_anime: - self.release_groups = BlackAndWhiteList(self.indexerid) - + self.release_groups = BlackAndWhiteList(self.indexerid) + # Get IMDb_info from database myDB = db.DBConnection() sqlResults = myDB.select("SELECT * FROM imdb_info WHERE indexer_id = ?", [self.indexerid]) @@ -1096,7 +1096,7 @@ class TVShow(object): with curEp.lock: # if it used to have a file associated with it and it doesn't anymore then set it to sickbeard.EP_DEFAULT_DELETED_STATUS if curEp.location and curEp.status in Quality.DOWNLOADED: - logger.log(u"%s: Location for S%02dE%02d doesn't exist, removing it and changing our status to %s" % + logger.log(u"%s: Location for S%02dE%02d doesn't exist, removing it and changing our status to %s" % (self.indexerid, season, episode, statusStrings[sickbeard.EP_DEFAULT_DELETED_STATUS]) ,logger.DEBUG) curEp.status = sickbeard.EP_DEFAULT_DELETED_STATUS curEp.subtitles = list() @@ -1137,7 +1137,7 @@ class TVShow(object): except Exception: logger.log("%s: Error occurred when downloading subtitles for %s" % (self.indexerid, self.name), logger.DEBUG) - logger.log(traceback.format_exc(), logger.ERROR) + logger.log(traceback.format_exc(), logger.ERROR) def saveToDB(self, forceSave=False): @@ -1276,7 +1276,7 @@ class TVShow(object): logger.DEBUG) # if we are re-downloading then we only want it if it's in our bestQualities list and better than what we have, or we only have one bestQuality and we do not have that quality yet - if curStatus in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST and quality in bestQualities and (quality > curQuality or curQuality not in bestQualities): + if curStatus in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER and quality in bestQualities and (quality > curQuality or curQuality not in bestQualities): logger.log(u"Episode already exists but the found episode quality is wanted more, getting found episode", logger.DEBUG) return True @@ -1301,7 +1301,7 @@ class TVShow(object): return Overview.SKIPPED elif epStatus == ARCHIVED: return Overview.GOOD - elif epStatus in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.FAILED + Quality.SNATCHED_BEST: + elif epStatus in Quality.DOWNLOADED + Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.FAILED + Quality.SNATCHED_BEST + Quality.ARCHIVED: anyQualities, bestQualities = Quality.splitQuality(self.quality) # @UnusedVariable if bestQualities: @@ -2017,7 +2017,7 @@ class TVEpisode(object): def saveToDB(self, forceSave=False): """ Saves this episode to the database if any of its data has been changed since the last save. - + forceSave: If True it will save to the database even if no data has been changed since the last save (aka if the record is not dirty). """ @@ -2087,7 +2087,7 @@ class TVEpisode(object): Returns the name of this episode in a "pretty" human-readable format. Used for logging and notifications and such. - Returns: A string representing the episode's name and season/ep numbers + Returns: A string representing the episode's name and season/ep numbers """ if self.show.anime and not self.show.scene: @@ -2141,7 +2141,7 @@ class TVEpisode(object): """ Generates a replacement map for this episode which maps all possible custom naming patterns to the correct value for this episode. - + Returns: A dict with patterns as the keys and their replacement values as the values. """ @@ -2181,11 +2181,11 @@ class TVEpisode(object): show_name = re.sub("\(\d+\)$", "", self.show.name).rstrip() else: show_name = self.show.name - + #try to get the release group rel_grp = {}; rel_grp["SiCKRAGE"] = 'SiCKRAGE'; - if hasattr(self, 'location'): #from the location name + if hasattr(self, 'location'): #from the location name rel_grp['location'] = release_group(self.show, self.location); if (rel_grp['location'] == ''): del rel_grp['location'] if hasattr(self, '_release_group'): #from the release group field in db @@ -2194,14 +2194,14 @@ class TVEpisode(object): if hasattr(self, 'release_name'): #from the release name field in db rel_grp['release_name'] = release_group(self.show, self.release_name); if (rel_grp['release_name'] == ''): del rel_grp['release_name'] - - # use release_group, release_name, location in that order + + # use release_group, release_name, location in that order if ('database' in rel_grp): relgrp = 'database' elif ('release_name' in rel_grp): relgrp = 'release_name' elif ('location' in rel_grp): relgrp = 'location' - else: relgrp = 'SiCKRAGE' - - + else: relgrp = 'SiCKRAGE' + + return { '%SN': show_name, '%S.N': dot(show_name), @@ -2271,30 +2271,30 @@ class TVEpisode(object): replace_map = self._replace_map() result_name = pattern - + # if there's no release group in the db, let the user know we replaced it - if (not hasattr(self, '_release_group') and (not replace_map['%RG'] == 'SiCKRAGE')): + if (not hasattr(self, '_release_group') and (not replace_map['%RG'] == 'SiCKRAGE')): logger.log(u"Episode has no release group, replacing it with '" + replace_map['%RG'] + "'", logger.DEBUG); self._release_group = replace_map['%RG'] #if release_group is not in the db, put it there elif ((self._release_group == '') and (not replace_map['%RG'] == 'SiCKRAGE')): logger.log(u"Episode has no release group, replacing it with '" + replace_map['%RG'] + "'", logger.DEBUG); self._release_group = replace_map['%RG'] #if release_group is not in the db, put it there - + # if there's no release name then replace it with a reasonable facsimile if not replace_map['%RN']: if self.show.air_by_date or self.show.sports: result_name = result_name.replace('%RN', '%S.N.%A.D.%E.N-' + replace_map['%RG']) result_name = result_name.replace('%rn', '%s.n.%A.D.%e.n-' + replace_map['%RG'].lower()) - + elif anime_type != 3: result_name = result_name.replace('%RN', '%S.N.%AB.%E.N-' + replace_map['%RG']) result_name = result_name.replace('%rn', '%s.n.%ab.%e.n-' + replace_map['%RG'].lower()) - + else: result_name = result_name.replace('%RN', '%S.N.S%0SE%0E.%E.N-' + replace_map['%RG']) result_name = result_name.replace('%rn', '%s.n.s%0se%0e.%e.n-' + replace_map['%RG'].lower()) - + logger.log(u"Episode has no release name, replacing it with a generic one: " + result_name, logger.DEBUG) if not replace_map['%RT']: @@ -2418,7 +2418,7 @@ class TVEpisode(object): return result_name def proper_path(self): - """ + """ Figures out the path where this episode SHOULD live according to the renaming rules, relative from the show dir """ @@ -2537,8 +2537,8 @@ class TVEpisode(object): #First get the absolute proper-path dir proper_related_dir = ek.ek(os.path.dirname, ek.ek(os.path.abspath, absolute_proper_path + file_ext)) proper_related_path = absolute_proper_path.replace(proper_related_dir, proper_related_dir + subfolder) - - + + cur_result = helpers.rename_ep_file(cur_related_file, proper_related_path, absolute_current_path_no_ext_length + len(subfolder)) if not cur_result: diff --git a/sickbeard/versionChecker.py b/sickbeard/versionChecker.py index 897b04b0573e44b40274f7e9b40a986ed5570db7..93e21f3f41be9c6f14aa32ea54608cb54e1dc619 100644 --- a/sickbeard/versionChecker.py +++ b/sickbeard/versionChecker.py @@ -59,6 +59,8 @@ class CheckVersion(): self.updater = SourceUpdateManager() def run(self, force=False): + + self.amActive = True if self.updater: # set current branch version @@ -76,6 +78,8 @@ class CheckVersion(): else: logger.log(u"Update failed!") ui.notifications.message('Update failed!') + + self.amActive = False def run_backup_if_safe(self): return self.safe_to_update() is True and self._runbackup() is True diff --git a/sickbeard/webapi.py b/sickbeard/webapi.py index e1133420ad6269c42b025ed9a2e54d916df94fab..97a2ea7018a298bbd3fa481073715039013a658d 100644 --- a/sickbeard/webapi.py +++ b/sickbeard/webapi.py @@ -80,8 +80,8 @@ class ApiHandler(RequestHandler): def __init__(self, *args, **kwargs): super(ApiHandler, self).__init__(*args, **kwargs) - def set_default_headers(self): - self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + #def set_default_headers(self): + #self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') def get(self, *args, **kwargs): kwargs = self.request.arguments @@ -1387,7 +1387,8 @@ class CMD_PostProcess(ApiCall): "force_replace": {"desc": "Force already Post Processed Dir/Files"}, "return_data": {"desc": "Returns result for the process"}, "process_method": {"desc": "Symlink, hardlink, move or copy the file"}, - "is_priority": {"desc": "Replace the file even if it exists in a higher quality)"}, + "is_priority": {"desc": "Replace the file even if it exists in a higher quality"}, + "failed": {"desc": "Mark download as failed"}, "type": {"desc": "What type of postprocess request is this, auto of manual"} } } diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index c5d6c11d8f8053d2f444ed246c92cdbedbfe6f51..4e52d53c83121df7cf92fc7247429ac3a354b0a3 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -48,7 +48,7 @@ from sickbeard.scene_numbering import get_scene_numbering, set_scene_numbering, get_xem_numbering_for_show, get_scene_absolute_numbering_for_show, get_xem_absolute_numbering_for_show, \ get_scene_absolute_numbering -import imdbPopular +from imdbPopular import imdb_popular from dateutil import tz, parser as dateutil_parser from unrar2 import RarFile @@ -159,8 +159,8 @@ class BaseHandler(RequestHandler): def __init__(self, *args, **kwargs): super(BaseHandler, self).__init__(*args, **kwargs) - def set_default_headers(self): - self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0') + #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 @@ -392,15 +392,13 @@ class WebRoot(WebHandler): if which == 'banner_thumb': image_file_name = cache_obj.banner_thumb_path(show) if which == 'fanart': - if not cache_obj.has_fanart(show): - cache_obj.fill_cache(sickbeard.helpers.findCertainShow(sickbeard.showList, int(show))) image_file_name = cache_obj.fanart_path(show) if ek.ek(os.path.isfile, image_file_name): static_image_path = os.path.normpath(image_file_name.replace(sickbeard.CACHE_DIR, '/cache')) static_image_path = static_image_path.replace('\\', '/') - return self.redirect(static_image_path) + return self.redirect(static_image_path, permanent=True) def showNetworkLogo(self, show=None): show = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) @@ -412,7 +410,7 @@ class WebRoot(WebHandler): static_image_path = '%s/images/network/%s.png' % (sickbeard.WEB_ROOT, image_file_name) - return self.redirect(static_image_path) + return self.redirect(static_image_path, permanent=True) def setHomeLayout(self, layout): @@ -2575,13 +2573,14 @@ class HomeAddShows(Home): Fetches data from IMDB to show a list of popular shows. """ t = PageTemplate(rh=self, file="home_popularShows.mako") + e = None try: - popular_shows = imdbPopular.fetch_popular_shows() - except: + popular_shows = imdb_popular.fetch_popular_shows() + except Exception as e: popular_shows = None - return t.render(submenu = self.HomeMenu(), popular_shows=popular_shows) + return t.render(submenu = self.HomeMenu(), popular_shows=popular_shows, imdb_exception=e) def addShowToBlacklist(self, indexer_id): @@ -3951,8 +3950,8 @@ class ConfigSearch(Config): nzbget_host=None, nzbget_use_https=None, backlog_frequency=None, dailysearch_frequency=None, nzb_method=None, torrent_method=None, usenet_retention=None, download_propers=None, check_propers_interval=None, allow_high_priority=None, sab_forced=None, - randomize_providers=None, backlog_startup=None, use_failed_downloads=None, delete_failed=None, - dailysearch_startup=None, torrent_dir=None, torrent_username=None, torrent_password=None, torrent_host=None, + randomize_providers=None, use_failed_downloads=None, delete_failed=None, + torrent_dir=None, torrent_username=None, torrent_password=None, torrent_host=None, torrent_label=None, torrent_label_anime=None, torrent_path=None, torrent_verify_cert=None, torrent_seed_time=None, torrent_paused=None, torrent_high_bandwidth=None, torrent_rpcurl=None, torrent_auth_type = None, ignore_words=None, require_words=None): @@ -3987,8 +3986,6 @@ class ConfigSearch(Config): sickbeard.ALLOW_HIGH_PRIORITY = config.checkbox_to_value(allow_high_priority) - sickbeard.DAILYSEARCH_STARTUP = config.checkbox_to_value(dailysearch_startup) - sickbeard.BACKLOG_STARTUP = config.checkbox_to_value(backlog_startup) sickbeard.USE_FAILED_DOWNLOADS = config.checkbox_to_value(use_failed_downloads) sickbeard.DELETE_FAILED = config.checkbox_to_value(delete_failed)