diff --git a/SickBeard.py b/SickBeard.py index 4a012f45f48fdf178664f588bf7f3c7d1830aa70..ca0115142f2d5d4c029cf2b758d8e7304ff3f8d4 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -349,6 +349,16 @@ class SickRage(object): if self.consoleLogging: print "Starting up SickRage " + sickbeard.BRANCH + " from " + sickbeard.CONFIG_FILE + # Clean up after update + if sickbeard.GIT_NEWVER: + toclean = os.path.join(sickbeard.CACHE_DIR, 'mako') + for root, dirs, files in os.walk(toclean, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + sickbeard.GIT_NEWVER = False + # Fire up all our threads sickbeard.start() diff --git a/gui/slick/images/network/colors.png b/gui/slick/images/network/colors.png new file mode 100644 index 0000000000000000000000000000000000000000..d694d92c97ed7e9e98a555bfd00ad3a0d38eb7f2 Binary files /dev/null and b/gui/slick/images/network/colors.png differ diff --git a/gui/slick/images/providers/getstrike.png b/gui/slick/images/providers/getstrike.png new file mode 100644 index 0000000000000000000000000000000000000000..a857f5ff2ff01a19cacb5317669646091a10348b Binary files /dev/null and b/gui/slick/images/providers/getstrike.png differ diff --git a/gui/slick/views/config_anime.mako b/gui/slick/views/config_anime.mako index 08008cc050cb55ca8c42427efdd4d23ca8243a48..2c2b0db61b11982e6836b72ccde2d98ce78a666f 100644 --- a/gui/slick/views/config_anime.mako +++ b/gui/slick/views/config_anime.mako @@ -35,7 +35,7 @@ <input type="checkbox" class="enabler" name="use_anidb" id="use_anidb" ${('', 'checked="checked"')[bool(sickbeard.USE_ANIDB)]} /> <label for="use_notifo"> <span class="component-title">Enable</span> - <span class="component-desc">Should Sick Beard use data from AniDB?</span> + <span class="component-desc">Should SickRage use data from AniDB?</span> </label> </div> diff --git a/gui/slick/views/home.mako b/gui/slick/views/home.mako index 1d17f1306f17cb9e4893ee4766af9aaec4d609d8..36fdcbbe0b7f5d97b4b065a542034fdee2543492 100644 --- a/gui/slick/views/home.mako +++ b/gui/slick/views/home.mako @@ -386,10 +386,6 @@ $(document).ready(function(){ $.tablesorter.columnSelector.attachTo( $('#showListTableAnime'), '#popover-target'); % endif }); - - // Hides size column for now until we can fix it - $('[data-show-size]').hide(); - $('[data-column="6"]').hide(); }); </script> </%block> diff --git a/gui/slick/views/viewlogs.mako b/gui/slick/views/viewlogs.mako index 26e0a720ced0cf145203b36fd95afae5bdc9e086..c9b955c6d18e88681873c355c31eebf7d19c85c1 100644 --- a/gui/slick/views/viewlogs.mako +++ b/gui/slick/views/viewlogs.mako @@ -19,6 +19,7 @@ function(){ $('#logSearch').prop('disabled', true); url = '${sbRoot}/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val() $.get(url, function(data){ + history.pushState('data', '', url); $('pre').html($(data).find('pre').html()); $('#minLevel').removeProp('disabled'); $('#logFilter').removeProp('disabled'); @@ -40,14 +41,20 @@ function(){ document.body.style.cursor='default'; }); - $('#logSearch').keyup(function() { + $('#logSearch').on('keyup', function() { if ( $('#logSearch').val().length == 0 ) { - $('#logFilter option[value=\\<NONE\\>]').prop('selected', true); + $('#logFilter option[value=<NONE>]').prop('selected', true); $('#minLevel option[value=20]').prop('selected', true); $('#minLevel').prop('disabled', false); $('#logFilter').prop('disabled', false); url = '${sbRoot}/errorlogs/viewlog/?minLevel='+$('select[name=minLevel]').val()+'&logFilter='+$('select[name=logFilter]').val()+'&logSearch='+$('#logSearch').val() - window.location.href = url + $.get(url, function(data){ + history.pushState('data', '', url); + $('pre').html($(data).find('pre').html()); + $('#minLevel').removeProp('disabled'); + $('#logFilter').removeProp('disabled'); + $('#logSearch').removeProp('disabled'); + }); } else { $('#minLevel').prop('disabled', true); $('#logFilter').prop('disabled', true); diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 523e52e78e92c9bd4a6ae01e9c2919ac97103266..319de37564c3c3ccf9545d35468a2d8f25962b38 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -39,7 +39,7 @@ from sickbeard import providers from sickbeard.providers.generic import GenericProvider from sickbeard.providers import btn, newznab, womble, thepiratebay, torrentleech, kat, iptorrents, \ omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, nextgen, speedcd, nyaatorrents, animenzb, bluetigers, cpasbien, fnt, xthor, torrentbytes, \ - frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, scenetime, btdigg + frenchtorrentdb, freshontv, titansoftv, libertalia, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, scenetime, btdigg, strike from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, \ naming_ep_type from sickbeard import searchBacklog, showUpdater, versionChecker, properFinder, autoPostProcesser, \ @@ -135,6 +135,7 @@ GIT_USERNAME = None GIT_PASSWORD = None GIT_PATH = None GIT_AUTOISSUES = False +GIT_NEWVER = False DEVELOPER = False INIT_LOCK = Lock() @@ -558,7 +559,7 @@ def get_backlog_cycle_time(): def initialize(consoleLogging=True): with INIT_LOCK: - global BRANCH, GIT_RESET, GIT_REMOTE, GIT_REMOTE_URL, CUR_COMMIT_HASH, CUR_COMMIT_BRANCH, ACTUAL_LOG_DIR, LOG_DIR, LOG_NR, LOG_SIZE, WEB_PORT, WEB_LOG, ENCRYPTION_VERSION, ENCRYPTION_SECRET, WEB_ROOT, WEB_USERNAME, WEB_PASSWORD, WEB_HOST, WEB_IPV6, WEB_COOKIE_SECRET, WEB_USE_GZIP, API_KEY, API_ROOT, ENABLE_HTTPS, HTTPS_CERT, HTTPS_KEY, \ + global BRANCH, GIT_RESET, GIT_REMOTE, GIT_REMOTE_URL, CUR_COMMIT_HASH, CUR_COMMIT_BRANCH, GIT_NEWVER, ACTUAL_LOG_DIR, LOG_DIR, LOG_NR, LOG_SIZE, WEB_PORT, WEB_LOG, ENCRYPTION_VERSION, ENCRYPTION_SECRET, WEB_ROOT, WEB_USERNAME, WEB_PASSWORD, WEB_HOST, WEB_IPV6, WEB_COOKIE_SECRET, WEB_USE_GZIP, API_KEY, API_ROOT, ENABLE_HTTPS, HTTPS_CERT, HTTPS_KEY, \ HANDLE_REVERSE_PROXY, USE_NZBS, USE_TORRENTS, NZB_METHOD, NZB_DIR, DOWNLOAD_PROPERS, RANDOMIZE_PROVIDERS, CHECK_PROPERS_INTERVAL, ALLOW_HIGH_PRIORITY, SAB_FORCED, TORRENT_METHOD, \ SAB_USERNAME, SAB_PASSWORD, SAB_APIKEY, SAB_CATEGORY, SAB_CATEGORY_ANIME, SAB_HOST, \ NZBGET_USERNAME, NZBGET_PASSWORD, NZBGET_CATEGORY, NZBGET_CATEGORY_ANIME, NZBGET_PRIORITY, NZBGET_HOST, NZBGET_USE_HTTPS, backlogSearchScheduler, \ @@ -639,6 +640,7 @@ def initialize(consoleLogging=True): # git login info GIT_USERNAME = check_setting_str(CFG, 'General', 'git_username', '') GIT_PASSWORD = check_setting_str(CFG, 'General', 'git_password', '', censor_log=True) + GIT_NEWVER = bool(check_setting_int(CFG, 'General', 'git_newver', 0)) DEVELOPER = bool(check_setting_int(CFG, 'General', 'developer', 0)) # debugging @@ -1619,6 +1621,7 @@ def save_config(): new_config['General']['git_remote_url'] = GIT_REMOTE_URL new_config['General']['cur_commit_hash'] = CUR_COMMIT_HASH new_config['General']['cur_commit_branch'] = CUR_COMMIT_BRANCH + new_config['General']['git_newver'] = int(GIT_NEWVER) new_config['General']['config_version'] = CONFIG_VERSION new_config['General']['encryption_version'] = int(ENCRYPTION_VERSION) new_config['General']['encryption_secret'] = ENCRYPTION_SECRET diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 6121ba7ee2bd6a4d0e6382236a1193e226a97635..d30caaede43f352f0220782a6ac7201e6974fe55 100644 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -52,6 +52,7 @@ __all__ = ['womble', 'xthor', 'scenetime', 'btdigg', + 'strike', ] import sickbeard diff --git a/sickbeard/providers/strike.py b/sickbeard/providers/strike.py new file mode 100644 index 0000000000000000000000000000000000000000..9b55d426ffb767e7fbe8d2722c2f7259fa988262 --- /dev/null +++ b/sickbeard/providers/strike.py @@ -0,0 +1,167 @@ +# Author: matigonkas +# URL: https://github.com/SiCKRAGETV/sickrage +# +# This file is part of SickRage. +# +# SickRage is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# SickRage is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with SickRage. If not, see <http://www.gnu.org/licenses/>. + +import datetime +import generic + +from sickbeard import logger +from sickbeard import tvcache +from sickbeard import show_name_helpers +from sickbeard import db +from sickbeard.common import WANTED +from sickbeard.config import naming_ep_type +from sickbeard.helpers import sanitizeSceneName + +class STRIKEProvider(generic.TorrentProvider): + + def __init__(self): + generic.TorrentProvider.__init__(self, "Strike") + + self.supportsBacklog = True + self.url = 'https://getstrike.net/' + + self.cache = StrikeCache(self) + self.minseed, self.minleech = 2 * [None] + + def isEnabled(self): + return self.enabled + + + def imageName(self): + return 'getstrike.png' + + + def _get_airbydate_season_range(self, season): + if season == None: + return () + year, month = map(int, season.split('-')) + min_date = datetime.date(year, month, 1) + if month == 12: + max_date = datetime.date(year, month, 31) + else: + max_date = datetime.date(year, month+1, 1) - datetime.timedelta(days=1) + return (min_date, max_date) + + + def _get_season_search_strings(self, show, season=None): + search_string = [] + + if not (show and season): + return [] + + myDB = db.DBConnection() + + if show.air_by_date: + (min_date, max_date) = self._get_airbydate_season_range(season) + sqlResults = myDB.select("SELECT DISTINCT airdate FROM tv_episodes WHERE showid = ? AND airdate >= ? AND airdate <= ? AND status = ?", [show.tvdbid, min_date.toordinal(), max_date.toordinal(), WANTED]) + else: + sqlResults = myDB.select("SELECT DISTINCT season FROM tv_episodes WHERE showid = ? AND season = ? AND status = ?", [show.tvdbid, season, WANTED]) + + for sqlEp in sqlResults: + for show_name in set(show_name_helpers.allPossibleShowNames(show)): + if show.air_by_date: + ep_string = sanitizeSceneName(show_name) +' '+ str(datetime.date.fromordinal(sqlEp["airdate"])).replace('-', '.') + search_string.append(ep_string) + else: + ep_string = sanitizeSceneName(show_name) + ' S%02d' % sqlEp["season"] + search_string.append(ep_string) + + return search_string + + + def _get_episode_search_strings(self, ep_obj, add_string=''): + + if not ep_obj: + return [] + + search_string = [] + + for show_name in set(show_name_helpers.allPossibleShowNames(ep_obj.show)): + ep_string = sanitizeSceneName(show_name) + if ep_obj.show.air_by_date: + ep_string += ' ' + str(ep_obj.airdate).replace('-', '.') + else: + ep_string += ' ' + naming_ep_type[2] % {'seasonnumber': ep_obj.season, 'episodenumber': ep_obj.episode} + + if len(add_string): + ep_string += ' %s' % add_string + + search_string.append(ep_string) + + return search_string + + + def _get_title_and_url(self, item): + title, url, size = item + if title: + title = self._clean_title_from_provider(title) + + if url: + url = str(url).replace('&', '&') + + return (title, url) + + + def _get_size(self, item): + title, url, size = item + logger.log(u'Size: %s' % size, logger.DEBUG) + + return size + + + def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None): + + logger.log("Performing Search: {0}".format(search_params)) + + searchUrl = self.url + "api/v2/torrents/search/?category=TV&phrase=" + search_params + + jdata = self.getURL(searchUrl, json=True) + if not jdata: + logger.log("No data returned to be parsed!!!") + return [] + + logger.log("URL to be parsed: " + searchUrl, logger.DEBUG) + + results = [] + + for item in jdata['torrents']: + seeders = ('seeds' in item and item['seeds']) or 0 + leechers = ('leeches' in item and item['leeches']) or 0 + if seeders < self.minseed or leechers < self.minleech: + continue + name = ('torrent_title' in item and item['torrent_title']) or '' + magnet = ('magnet_uri' in item and item['magnet_uri']) or '' + if name and magnet: + results.append((name, magnet, seeders)) + + return results + + +class StrikeCache(tvcache.TVCache): + def __init__(self, provider): + + tvcache.TVCache.__init__(self, provider) + + # set this 0 to suppress log line, since we aren't updating it anyways + self.minTime = 0 + + def _getRSSData(self): + # no rss for getstrike.net afaik, also can't search with empty string + return {'entries': {}} + +provider = STRIKEProvider() diff --git a/sickbeard/versionChecker.py b/sickbeard/versionChecker.py index 93e21f3f41be9c6f14aa32ea54608cb54e1dc619..dc81800ec12f43945b2adfc0917cc64f1ad91884 100644 --- a/sickbeard/versionChecker.py +++ b/sickbeard/versionChecker.py @@ -59,7 +59,7 @@ class CheckVersion(): self.updater = SourceUpdateManager() def run(self, force=False): - + self.amActive = True if self.updater: @@ -78,7 +78,7 @@ class CheckVersion(): else: logger.log(u"Update failed!") ui.notifications.message('Update failed!') - + self.amActive = False def run_backup_if_safe(self): @@ -470,7 +470,7 @@ class GitUpdateManager(UpdateManager): output, err, exit_status = self._run_git(self._git_path, 'fetch %s' % sickbeard.GIT_REMOTE) if not exit_status == 0: - logger.log(u"Unable to contact github, can't check for update", logger.ERROR) + logger.log(u"Unable to contact github, can't check for update", logger.WARNING) return # get latest commit_hash from remote @@ -575,13 +575,21 @@ class GitUpdateManager(UpdateManager): output, err, exit_status = self._run_git(self._git_path, 'checkout -f ' + self.branch) # @UnusedVariable if exit_status == 0: - self._find_installed_version() + output, err, exit_status = self._run_git(self._git_path, 'submodule update --init --recursive --force ' + self.branch) - # Notify update successful - if sickbeard.NOTIFY_ON_UPDATE: - notifiers.notify_git_update(sickbeard.CUR_COMMIT_HASH if sickbeard.CUR_COMMIT_HASH else "") + if exit_status == 0: + self._find_installed_version() + sickbeard.GIT_NEWVER = True + + # Notify update successful + if sickbeard.NOTIFY_ON_UPDATE: + notifiers.notify_git_update(sickbeard.CUR_COMMIT_HASH if sickbeard.CUR_COMMIT_HASH else "") + + return True + + else: + return False - return True else: return False