diff --git a/gui/slick/interfaces/default/config_general.tmpl b/gui/slick/interfaces/default/config_general.tmpl index fda5dfd1eccbeafc1f4aca5709e00005ac651995..aff6a9b2e5d01713a31173b8c3162c429a0bc9c6 100644 --- a/gui/slick/interfaces/default/config_general.tmpl +++ b/gui/slick/interfaces/default/config_general.tmpl @@ -323,6 +323,9 @@ <span class="component-desc"> <input type="checkbox" name="filter_row" id="filter_row" #if $sickbeard.FILTER_ROW == True then 'checked="checked"' else ''#/> <p>Add a filter row to the show display on the home page</p> + <p>Supports =, >, >=, <=, <, xx to yy , xx - yy</p> + <p><b>Note:</b> =, >, >=, <=, < should be first, followed by a space, then the value.</p> + <p>Examples: '> 90', '= 100', '0 to 99'</p> </span> </label> </div> diff --git a/gui/slick/interfaces/default/manage_episodeStatuses.tmpl b/gui/slick/interfaces/default/manage_episodeStatuses.tmpl index 78a67891baeee3bebf6e17555f5248ddfbec30f8..4f7a06fc3cc4f3718d9e55ae6bc64f5350605134 100644 --- a/gui/slick/interfaces/default/manage_episodeStatuses.tmpl +++ b/gui/slick/interfaces/default/manage_episodeStatuses.tmpl @@ -61,6 +61,7 @@ $statusList.remove($int($whichStatus)) $statusList.append($common.FAILED) #end if +<select> #for $curStatus in $statusList: <option value="$curStatus">$common.statusStrings[$curStatus]</option> #end for diff --git a/gui/slick/interfaces/default/restart_bare.tmpl b/gui/slick/interfaces/default/restart_bare.tmpl index f48b50d69551236631326b8704049f864d0ac587..ac795e04f8a8a035131f5f61158a745fbd255e42 100644 --- a/gui/slick/interfaces/default/restart_bare.tmpl +++ b/gui/slick/interfaces/default/restart_bare.tmpl @@ -18,11 +18,12 @@ sbHttpPort = "$curSBHttpPort"; sbHttpsEnabled = "$curSBHttpsEnabled"; sbHandleReverseProxy = "$curSBHandleReverseProxy"; sbHost = "$curSBHost"; +sbDefaultPage = "$sbDefaultPage"; //--> </script> <script type="text/javascript" src="$sbRoot/js/lib/jquery-1.11.2.min.js?$sbPID"></script> -<script type="text/javascript" src="$sbRoot/js/restart.js?$sbPID"></script> +<script type="text/javascript" src="$sbRoot/js/restart.js?$sbPID&$sbDefaultPage"></script> #set themeSpinner = '-dark' if 'dark' == themeSpinner else '' <h2>Performing Restart</h2> @@ -41,7 +42,7 @@ Waiting for SickRage to start again: </div> <div id="refresh_message" style="display: none;"> -Loading the home page: +Loading the default page: <img src="$sbRoot/images/loading16${themeSpinner}.gif" height="16" width="16" id="refresh_loading" /> </div> diff --git a/gui/slick/js/restart.js b/gui/slick/js/restart.js index 1ee32d09fa3b3a36e361842f94e5586e0cf0f30e..ae7fb75b6007ecea0ddc6083f7d0afe1f14304dd 100644 --- a/gui/slick/js/restart.js +++ b/gui/slick/js/restart.js @@ -38,7 +38,7 @@ $(document).ready(function() { $('#restart_loading').hide(); $('#restart_success').show(); $('#refresh_message').show(); - setTimeout(function(){window.location = sbRoot + '/home/';}, 5000); + setTimeout(function(){window.location = sbRoot + '/' + sbDefaultPage + '/';}, 5000); } } diff --git a/sickbeard/db.py b/sickbeard/db.py index e1045711e7f09f2380978610b9f325579df46675..a5f8701f7c2ee99e2667ed77d9a6ed0b3f6fe843 100644 --- a/sickbeard/db.py +++ b/sickbeard/db.py @@ -229,19 +229,23 @@ class DBConnection(object): def _unicode_text_factory(self, x): try: + # Already unicode, empty string, or ascii x = unicode(x) except Exception: try: - x = unicode(x, sickbeard.SYS_ENCODING) + # most common encoding from web + x = unicode(x, 'utf-8') except Exception: try: - x = unicode(x, 'utf-8') + # most common from web if utf-8 fails + x = unicode(x, 'latin-1') except Exception: try: - x = unicode(x, 'latin-1') + # try system encoding before trusting chardet + x = unicode(x, sickbeard.SYS_ENCODING) except Exception: try: - # Chardet can be wrong, so try it before ignoring + # Chardet can be wrong, so try it last before ignoring x = unicode(x, chardet.detect(x).get('encoding')) except Exception: x = unicode(x, sickbeard.SYS_ENCODING, errors="ignore") diff --git a/sickbeard/encodingKludge.py b/sickbeard/encodingKludge.py index 04a2ec27d5dc990febda5d48730784d2600ef4bc..622cfc8aba371da49777df10a1bad3f9eddafda9 100644 --- a/sickbeard/encodingKludge.py +++ b/sickbeard/encodingKludge.py @@ -26,16 +26,19 @@ def _toUnicode(x): x = unicode(x) except Exception: try: - x = unicode(x, sickbeard.SYS_ENCODING) + x = unicode(x, 'utf-8') except Exception: try: - x = unicode(x, 'utf-8') + x = unicode(x, 'latin-1') except Exception: try: - x = unicode(x, 'latin-1') + x = unicode(x, sickbeard.SYS_ENCODING) except Exception: - # Chardet can be wrong, so try it last - x = unicode(x, chardet.detect(x).get('encoding')) + try: + # Chardet can be wrong, so try it last + x = unicode(x, chardet.detect(x).get('encoding')) + except Exception: + x = unicode(x, sickbeard.SYS_ENCODING, 'replace') return x def ss(x): diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index aaacd1fd65e219572f90f6d549194534f28f8327..4ee1a49d8f6e95a3682747a87c51dc27dfdf4f62 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -145,6 +145,7 @@ def remove_non_release_groups(name): '^\[ www\.Cpasbien\.com \] ': 'searchre', '^\[www\.Cpasbien\.com\] ': 'searchre', '^\[www\.Cpasbien\.pe\] ': 'searchre', + '^\[www\.frenchtorrentdb\.com\] ': 'searchre', } _name = name @@ -1347,8 +1348,6 @@ def headURL(url, params=None, headers={}, timeout=30, session=None, json=False, logger.log(u"Requested headURL " + url + " returned status code is " + str( resp.status_code) + ': ' + codeDescription(resp.status_code), logger.DEBUG) return False - else: - logger.log(u"Requested headURL " + url + " returned status code is " + str(resp.status_code) , logger.DEBUG) if proxyGlypeProxySSLwarning is not None: if re.search('The site you are attempting to browse is on a secure connection', resp.text): @@ -1402,8 +1401,6 @@ def getURL(url, post_data=None, params={}, headers={}, timeout=30, session=None, logger.log(u"Requested getURL " + url + " returned status code is " + str( resp.status_code) + ': ' + codeDescription(resp.status_code), logger.DEBUG) return - else: - logger.log(u"Requested getURL " + url + " returned status code is " + str(resp.status_code), logger.DEBUG) if proxyGlypeProxySSLwarning is not None: if re.search('The site you are attempting to browse is on a secure connection', resp.text): diff --git a/sickbeard/providers/btn.py b/sickbeard/providers/btn.py index 4a2c6aaaeb5b3d79c4ed3788057ddfbe884bf5cd..1ca0085ab3806dfe5c1588e99471009a333cbe7d 100644 --- a/sickbeard/providers/btn.py +++ b/sickbeard/providers/btn.py @@ -33,7 +33,7 @@ from sickbeard.exceptions import ex, AuthException from sickbeard.common import MULTI_EP_RESULT, SEASON_RESULT, USER_AGENT from sickbeard import db from sickbeard.name_parser.parser import NameParser, InvalidNameException, InvalidShowException -from sickbeard.common import Quality +from sickbeard.common import Quality, cpu_presets import jsonrpclib from datetime import datetime @@ -144,6 +144,7 @@ class BTNProvider(generic.TorrentProvider): try: parsedJSON = server.getTorrents(apikey, params, int(results_per_page), int(offset)) + time.sleep(cpu_presets[sickbeard.CPU_PRESET]) except jsonrpclib.jsonrpc.ProtocolError, error: if error.message == 'Call Limit Exceeded': diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 644a4e77ac433b3d4c679eae6b6e113e85499a82..ffa29e2d5a36b9177b853dd01c189e7b8fbdc548 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -96,13 +96,13 @@ class html_entities(CheetahFilter): filtered = unicode(val) except Exception: try: - filtered = unicode(val, sickbeard.SYS_ENCODING) + filtered = unicode(val, 'utf-8') except Exception: try: - filtered = unicode(val, 'utf-8') + filtered = unicode(val, 'latin-1') except Exception: try: - filtered = unicode(val, 'latin-1') + filtered = unicode(val, sickbeard.SYS_ENCODING) except Exception: logger.log(u'Unable to decode using %s, utf-8, or latin-1. Falling back to chardet!' % sickbeard.SYS_ENCODING, logger.ERROR) @@ -129,6 +129,7 @@ class PageTemplate(CheetahTemplate): self.sbHttpsEnabled = sickbeard.ENABLE_HTTPS self.sbHandleReverseProxy = sickbeard.HANDLE_REVERSE_PROXY self.sbThemeName = sickbeard.THEME_NAME + self.sbDefaultPage = sickbeard.DEFAULT_PAGE self.sbLogin = rh.get_current_user() if rh.request.headers['Host'][0] == '[': @@ -432,7 +433,7 @@ class WebRoot(WebHandler): layout = 'poster' sickbeard.HOME_LAYOUT = layout - + #Dont redirect to default page so user can see new layout return self.redirect("/home/") def setPosterSortBy(self, sort): @@ -1116,7 +1117,7 @@ class Home(WebRoot): def shutdown(self, pid=None): if str(pid) != str(sickbeard.PID): - return self.redirect("/home/") + return self.redirect('/' + sickbeard.DEFAULT_PAGE +'/') sickbeard.events.put(sickbeard.events.SystemEvent.SHUTDOWN) @@ -1127,7 +1128,7 @@ class Home(WebRoot): def restart(self, pid=None): if str(pid) != str(sickbeard.PID): - return self.redirect("/home/") + return self.redirect('/' + sickbeard.DEFAULT_PAGE +'/') t = PageTemplate(rh=self, file="restart.tmpl") t.submenu = self.HomeMenu() @@ -1143,7 +1144,7 @@ class Home(WebRoot): sickbeard.versionCheckScheduler.action.check_for_new_version(force=True) - return self.redirect('/home/') + return self.redirect('/' + sickbeard.DEFAULT_PAGE +'/') def update(self, pid=None): @@ -1165,7 +1166,7 @@ class Home(WebRoot): return self._genericMessage("Update Failed", "Update wasn't successful, not restarting. Check your log for more information.") else: - return self.redirect('/home/') + return self.redirect('/' + sickbeard.DEFAULT_PAGE +'/') def branchCheckout(self, branch): if sickbeard.BRANCH != branch: @@ -1174,7 +1175,7 @@ class Home(WebRoot): return self.update(sickbeard.PID) else: ui.notifications.message('Already on branch: ', branch) - return self.redirect('/home') + return self.redirect('/' + sickbeard.DEFAULT_PAGE +'/') def getDBcompare(self, branchDest=None): @@ -1598,7 +1599,8 @@ class Home(WebRoot): (showObj.name, ('deleted', 'trashed')[sickbeard.TRASH_REMOVE_SHOW], ('(media untouched)', '(with all related media)')[bool(full)])) - return self.redirect("/home/") + #Dont redirect to default page so user can confirm show was deleted + return self.redirect('/home/') def refreshShow(self, show=None): @@ -1698,7 +1700,7 @@ class Home(WebRoot): def setStatus(self, show=None, eps=None, status=None, direct=False): - if show is None or eps is None or status is None: + if not all([show, eps, status]): errMsg = "You must specify a show and at least one episode" if direct: ui.notifications.error('Error', errMsg) @@ -1716,7 +1718,7 @@ class Home(WebRoot): showObj = sickbeard.helpers.findCertainShow(sickbeard.showList, int(show)) - if showObj is None: + if not showObj: errMsg = "Error", "Show not in show list" if direct: ui.notifications.error('Error', errMsg) @@ -1726,18 +1728,25 @@ class Home(WebRoot): segments = {} trakt_data = [] - if eps is not None: + if eps: sql_l = [] for curEp in eps.split('|'): + if not curEp: + logger.log(u"curEp was empty when trying to setStatus", logger.DEBUG) + logger.log(u"Attempting to set status on episode " + curEp + " to " + status, logger.DEBUG) epInfo = curEp.split('x') + if not all(epInfo): + logger.log(u"Something went wrong when trying to setStatus, epInfo[0]: %s, epInfo[1]: %s" % (epInfo[0], epInfo[1]), logger.DEBUG) + continue + epObj = showObj.getEpisode(int(epInfo[0]), int(epInfo[1])) - if epObj is None: + if not epObj: return self._genericMessage("Error", "Episode couldn't be retrieved") if int(status) in [WANTED, FAILED]: @@ -1753,16 +1762,14 @@ class Home(WebRoot): logger.log(u"Refusing to change status of " + curEp + " because it is UNAIRED", logger.ERROR) continue - if int( - status) in Quality.DOWNLOADED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.DOWNLOADED + [ + if int(status) in Quality.DOWNLOADED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.DOWNLOADED + [ IGNORED] and not ek.ek(os.path.isfile, epObj.location): logger.log( u"Refusing to change status of " + curEp + " to DOWNLOADED because it's not SNATCHED/DOWNLOADED", logger.ERROR) continue - if int( - status) == FAILED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.DOWNLOADED: + if int(status) == FAILED and epObj.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + Quality.DOWNLOADED: logger.log( u"Refusing to change status of " + curEp + " to FAILED because it's not SNATCHED/DOWNLOADED", logger.ERROR) @@ -2707,6 +2714,7 @@ class HomeAddShows(Home): logger.log(u"Unable to create the folder " + show_dir + ", can't add the show", logger.ERROR) ui.notifications.error("Unable to add show", "Unable to create the folder " + show_dir + ", can't add the show") + #Dont redirect to default page because user wants to see the new show return self.redirect("/home/") else: helpers.chmodAsParent(show_dir) @@ -3799,7 +3807,9 @@ class ConfigGeneral(Config): sickbeard.PROXY_INDEXERS = config.checkbox_to_value(proxy_indexers) sickbeard.GIT_USERNAME = git_username sickbeard.GIT_PASSWORD = git_password - sickbeard.GIT_RESET = config.checkbox_to_value(git_reset) + #sickbeard.GIT_RESET = config.checkbox_to_value(git_reset) + #Force GIT_RESET + sickbeard.GIT_RESET = 1 sickbeard.GIT_AUTOISSUES = config.checkbox_to_value(git_autoissues) sickbeard.GIT_PATH = git_path sickbeard.GIT_REMOTE = git_remote