diff --git a/CHANGES.md b/CHANGES.md index e5c1db8..ea9022e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -92,6 +92,11 @@ * Update Tornado Web Server 4.5.dev1 (92f29b8) to 4.5.dev1 (38e493e) +### 0.12.27 (2017-08-22 19:00:00 UTC) + +* Update to UnRar 5.50 release + + ### 0.12.26 (2017-08-20 13:05:00 UTC) * Fix infinite loop loading network_timezones diff --git a/lib/rarfile/UnRAR.exe b/lib/rarfile/UnRAR.exe index e9ecd84..9c5a18e 100644 Binary files a/lib/rarfile/UnRAR.exe and b/lib/rarfile/UnRAR.exe differ diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index d14147f..4687b97 100755 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -86,6 +86,8 @@ subtitlesFinderScheduler = None # traktCheckerScheduler = None background_mapping_task = None +provider_ping_thread_pool = {} + showList = None UPDATE_SHOWS_ON_START = False SHOW_UPDATE_HOUR = 3 @@ -532,7 +534,8 @@ def initialize(console_logging=True): # global traktCheckerScheduler global recentSearchScheduler, backlogSearchScheduler, showUpdateScheduler, \ versionCheckScheduler, showQueueScheduler, searchQueueScheduler, \ - properFinderScheduler, autoPostProcesserScheduler, subtitlesFinderScheduler, background_mapping_task + properFinderScheduler, autoPostProcesserScheduler, subtitlesFinderScheduler, background_mapping_task, \ + provider_ping_thread_pool # Add Show Defaults global STATUS_DEFAULT, QUALITY_DEFAULT, SHOW_TAG_DEFAULT, FLATTEN_FOLDERS_DEFAULT, SUBTITLES_DEFAULT, \ WANTED_BEGIN_DEFAULT, WANTED_LATEST_DEFAULT, SCENE_DEFAULT, ANIME_DEFAULT @@ -1365,6 +1368,13 @@ def start(): indexermapper.indexer_list = [i for i in indexerApi().all_indexers] background_mapping_task.start() + for p in providers.sortedProviderList(): + if p.is_active() and getattr(p, 'ping_freq', None): + # noinspection PyProtectedMember + provider_ping_thread_pool[p.get_id()] = threading.Thread( + name='PING-PROVIDER %s' % p.name, target=p._ping) + provider_ping_thread_pool[p.get_id()].start() + for thread in enabled_schedulers(is_init=True): thread.start() @@ -1411,6 +1421,15 @@ def halt(): except RuntimeError: pass + for p in provider_ping_thread_pool: + provider_ping_thread_pool[p].stop = True + + for p in provider_ping_thread_pool: + try: + provider_ping_thread_pool[p].join(10) + except RuntimeError: + pass + if ADBA_CONNECTION: try: ADBA_CONNECTION.logout() diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 12714b1..82912e1 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -26,6 +26,7 @@ import os import re import time import urlparse +import threading from urllib import quote_plus import zlib from base64 import b16encode, b32decode @@ -698,6 +699,19 @@ class GenericProvider: pass return long(math.ceil(value)) + def _should_stop(self): + if getattr(threading.currentThread(), 'stop', False): + return True + return False + + def _sleep_with_stop(self, t): + t_l = t + while t_l > 0: + time.sleep(3) + t_l -= 3 + if self._should_stop(): + return + class NZBProvider(object, GenericProvider): @@ -795,7 +809,7 @@ class NZBProvider(object, GenericProvider): class TorrentProvider(object, GenericProvider): - def __init__(self, name, supports_backlog=True, anime_only=False, cache_update_freq=None): + def __init__(self, name, supports_backlog=True, anime_only=False, cache_update_freq=None, update_freq=None): GenericProvider.__init__(self, name, supports_backlog, anime_only) self.providerType = GenericProvider.TORRENT @@ -807,6 +821,8 @@ class TorrentProvider(object, GenericProvider): self.cache._cache_data = self._cache_data if cache_update_freq: self.cache.update_freq = cache_update_freq + self.ping_freq = update_freq + self.ping_skip = None @property def url(self): @@ -1163,3 +1179,12 @@ class TorrentProvider(object, GenericProvider): def _cache_data(self, **kwargs): return self._search_provider({'Cache': ['']}) + + def _ping(self): + while not self._should_stop(): + if self.ping_skip: + self.ping_skip -= 1 + else: + self.ping_skip = ((60*60)/self.ping_freq, None)[self._authorised()] + + self._sleep_with_stop(self.ping_freq) diff --git a/sickbeard/providers/speedcd.py b/sickbeard/providers/speedcd.py index 5612ba3..c7e6dac 100644 --- a/sickbeard/providers/speedcd.py +++ b/sickbeard/providers/speedcd.py @@ -26,7 +26,7 @@ from sickbeard.helpers import tryInt class SpeedCDProvider(generic.TorrentProvider): def __init__(self): - generic.TorrentProvider.__init__(self, 'SpeedCD', cache_update_freq=20) + generic.TorrentProvider.__init__(self, 'SpeedCD', cache_update_freq=20, update_freq=4*60) self.url_base = 'https://speed.cd/' self.urls = {'config_provider_home_uri': self.url_base, diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index f30bc6a..eb49aff 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -5276,6 +5276,35 @@ class ConfigProviders(Config): return '1' + def checkProvidersPing(self): + for p in sickbeard.providers.sortedProviderList(): + if getattr(p, 'ping_freq', None): + if p.is_active() and (p.get_id() not in sickbeard.provider_ping_thread_pool + or not sickbeard.provider_ping_thread_pool[p.get_id()].is_alive()): + # noinspection PyProtectedMember + sickbeard.provider_ping_thread_pool[p.get_id()] = threading.Thread( + name='PING-PROVIDER %s' % p.name, target=p._ping) + sickbeard.provider_ping_thread_pool[p.get_id()].start() + elif not p.is_active() and p.get_id() in sickbeard.provider_ping_thread_pool: + sickbeard.provider_ping_thread_pool[p.get_id()].stop = True + try: + sickbeard.provider_ping_thread_pool[p.get_id()].join(120) + if not sickbeard.provider_ping_thread_pool[p.get_id()].is_alive(): + sickbeard.provider_ping_thread_pool.pop(p.get_id()) + except RuntimeError: + pass + + # stop removed providers + prov = [n.get_id() for n in sickbeard.providers.sortedProviderList()] + for p in [x for x in sickbeard.provider_ping_thread_pool if x not in prov]: + sickbeard.provider_ping_thread_pool[p].stop = True + try: + sickbeard.provider_ping_thread_pool[p].join(120) + if not sickbeard.provider_ping_thread_pool[p].is_alive(): + sickbeard.provider_ping_thread_pool.pop(p) + except RuntimeError: + pass + def saveProviders(self, newznab_string='', torrentrss_string='', provider_order=None, **kwargs): results = [] @@ -5473,6 +5502,9 @@ class ConfigProviders(Config): sickbeard.save_config() + cp = threading.Thread(name='Check-Ping-Providers', target=self.checkProvidersPing) + cp.start() + if 0 < len(results): for x in results: logger.log(x, logger.ERROR)