diff --git a/gui/slick/views/config_general.mako b/gui/slick/views/config_general.mako index f369fcce3a37c313daf47f2ada7de6494f0d47df..682614802d7d3383a5699c7b3d88ad1211db3968 100644 --- a/gui/slick/views/config_general.mako +++ b/gui/slick/views/config_general.mako @@ -431,6 +431,16 @@ </label> </div> + <div class="field-pair"> + <label for="notify_on_login"> + <span class="component-title">Notify on login</span> + <span class="component-desc"> + <input type="checkbox" name="notify_on_login" class="enabler" id="notify_on_login" ${('', 'checked="checked"')[bool(sickbeard.NOTIFY_ON_LOGIN)]}/> + <p>enable to be notified when a new login happens in webserver</p> + </span> + </label> + </div> + <div class="field-pair"> <label for="web_ipv6"> <span class="component-title">Listen on IPv6</span> diff --git a/gui/slick/views/config_providers.mako b/gui/slick/views/config_providers.mako index 738c0867e724db8e090412f4a34f6e92f5edc262..80240628c9703e0537b2fb92471e457198bf887d 100644 --- a/gui/slick/views/config_providers.mako +++ b/gui/slick/views/config_providers.mako @@ -456,7 +456,7 @@ $('#config-components').tabs(); <span class="component-title">Ranked torrents</span> <span class="component-desc"> <input type="checkbox" name="${curTorrentProvider.get_id()}_ranked" id="${curTorrentProvider.get_id()}_ranked" ${('', 'checked="checked"')[bool(curTorrentProvider.ranked)]} /> - <p>only download ranked torrents (internal releases)</p> + <p>only download ranked torrents (trusted releases)</p> </span> </label> </div> @@ -468,7 +468,7 @@ $('#config-components').tabs(); <span class="component-title">English torrents</span> <span class="component-desc"> <input type="checkbox" name="${curTorrentProvider.get_id()}_engrelease" id="${curTorrentProvider.get_id()}_engrelease" ${('', 'checked="checked"')[bool(curTorrentProvider.engrelease)]} /> - <p>only download english torrents ,or torrents containing english subtitles</p> + <p>only download english torrents, or torrents containing english subtitles</p> </span> </label> </div> @@ -507,7 +507,7 @@ $('#config-components').tabs(); <span class="component-title">Freeleech</span> <span class="component-desc"> <input type="checkbox" name="${curTorrentProvider.get_id()}_freeleech" id="${curTorrentProvider.get_id()}_freeleech" ${('', 'checked="checked"')[bool(curTorrentProvider.freeleech)]}/> - <p>only download <b>[FreeLeech]</b> torrents.</p> + <p>only download <b>"FreeLeech"</b> torrents.</p> </span> </label> </div> diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index dfe627411d080e9f83c723ac66eb2f431cf319cd..8cd96b162a23a70ae3ea6a43ee265096bdce6767 100644 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -180,6 +180,7 @@ API_KEY = None API_ROOT = None ENABLE_HTTPS = False +NOTIFY_ON_LOGIN = False HTTPS_CERT = None HTTPS_KEY = None @@ -575,7 +576,7 @@ def initialize(consoleLogging=True): with INIT_LOCK: 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, 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, \ + 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, NOTIFY_ON_LOGIN, \ SAB_USERNAME, SAB_PASSWORD, SAB_APIKEY, SAB_CATEGORY, SAB_CATEGORY_BACKLOG, SAB_CATEGORY_ANIME, SAB_CATEGORY_ANIME_BACKLOG, SAB_HOST, \ NZBGET_USERNAME, NZBGET_PASSWORD, NZBGET_CATEGORY, NZBGET_CATEGORY_BACKLOG, NZBGET_CATEGORY_ANIME, NZBGET_CATEGORY_ANIME_BACKLOG, NZBGET_PRIORITY, NZBGET_HOST, NZBGET_USE_HTTPS, backlogSearchScheduler, \ TORRENT_USERNAME, TORRENT_PASSWORD, TORRENT_HOST, TORRENT_PATH, TORRENT_SEED_TIME, TORRENT_PAUSED, TORRENT_HIGH_BANDWIDTH, TORRENT_LABEL, TORRENT_LABEL_ANIME, TORRENT_VERIFY_CERT, TORRENT_RPCURL, TORRENT_AUTH_TYPE, \ @@ -815,6 +816,8 @@ def initialize(consoleLogging=True): ENABLE_HTTPS = bool(check_setting_int(CFG, 'General', 'enable_https', 0)) + NOTIFY_ON_LOGIN = bool(check_setting_int(CFG, 'General', 'notify_on_login', 0)) + HTTPS_CERT = check_setting_str(CFG, 'General', 'https_cert', 'server.crt') HTTPS_KEY = check_setting_str(CFG, 'General', 'https_key', 'server.key') @@ -1688,6 +1691,7 @@ def save_config(): new_config['General']['debug'] = int(DEBUG) new_config['General']['default_page'] = DEFAULT_PAGE new_config['General']['enable_https'] = int(ENABLE_HTTPS) + new_config['General']['notify_on_login'] = int(NOTIFY_ON_LOGIN) new_config['General']['https_cert'] = HTTPS_CERT new_config['General']['https_key'] = HTTPS_KEY new_config['General']['handle_reverse_proxy'] = int(HANDLE_REVERSE_PROXY) diff --git a/sickbeard/common.py b/sickbeard/common.py index 731aaa84896b266d875e8d8e09217072db5e7e74..3af49f8ce9b90fdd20e242bf125a79fdeb900255 100644 --- a/sickbeard/common.py +++ b/sickbeard/common.py @@ -78,13 +78,17 @@ NOTIFY_DOWNLOAD = 2 NOTIFY_SUBTITLE_DOWNLOAD = 3 NOTIFY_GIT_UPDATE = 4 NOTIFY_GIT_UPDATE_TEXT = 5 +NOTIFY_LOGIN = 6 +NOTIFY_LOGIN_TEXT = 7 notifyStrings = NumDict({ NOTIFY_SNATCH: "Started Download", NOTIFY_DOWNLOAD: "Download Finished", NOTIFY_SUBTITLE_DOWNLOAD: "Subtitle Download Finished", NOTIFY_GIT_UPDATE: "SickRage Updated", - NOTIFY_GIT_UPDATE_TEXT: "SickRage Updated To Commit#: " + NOTIFY_GIT_UPDATE_TEXT: "SickRage Updated To Commit#: ", + NOTIFY_LOGIN : "SickRage new login", + NOTIFY_LOGIN_TEXT : "New login from IP: {0}. http://geomaplookup.net/?ip={0}" }) # Episode statuses diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py index 5aa6f95c16b8d189b00fe7e199a2166c110f6769..4d86695a3450e09029aa603aaf8d3f43c9ed2814 100644 --- a/sickbeard/helpers.py +++ b/sickbeard/helpers.py @@ -1757,3 +1757,10 @@ def getTVDBFromID(indexer_id, indexer): return tvdb_id else: return tvdb_id + +def is_ip_private(ip): + priv_lo = re.compile("^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$") + priv_24 = re.compile("^10\.\d{1,3}\.\d{1,3}\.\d{1,3}$") + priv_20 = re.compile("^192\.168\.\d{1,3}.\d{1,3}$") + priv_16 = re.compile("^172.(1[6-9]|2[0-9]|3[0-1]).[0-9]{1,3}.[0-9]{1,3}$") + return priv_lo.match(ip) or priv_24.match(ip) or priv_20.match(ip) or priv_16.match(ip) diff --git a/sickbeard/notifiers/__init__.py b/sickbeard/notifiers/__init__.py index 4ed59e1f7c62e9933dd781af5811876840d012fc..ab4472ec4acc4b3d791af006584f468f8dbb7867 100644 --- a/sickbeard/notifiers/__init__.py +++ b/sickbeard/notifiers/__init__.py @@ -107,3 +107,8 @@ def notify_snatch(ep_name): def notify_git_update(new_version=""): for n in notifiers: n.notify_git_update(new_version) + + +def notify_login(ipaddress): + for n in notifiers: + n.notify_login(ipaddress) diff --git a/sickbeard/notifiers/boxcar2.py b/sickbeard/notifiers/boxcar2.py index 5bb79cd7490b93b79eeed2c5f87c1094d73a5506..28fadc43eade167bfc260bf47748d60e4abb7272 100644 --- a/sickbeard/notifiers/boxcar2.py +++ b/sickbeard/notifiers/boxcar2.py @@ -104,6 +104,12 @@ class Boxcar2Notifier(object): title = notifyStrings[NOTIFY_GIT_UPDATE] self._notifyBoxcar2(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_BOXCAR2: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notifyBoxcar2(title, update_text.format(ipaddress)) + def _notifyBoxcar2(self, title, message, accesstoken=None): """ Sends a boxcar2 notification based on the provided info or SB config diff --git a/sickbeard/notifiers/emailnotify.py b/sickbeard/notifiers/emailnotify.py index 34249c92de064129a725b9fcab8a7d0e73b216ab..ce8d4ead9d3e3935946f8e9dcbb20cf63b963be1 100644 --- a/sickbeard/notifiers/emailnotify.py +++ b/sickbeard/notifiers/emailnotify.py @@ -170,6 +170,9 @@ class EmailNotifier(object): def notify_git_update(self, new_version="??"): pass + def notify_login(self, ipaddress=""): + pass + def _generate_recipients(self, show): addrs = [] myDB = db.DBConnection() diff --git a/sickbeard/notifiers/freemobile.py b/sickbeard/notifiers/freemobile.py index dc040d819291291f3f54d8ba86ec3b74484ad209..bf9ac00b4bb0ae5a85aaad1c0adb145ec60a281d 100644 --- a/sickbeard/notifiers/freemobile.py +++ b/sickbeard/notifiers/freemobile.py @@ -102,6 +102,12 @@ class FreeMobileNotifier(object): title = notifyStrings[NOTIFY_GIT_UPDATE] self._notifyFreeMobile(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_FREEMOBILE: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notifyFreeMobile(title, update_text.format(ipaddress)) + def _notifyFreeMobile(self, title, message, cust_id=None, apiKey=None, force=False): """ Sends a SMS notification diff --git a/sickbeard/notifiers/growl.py b/sickbeard/notifiers/growl.py index a1a234c4442c59e3622d34d3b686b253136be8af..aa86c8aa6ec2672083679d0a1471d0920427f08a 100644 --- a/sickbeard/notifiers/growl.py +++ b/sickbeard/notifiers/growl.py @@ -52,6 +52,12 @@ class GrowlNotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._sendGrowl(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_GROWL: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._sendGrowl(title, update_text.format(ipaddress)) + def _send_growl(self, options, message=None): # Send Notification diff --git a/sickbeard/notifiers/kodi.py b/sickbeard/notifiers/kodi.py index aeb35c7a872a497a25d6c0280a0ecd20fdc2a150..2e9f36b022b508a27d5c2d6e43b1e88865ec5a13 100644 --- a/sickbeard/notifiers/kodi.py +++ b/sickbeard/notifiers/kodi.py @@ -531,6 +531,12 @@ class KODINotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._notify_kodi(update_text + new_version, title) + def notify_login(self, ipaddress=""): + if sickbeard.USE_KODI: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notify_kodi(update_text.format(ipaddress), title) + def test_notify(self, host, username, password): return self._notify_kodi("Testing KODI notifications from SickRage", "Test Notification", host, username, password, force=True) diff --git a/sickbeard/notifiers/libnotify.py b/sickbeard/notifiers/libnotify.py index ab4efff673a9e51ba30a22db6e920d880d56381a..40a6c1c69ba63425362a224bcc35fec518412fd2 100644 --- a/sickbeard/notifiers/libnotify.py +++ b/sickbeard/notifiers/libnotify.py @@ -102,6 +102,12 @@ class LibnotifyNotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._notify(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_LIBNOTIFY: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notify(title, update_text.format(ipaddress)) + def test_notify(self): return self._notify('Test notification', "This is a test notification from SickRage", force=True) diff --git a/sickbeard/notifiers/nma.py b/sickbeard/notifiers/nma.py index d34e11089a139663901d93a400f925ac72fa9037..ad5ea24d4cfdcd898d544d47065864d318aecd68 100644 --- a/sickbeard/notifiers/nma.py +++ b/sickbeard/notifiers/nma.py @@ -32,6 +32,14 @@ class NMA_Notifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._sendNMA(nma_api=None, nma_priority=None, event=title, message=update_text + new_version) + + def notify_login(self, ipaddress=""): + if sickbeard.USE_NMA: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._sendNMA(nma_api=None, nma_priority=None, event=title, message=update_text.format(ipaddress)) + + def _sendNMA(self, nma_api=None, nma_priority=None, event=None, message=None, force=False): title = 'SickRage' diff --git a/sickbeard/notifiers/nmj.py b/sickbeard/notifiers/nmj.py index 8b8be514480d0b8fb88c74c0f13c0eedc46e414d..47e8309f1b927d96704f6edc19861ad5802f958e 100644 --- a/sickbeard/notifiers/nmj.py +++ b/sickbeard/notifiers/nmj.py @@ -101,6 +101,9 @@ class NMJNotifier(object): return False # Not implemented, no reason to start scanner. + def notify_login(self, ipaddress=""): + return False + def test_notify(self, host, database, mount): return self._sendNMJ(host, database, mount) diff --git a/sickbeard/notifiers/nmjv2.py b/sickbeard/notifiers/nmjv2.py index a99b8c92fc9fb7d8700eac05d0037d64d95b4871..9a4d57fddefb1db3d5d630cb4acb4f8faee31954 100644 --- a/sickbeard/notifiers/nmjv2.py +++ b/sickbeard/notifiers/nmjv2.py @@ -47,6 +47,9 @@ class NMJv2Notifier(object): return False # Not implemented, no reason to start scanner. + def notify_login(self, ipaddress=""): + return False + def test_notify(self, host): return self._sendNMJ(host) diff --git a/sickbeard/notifiers/plex.py b/sickbeard/notifiers/plex.py index 941b8223c309f1905310e365b14003e7bec31d51..e0e0987b182e3d554b5dd2faeef01e9e085e9b1d 100644 --- a/sickbeard/notifiers/plex.py +++ b/sickbeard/notifiers/plex.py @@ -156,6 +156,13 @@ class PLEXNotifier(object): if update_text and title and new_version: self._notify_pmc(update_text + new_version, title) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PLEX: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + if update_text and title and new_version: + self._notify_pmc(update_text.format(ipaddress), title) + def test_notify_pmc(self, host, username, password): return self._notify_pmc('This is a test notification from SickRage', 'Test Notification', host, username, password, force=True) diff --git a/sickbeard/notifiers/prowl.py b/sickbeard/notifiers/prowl.py index 8f1bde7513000c7c962459a29398ba97c36bfb4c..fd47d5a6387c875c17c8ed619d8ec0953d8dcdc4 100644 --- a/sickbeard/notifiers/prowl.py +++ b/sickbeard/notifiers/prowl.py @@ -86,6 +86,12 @@ class ProwlNotifier(object): self._send_prowl(prowl_api=None, prowl_priority=None, event=title, message=update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PROWL: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._send_prowl(prowl_api=None, prowl_priority=None, + event=title, message=update_text.format(ipaddress)) @staticmethod def _generate_recipients(show=None): diff --git a/sickbeard/notifiers/pushalot.py b/sickbeard/notifiers/pushalot.py index 77c0ea71488c139c4542624a242e298341002cea..6a3c82b02a0c457172d6ea3cbee246f93e18c0f6 100644 --- a/sickbeard/notifiers/pushalot.py +++ b/sickbeard/notifiers/pushalot.py @@ -57,6 +57,14 @@ class PushalotNotifier(object): event=title, message=update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PUSHALOT: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._sendPushalot(pushalot_authorizationtoken=None, + event=title, + message=update_text.format(ipaddress)) + def _sendPushalot(self, pushalot_authorizationtoken=None, event=None, message=None, force=False): if not sickbeard.USE_PUSHALOT and not force: diff --git a/sickbeard/notifiers/pushbullet.py b/sickbeard/notifiers/pushbullet.py index 0e633b81eacbcce37ae3c80cb32b5b5c2ed380dc..2a218ba8661791b4f8c1dfe76472fac613b0fdb3 100644 --- a/sickbeard/notifiers/pushbullet.py +++ b/sickbeard/notifiers/pushbullet.py @@ -63,6 +63,10 @@ class PushbulletNotifier(object): if sickbeard.USE_PUSHBULLET: self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_GIT_UPDATE], message=notifyStrings[NOTIFY_GIT_UPDATE_TEXT] + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PUSHBULLET: + self._sendPushbullet(pushbullet_api=None, event=notifyStrings[NOTIFY_LOGIN], message=notifyStrings[NOTIFY_LOGIN_TEXT].format(ipaddress)) + def _sendPushbullet(self, pushbullet_api=None, pushbullet_device=None, event=None, message=None): if not (sickbeard.USE_PUSHBULLET or event == 'Test' or event is None): diff --git a/sickbeard/notifiers/pushover.py b/sickbeard/notifiers/pushover.py index 3d6ca648ccca34c78f88c5729502d2e9cc3c7eb1..a0914e7dd4b392738c51899a0f3d6b1c0952d70a 100644 --- a/sickbeard/notifiers/pushover.py +++ b/sickbeard/notifiers/pushover.py @@ -151,6 +151,12 @@ class PushoverNotifier(object): title = notifyStrings[NOTIFY_GIT_UPDATE] self._notifyPushover(title, update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_PUSHOVER: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notifyPushover(title, update_text.format(ipaddress)) + def _notifyPushover(self, title, message, sound=None, userKey=None, apiKey=None, force=False): """ Sends a pushover notification based on the provided info or SR config diff --git a/sickbeard/notifiers/pytivo.py b/sickbeard/notifiers/pytivo.py index dfdc8ab8991d663b9ae8ce2398ef156aefc65d96..c6fd68d6151ee4757a02edfc4cef7b58e9483d92 100644 --- a/sickbeard/notifiers/pytivo.py +++ b/sickbeard/notifiers/pytivo.py @@ -42,6 +42,9 @@ class pyTivoNotifier(object): def notify_git_update(self, new_version): pass + def notify_login(self, ipaddress=""): + pass + def update_library(self, ep_obj): # Values from config diff --git a/sickbeard/notifiers/synoindex.py b/sickbeard/notifiers/synoindex.py index b1275ce95b942699ec03eef9e121b5e6ef10261d..30c844feb5af6443a79466015a5bc64c986412ee 100644 --- a/sickbeard/notifiers/synoindex.py +++ b/sickbeard/notifiers/synoindex.py @@ -41,6 +41,9 @@ class synoIndexNotifier(object): def notify_git_update(self, new_version): pass + def notify_login(self, ipaddress=""): + pass + def moveFolder(self, old_path, new_path): self.moveObject(old_path, new_path) diff --git a/sickbeard/notifiers/synologynotifier.py b/sickbeard/notifiers/synologynotifier.py index 2f3f62d26f8d7871f782e421f844e628ec1110f6..cadac287d19021cbd7402695b9fc88fac1d9a191 100644 --- a/sickbeard/notifiers/synologynotifier.py +++ b/sickbeard/notifiers/synologynotifier.py @@ -47,6 +47,12 @@ class synologyNotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._send_synologyNotifier(update_text + new_version, title) + def notify_login(self, ipaddress=""): + if sickbeard.USE_SYNOLOGYNOTIFIER: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._send_synologyNotifier(update_text.format(ipaddress), title) + def _send_synologyNotifier(self, message, title): synodsmnotify_cmd = ["/usr/syno/bin/synodsmnotify", "@administrators", title, message] logger.log(u"Executing command " + str(synodsmnotify_cmd)) diff --git a/sickbeard/notifiers/trakt.py b/sickbeard/notifiers/trakt.py index 6733c5d1b38eb0e360a55fb88f9b4a89752e9b25..33c4a2873bdebb2bc3a5328ab56ae5dc8e04ed31 100644 --- a/sickbeard/notifiers/trakt.py +++ b/sickbeard/notifiers/trakt.py @@ -43,6 +43,9 @@ class TraktNotifier(object): def notify_git_update(self, new_version): pass + def notify_login(self, ipaddress=""): + pass + def update_library(self, ep_obj): """ Sends a request to trakt indicating that the given episode is part of our library. diff --git a/sickbeard/notifiers/tweet.py b/sickbeard/notifiers/tweet.py index 99f6554c098cbbe06431197eb0d2870b09bef144..0f114758019cda43527390b51191f5e54a28bfe3 100644 --- a/sickbeard/notifiers/tweet.py +++ b/sickbeard/notifiers/tweet.py @@ -60,6 +60,12 @@ class TwitterNotifier(object): title = common.notifyStrings[common.NOTIFY_GIT_UPDATE] self._notifyTwitter(title + " - " + update_text + new_version) + def notify_login(self, ipaddress=""): + if sickbeard.USE_TWITTER: + update_text = common.notifyStrings[common.NOTIFY_LOGIN_TEXT] + title = common.notifyStrings[common.NOTIFY_LOGIN] + self._notifyTwitter(title + " - " + update_text.format(ipaddress)) + def test_notify(self): return self._notifyTwitter("This is a test notification from SickRage", force=True) diff --git a/sickbeard/providers/alpharatio.py b/sickbeard/providers/alpharatio.py index 6b2dacb16f603ab1ec535ba167fe1a721cb0372e..d500d771cf24ecbda5ab576d80be7ad9c7a6bfad 100644 --- a/sickbeard/providers/alpharatio.py +++ b/sickbeard/providers/alpharatio.py @@ -53,7 +53,7 @@ class AlphaRatioProvider(TorrentProvider): self.cache = AlphaRatioCache(self) - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password, 'remember_me': 'on', @@ -71,12 +71,12 @@ class AlphaRatioProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -158,6 +158,6 @@ class AlphaRatioCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = AlphaRatioProvider() diff --git a/sickbeard/providers/animenzb.py b/sickbeard/providers/animenzb.py index 8db04088dc85478a2a27f608c0624a0818118caa..57d23009692293c9dd8d8eb504dad521f648180c 100644 --- a/sickbeard/providers/animenzb.py +++ b/sickbeard/providers/animenzb.py @@ -53,7 +53,7 @@ class animenzb(NZBProvider): def _get_episode_search_strings(self, ep_obj, add_string=''): return [x for x in show_name_helpers.makeSceneSearchString(self.show, ep_obj)] - def _do_search(self, search_string, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_string, age=0, ep_obj=None): logger.log(u"Search string: %s " % search_string, logger.DEBUG) @@ -85,7 +85,7 @@ class animenzb(NZBProvider): results = [] - for item in self._do_search("v2|v3|v4|v5"): + for item in self.search("v2|v3|v4|v5"): (title, url) = self._get_title_and_url(item) diff --git a/sickbeard/providers/bitcannon.py b/sickbeard/providers/bitcannon.py index 677c334ef45ce79cea626783e5327012e0a1d8a8..69b494e9ba0dcfc39071b67dc220b889e7e357d3 100644 --- a/sickbeard/providers/bitcannon.py +++ b/sickbeard/providers/bitcannon.py @@ -46,7 +46,7 @@ class BitCannonProvider(TorrentProvider): 'apiKey': '' } - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): # search_strings comes in one of these formats: # {'Episode': ['Italian Works S05E10']} # {'Season': ['Italian Works S05']} @@ -146,6 +146,6 @@ class BitCannonCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['tv', 'anime']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = BitCannonProvider() diff --git a/sickbeard/providers/bitsnoop.py b/sickbeard/providers/bitsnoop.py index d2d35ff79446593fea565dcfb2aee22a01cc1b34..7ff47b0171379439c0849d467f6162d3a36abffb 100644 --- a/sickbeard/providers/bitsnoop.py +++ b/sickbeard/providers/bitsnoop.py @@ -26,7 +26,7 @@ from sickrage.helper.common import try_int from sickrage.providers.TorrentProvider import TorrentProvider -class BitSnoopProvider(TorrentProvider): # pylint: disable=too-many-instance-attributes,too-many-arguments +class BitSnoopProvider(TorrentProvider): # pylint: disable=too-many-instance-attributes def __init__(self): TorrentProvider.__init__(self, "BitSnoop") @@ -47,7 +47,7 @@ class BitSnoopProvider(TorrentProvider): # pylint: disable=too-many-instance-att self.cache = BitSnoopCache(self) - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): # pylint: disable=too-many-branches,too-many-arguments,too-many-locals + def search(self, search_strings, age=0, ep_obj=None): # pylint: disable=too-many-branches,too-many-locals results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -136,7 +136,7 @@ class BitSnoopCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['rss']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = BitSnoopProvider() diff --git a/sickbeard/providers/bitsoup.py b/sickbeard/providers/bitsoup.py index a634aaf730304fc47c0af99805e8bdf0eb614b45..f8585c739dbd3d1904525f60756e23fe771bc0ab 100644 --- a/sickbeard/providers/bitsoup.py +++ b/sickbeard/providers/bitsoup.py @@ -57,7 +57,7 @@ class BitSoupProvider(TorrentProvider): return True - def _do_login(self): + def login(self): login_params = { 'username': self.username, @@ -76,12 +76,12 @@ class BitSoupProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -161,7 +161,7 @@ class BitSoupCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = BitSoupProvider() diff --git a/sickbeard/providers/bluetigers.py b/sickbeard/providers/bluetigers.py index f42c8e4b08df47b0daa49cb0200984aaf30c7a07..c3af540e1150240bac584fef9cecae73de518369 100644 --- a/sickbeard/providers/bluetigers.py +++ b/sickbeard/providers/bluetigers.py @@ -53,7 +53,7 @@ class BLUETIGERSProvider(TorrentProvider): self.url = self.urls['base_url'] - def _do_login(self): + def login(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True @@ -79,12 +79,12 @@ class BLUETIGERSProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -166,7 +166,7 @@ class BLUETIGERSCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = BLUETIGERSProvider() diff --git a/sickbeard/providers/btdigg.py b/sickbeard/providers/btdigg.py index 64a44d93446395a82239a041ee3ed12860d2a8e3..ceb8b6010677161051207455442111b1cff745e5 100644 --- a/sickbeard/providers/btdigg.py +++ b/sickbeard/providers/btdigg.py @@ -45,7 +45,7 @@ class BTDIGGProvider(TorrentProvider): self.cache = BTDiggCache(self) - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -116,6 +116,6 @@ class BTDiggCache(tvcache.TVCache): # Use this hacky way for RSS search since most results will use this codecs search_params = {'RSS': ['x264', 'x264.HDTV', '720.HDTV.x264']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = BTDIGGProvider() diff --git a/sickbeard/providers/btn.py b/sickbeard/providers/btn.py index 6361163bf8cb7d679f57ea0bc482fd20e41f3a0f..95d06605699b8372dc6b25f746a1b00bbb7c3bcd 100644 --- a/sickbeard/providers/btn.py +++ b/sickbeard/providers/btn.py @@ -68,7 +68,7 @@ class BTNProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): self._check_auth() @@ -257,7 +257,7 @@ class BTNProvider(TorrentProvider): def _doGeneralSearch(self, search_string): # 'search' looks as broad is it can find. Can contain episode overview and title for example, # use with caution! - return self._do_search({'search': search_string}) + return self.search({'search': search_string}) def find_propers(self, search_date=None): results = [] @@ -265,7 +265,7 @@ class BTNProvider(TorrentProvider): search_terms = ['%.proper.%', '%.repack.%'] for term in search_terms: - for item in self._do_search({'release': term}, age=4 * 24 * 60 * 60): + for item in self.search({'release': term}, age=4 * 24 * 60 * 60): if item['Time']: try: result_date = datetime.fromtimestamp(float(item['Time'])) @@ -306,7 +306,7 @@ class BTNCache(tvcache.TVCache): logger.DEBUG) seconds_since_last_update = 86400 - return {'entries': self.provider._do_search(search_params=None, age=seconds_since_last_update)} + return {'entries': self.provider.search(search_params=None, age=seconds_since_last_update)} provider = BTNProvider() diff --git a/sickbeard/providers/cpasbien.py b/sickbeard/providers/cpasbien.py index dbb5d13f3c4997391e554edd1397b6547b56b84f..c826b9411be36254824d069af424e835218b3cc2 100644 --- a/sickbeard/providers/cpasbien.py +++ b/sickbeard/providers/cpasbien.py @@ -39,7 +39,7 @@ class CpasbienProvider(TorrentProvider): self.cache = CpasbienCache(self) - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} diff --git a/sickbeard/providers/elitetorrent.py b/sickbeard/providers/elitetorrent.py index 8f0b9216bf7643aec7ec51db3a0ad507781b226f..bb1ab5b3c04017a9d0bf46167515764fe218d600 100644 --- a/sickbeard/providers/elitetorrent.py +++ b/sickbeard/providers/elitetorrent.py @@ -65,7 +65,7 @@ class elitetorrentProvider(TorrentProvider): } - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -179,7 +179,7 @@ class elitetorrentCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = elitetorrentProvider() diff --git a/sickbeard/providers/extratorrent.py b/sickbeard/providers/extratorrent.py index 7325357f509ebb656f62d4c1adf2a059d4ab780b..b5a75f2dfdb29bc7648511a07c2220dc95776478 100644 --- a/sickbeard/providers/extratorrent.py +++ b/sickbeard/providers/extratorrent.py @@ -48,7 +48,7 @@ class ExtraTorrentProvider(TorrentProvider): self.headers.update({'User-Agent': USER_AGENT}) self.search_params = {'cid': 8} - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -142,7 +142,7 @@ class ExtraTorrentCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = ExtraTorrentProvider() diff --git a/sickbeard/providers/fnt.py b/sickbeard/providers/fnt.py index d634a336df4e51112b1d32689098494a00ce7b60..95a78a1a8c8640f7e41fd63d8f8422724fcaf7c1 100644 --- a/sickbeard/providers/fnt.py +++ b/sickbeard/providers/fnt.py @@ -52,7 +52,7 @@ class FNTProvider(TorrentProvider): "visible": 1, "freeleech": 0, "nuke": 1, "3D": 0, "sort": "size", "order": "desc" } - def _do_login(self): + def login(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True @@ -75,13 +75,13 @@ class FNTProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} # check for auth - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -166,7 +166,7 @@ class FNTCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = FNTProvider() diff --git a/sickbeard/providers/freshontv.py b/sickbeard/providers/freshontv.py index e6639f70974a070957abd58437af9ed0890aec99..81ea9ff6a5d7397475a9d228093def608d3726a6 100644 --- a/sickbeard/providers/freshontv.py +++ b/sickbeard/providers/freshontv.py @@ -61,7 +61,7 @@ class FreshOnTVProvider(TorrentProvider): return True - def _do_login(self): + def login(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True @@ -100,14 +100,14 @@ class FreshOnTVProvider(TorrentProvider): return False - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} freeleech = '3' if self.freeleech else '0' - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -246,6 +246,6 @@ class FreshOnTVCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = FreshOnTVProvider() diff --git a/sickbeard/providers/gftracker.py b/sickbeard/providers/gftracker.py index 8904b9e43619e6e0cad6398c8ebd7571ba6de862..c2fecc7148f0c0a525988adab96dc8fdb80167f2 100644 --- a/sickbeard/providers/gftracker.py +++ b/sickbeard/providers/gftracker.py @@ -61,7 +61,7 @@ class GFTrackerProvider(TorrentProvider): return True - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password} @@ -80,12 +80,12 @@ class GFTrackerProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -195,6 +195,6 @@ class GFTrackerCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = GFTrackerProvider() diff --git a/sickbeard/providers/hdbits.py b/sickbeard/providers/hdbits.py index 62de609165196d519f25f27c4dc6d85149ecb614..72f069d6bc967d39ba16bb4e4d70186ff2a89f71 100644 --- a/sickbeard/providers/hdbits.py +++ b/sickbeard/providers/hdbits.py @@ -78,7 +78,7 @@ class HDBitsProvider(TorrentProvider): return title, url - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): # FIXME results = [] @@ -109,7 +109,7 @@ class HDBitsProvider(TorrentProvider): search_terms = [' proper ', ' repack '] for term in search_terms: - for item in self._do_search(self._make_post_data_JSON(search_term=term)): + for item in self.search(self._make_post_data_JSON(search_term=term)): if item['utadded']: try: result_date = datetime.datetime.fromtimestamp(int(item['utadded'])) diff --git a/sickbeard/providers/hdspace.py b/sickbeard/providers/hdspace.py index 2930c3298d39558bdac86cc0a8448ddc40d3a7b7..f50dcebaa496a29e0634a26249cb3ed52ab96421 100644 --- a/sickbeard/providers/hdspace.py +++ b/sickbeard/providers/hdspace.py @@ -61,7 +61,7 @@ class HDSpaceProvider(TorrentProvider): return True - def _do_login(self): + def login(self): if 'pass' in requests.utils.dict_from_cookiejar(self.session.cookies): return True @@ -80,12 +80,12 @@ class HDSpaceProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -191,6 +191,6 @@ class HDSpaceCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = HDSpaceProvider() diff --git a/sickbeard/providers/hdtorrents.py b/sickbeard/providers/hdtorrents.py index 0b80d7628d22e778e9a59d1050a6786442a8a7df..55ef723774b01a96b48f838898dfb52b4bdd9e69 100644 --- a/sickbeard/providers/hdtorrents.py +++ b/sickbeard/providers/hdtorrents.py @@ -59,7 +59,7 @@ class HDTorrentsProvider(TorrentProvider): return True - def _do_login(self): + def login(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True @@ -79,12 +79,12 @@ class HDTorrentsProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -223,6 +223,6 @@ class HDTorrentsCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = HDTorrentsProvider() diff --git a/sickbeard/providers/hounddawgs.py b/sickbeard/providers/hounddawgs.py index 4b715d3d01773f412ba6db5701f9ad305aac3582..8bb7c8a1454545e19c1f280317864277c2d00a8d 100644 --- a/sickbeard/providers/hounddawgs.py +++ b/sickbeard/providers/hounddawgs.py @@ -60,7 +60,7 @@ class HoundDawgsProvider(TorrentProvider): "searchtags": '' } - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password, @@ -81,12 +81,12 @@ class HoundDawgsProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -189,7 +189,7 @@ class HoundDawgsCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = HoundDawgsProvider() diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py index 571c44e08ca5db75667f195ca82711420f5e3e28..9043e86fabdc0342959e9018fa989da7a3ef4ed5 100644 --- a/sickbeard/providers/iptorrents.py +++ b/sickbeard/providers/iptorrents.py @@ -53,7 +53,7 @@ class IPTorrentsProvider(TorrentProvider): return True - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password, @@ -74,14 +74,14 @@ class IPTorrentsProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} freeleech = '&free=on' if self.freeleech else '' - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -182,7 +182,7 @@ class IPTorrentsCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = IPTorrentsProvider() diff --git a/sickbeard/providers/kat.py b/sickbeard/providers/kat.py index f102a4fe4ed2e5009f851e44b08fabf532da0ea9..a52c600a57277c87efec82b6ab786855a1037284 100755 --- a/sickbeard/providers/kat.py +++ b/sickbeard/providers/kat.py @@ -62,7 +62,7 @@ class KATProvider(TorrentProvider): self.cache = KATCache(self) - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -166,6 +166,6 @@ class KATCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['tv', 'anime']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = KATProvider() diff --git a/sickbeard/providers/morethantv.py b/sickbeard/providers/morethantv.py index 08a4554dd98056c6bd0dacbaa7a93fa1b6425286..13f885a5c60cf9e9060ec4b0b7c08f658cf96880 100644 --- a/sickbeard/providers/morethantv.py +++ b/sickbeard/providers/morethantv.py @@ -67,7 +67,7 @@ class MoreThanTVProvider(TorrentProvider): return True - def _do_login(self): + def login(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True @@ -90,14 +90,14 @@ class MoreThanTVProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} # freeleech = '3' if self.freeleech else '0' - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -211,6 +211,6 @@ class MoreThanTVCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = MoreThanTVProvider() diff --git a/sickbeard/providers/newpct.py b/sickbeard/providers/newpct.py index f21f7ba0ed3812d40020fa72b8dda97d75b2a1b9..a4874739365f58e7ac48578479058eb60867ddb6 100644 --- a/sickbeard/providers/newpct.py +++ b/sickbeard/providers/newpct.py @@ -68,7 +68,7 @@ class newpctProvider(TorrentProvider): 'bus_de_': 'All' } - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -171,7 +171,7 @@ class newpctProvider(TorrentProvider): """ # check for auth - if not self._do_login(): + if not self.login(): return False urls, filename = self._make_url(result) @@ -253,7 +253,7 @@ class newpctCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = newpctProvider() diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index 9c3eccbdbbfe9855173b209c2c457f6d8f4a78b8..b0934de88259610306a12356992892c2acf815bf 100644 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -136,7 +136,7 @@ class NewznabProvider(NZBProvider): def _get_season_search_strings(self, ep_obj): """ - Makes objects to pass to _do_search for manual and backlog season pack searching + Makes objects to pass to search for manual and backlog season pack searching Returns a list containing dicts of search parameters """ to_return = [] @@ -165,7 +165,7 @@ class NewznabProvider(NZBProvider): def _get_episode_search_strings(self, ep_obj, add_string=''): """ - Makes objects to pass to _do_search for manual and backlog season pack searching + Makes objects to pass to search for manual and backlog season pack searching Returns a list containing dicts of search parameters """ to_return = [] @@ -227,7 +227,7 @@ class NewznabProvider(NZBProvider): return False - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): # pylint: disable=too-many-arguments,too-many-locals + def search(self, search_params, age=0, ep_obj=None): # pylint: disable=too-many-arguments,too-many-locals """ Searches indexer using the params in search_params, either for latest releases, or a string/id search Returns: list of results in dict form @@ -331,7 +331,7 @@ class NewznabProvider(NZBProvider): curEp = self.show.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) searchStrings = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') for searchString in searchStrings: - for item in self._do_search(searchString): + for item in self.search(searchString): title, url = self._get_title_and_url(item) if re.match(r'.*(REPACK|PROPER).*', title, re.I): results.append(classes.Proper(title, url, datetime.datetime.today(), self.show)) @@ -348,4 +348,4 @@ class NewznabCache(tvcache.TVCache): self.minTime = 30 def _getRSSData(self): - return {'entries': self.provider._do_search({})} + return {'entries': self.provider.search({})} diff --git a/sickbeard/providers/nyaatorrents.py b/sickbeard/providers/nyaatorrents.py index 78756497a125aa020dc463d28748a95b2c2f694b..c72184fde6381549e1437a8e956b3d5bfc400565 100644 --- a/sickbeard/providers/nyaatorrents.py +++ b/sickbeard/providers/nyaatorrents.py @@ -44,7 +44,7 @@ class NyaaProvider(TorrentProvider): self.minleech = 0 self.confirmed = False - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): if self.show and not self.show.is_anime: return [] @@ -132,6 +132,6 @@ class NyaaCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = NyaaProvider() diff --git a/sickbeard/providers/omgwtfnzbs.py b/sickbeard/providers/omgwtfnzbs.py index 1b0f82fa319fcdab2888335ab0c310e07942fb5e..67df4f4b2a6921f8989e7e82223d21fd887b387f 100644 --- a/sickbeard/providers/omgwtfnzbs.py +++ b/sickbeard/providers/omgwtfnzbs.py @@ -84,7 +84,7 @@ class OmgwtfnzbsProvider(NZBProvider): def _get_size(self, item): return try_int(item['sizebytes'], -1) - def _do_search(self, search, search_mode='eponly', age=0, ep_obj=None): + def search(self, search, age=0, ep_obj=None): self._check_auth() @@ -123,7 +123,7 @@ class OmgwtfnzbsProvider(NZBProvider): results = [] for term in search_terms: - for item in self._do_search(term, age=4): + for item in self.search(term, age=4): if 'usenetage' in item: title, url = self._get_title_and_url(item) diff --git a/sickbeard/providers/pretome.py b/sickbeard/providers/pretome.py index 0a258b79e99afef3f925a4f6b14acefbfb6d267e..87430198ee523e70a5c464365490683dd1b92782 100644 --- a/sickbeard/providers/pretome.py +++ b/sickbeard/providers/pretome.py @@ -60,7 +60,7 @@ class PretomeProvider(TorrentProvider): return True - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password, @@ -77,12 +77,12 @@ class PretomeProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -194,7 +194,7 @@ class PretomeCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = PretomeProvider() diff --git a/sickbeard/providers/rarbg.py b/sickbeard/providers/rarbg.py index eef79bf603a4e67ecce149eb52d4e532eee690be..d334b96425eaebeca6bb61efe217108c7b4d2b23 100644 --- a/sickbeard/providers/rarbg.py +++ b/sickbeard/providers/rarbg.py @@ -78,7 +78,7 @@ class RarbgProvider(TorrentProvider): self.cache = RarbgCache(self) - def _do_login(self): + def login(self): if self.token and self.tokenExpireDate and datetime.datetime.now() < self.tokenExpireDate: return True @@ -98,12 +98,12 @@ class RarbgProvider(TorrentProvider): return False - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results if ep_obj is not None: @@ -185,7 +185,7 @@ class RarbgProvider(TorrentProvider): retry = retry - 1 self.token = None self.tokenExpireDate = None - if not self._do_login(): + if not self.login(): logger.log(u"Failed retrieving new token", logger.DEBUG) return results logger.log(u"Using new token", logger.DEBUG) @@ -254,7 +254,7 @@ class RarbgCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = RarbgProvider() diff --git a/sickbeard/providers/scc.py b/sickbeard/providers/scc.py index ce9e2cb2667d7d466605bd8bf823ea1b465840a4..1dab41630393e6b8d0b97da431a7e1996c8785af 100644 --- a/sickbeard/providers/scc.py +++ b/sickbeard/providers/scc.py @@ -29,7 +29,7 @@ from sickbeard.bs4_parser import BS4Parser from sickrage.providers.TorrentProvider import TorrentProvider -class SCCProvider(TorrentProvider): +class SCCProvider(TorrentProvider): # pylint: disable=too-many-instance-attributes def __init__(self): @@ -43,22 +43,29 @@ class SCCProvider(TorrentProvider): self.cache = SCCCache(self) - self.urls = {'base_url': 'https://sceneaccess.eu', - 'login': 'https://sceneaccess.eu/login', - 'detail': 'https://www.sceneaccess.eu/details?id=%s', - 'search': 'https://sceneaccess.eu/all?search=%s&method=1&%s', - 'download': 'https://www.sceneaccess.eu/%s'} + self.urls = { + 'base_url': 'https://sceneaccess.eu', + 'login': 'https://sceneaccess.eu/login', + 'detail': 'https://www.sceneaccess.eu/details?id=%s', + 'search': 'https://sceneaccess.eu/all?search=%s&method=1&%s', + 'download': 'https://www.sceneaccess.eu/%s' + } self.url = self.urls['base_url'] - self.categories = { 'sponly': 'c26=26&c44=44&c45=45', # Archive, non-scene HD, non-scene SD; need to include non-scene because WEB-DL packs get added to those categories - 'eponly': 'c27=27&c17=17&c44=44&c45=45&c33=33&c34=34'} # TV HD, TV SD, non-scene HD, non-scene SD, foreign XviD, foreign x264 + self.categories = { + 'Season': 'c26=26&c44=44&c45=45', # Archive, non-scene HD, non-scene SD; need to include non-scene because WEB-DL packs get added to those categories + 'Episode': 'c17=17&c27=27&c33=33&c34=34&c44=44&c45=45', # TV HD, TV SD, non-scene HD, non-scene SD, foreign XviD, foreign x264 + 'RSS': 'c17=17&c26=26&c27=27&c33=33&c34=34&c44=44&c45=45' # Season + Episode + } - def _do_login(self): + def login(self): - login_params = {'username': self.username, - 'password': self.password, - 'submit': 'come on in'} + login_params = { + 'username': self.username, + 'password': self.password, + 'submit': 'come on in' + } response = self.get_url(self.urls['login'], post_data=login_params, timeout=30) if not response: @@ -72,19 +79,19 @@ class SCCProvider(TorrentProvider): return True - def _isSection(self, section, text): + @staticmethod + def _isSection(section, text): title = r'<title>.+? \| %s</title>' % section return re.search(title, text, re.IGNORECASE) - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): # pylint: disable=too-many-locals,too-many-branches + items = {'Season': [], 'Episode': [], 'RSS': []} results = [] - if not self._do_login(): + if not self.login(): return results - items = {'Season': [], 'Episode': [], 'RSS': []} - for mode in search_strings.keys(): if mode != 'RSS': logger.log(u"Search Mode: %s" % mode, logger.DEBUG) @@ -92,7 +99,7 @@ class SCCProvider(TorrentProvider): if mode != 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) - searchURL = self.urls['search'] % (urllib.quote(search_string), self.categories[search_mode]) + searchURL = self.urls['search'] % (urllib.quote(search_string), self.categories[mode]) try: logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) @@ -117,7 +124,7 @@ class SCCProvider(TorrentProvider): try: link = result.find('td', attrs={'class': 'ttr_name'}).find('a') - url = result.find('td', attrs={'class': 'td_dl'}).find('a') + url = result.find('td', attrs={'class': 'td_dl'}).find('a') title = link.string if re.search(r'\.\.\.', title): @@ -157,7 +164,8 @@ class SCCProvider(TorrentProvider): def seed_ratio(self): return self.ratio - def _convertSize(self, size): + @staticmethod + def _convertSize(size): size, base = size.split() size = float(size) if base in 'KB': @@ -181,6 +189,6 @@ class SCCCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = SCCProvider() diff --git a/sickbeard/providers/scenetime.py b/sickbeard/providers/scenetime.py index eb05c9a9e87d9284e478198effda6bcc86f0c6c6..c8d7fdd080aa9af734653517b464d77ca4b51368 100644 --- a/sickbeard/providers/scenetime.py +++ b/sickbeard/providers/scenetime.py @@ -50,7 +50,7 @@ class SceneTimeProvider(TorrentProvider): self.categories = "&c2=1&c43=13&c9=1&c63=1&c77=1&c79=1&c100=1&c101=1" - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password} @@ -66,12 +66,12 @@ class SceneTimeProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -163,7 +163,7 @@ class SceneTimeCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = SceneTimeProvider() diff --git a/sickbeard/providers/speedcd.py b/sickbeard/providers/speedcd.py index eec9a1282c862f2823b92b4f72aee8c89c75932e..622bf9bf0581c57714dd9cf54053b55751c9832c 100644 --- a/sickbeard/providers/speedcd.py +++ b/sickbeard/providers/speedcd.py @@ -50,7 +50,7 @@ class SpeedCDProvider(TorrentProvider): self.cache = SpeedCDCache(self) - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password} @@ -66,12 +66,12 @@ class SpeedCDProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -143,6 +143,6 @@ class SpeedCDCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = SpeedCDProvider() diff --git a/sickbeard/providers/strike.py b/sickbeard/providers/strike.py index 0339d1af61e64e940abb969292052fe508f0b4c5..a1d0f4fe30ec65fbf3ec3065918787111ac18e98 100644 --- a/sickbeard/providers/strike.py +++ b/sickbeard/providers/strike.py @@ -33,7 +33,7 @@ class STRIKEProvider(TorrentProvider): self.cache = StrikeCache(self) self.minseed, self.minleech = 2 * [None] - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -99,6 +99,6 @@ class StrikeCache(tvcache.TVCache): # Use this hacky way for RSS search since most results will use this codec search_params = {'RSS': ['x264']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = STRIKEProvider() diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py index b4f186681a0e2a2dbda999a0afcf331ebe9edc63..afc40063275bde28fc6f6b9a1195491f92d58674 100644 --- a/sickbeard/providers/t411.py +++ b/sickbeard/providers/t411.py @@ -52,7 +52,7 @@ class T411Provider(TorrentProvider): self.minleech = 0 self.confirmed = False - def _do_login(self): + def login(self): if self.token is not None: if time.time() < (self.tokenLastUpdate + 30 * 60): @@ -76,12 +76,12 @@ class T411Provider(TorrentProvider): logger.log(u"Token not found in authentication response", logger.WARNING) return False - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -179,7 +179,7 @@ class T411Cache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = T411Provider() diff --git a/sickbeard/providers/thepiratebay.py b/sickbeard/providers/thepiratebay.py index 8ae17a60664d5e04cc28a432c408b0985c25a10b..ca75537abe61102eebcbb6740c952e7142fea86f 100644 --- a/sickbeard/providers/thepiratebay.py +++ b/sickbeard/providers/thepiratebay.py @@ -64,7 +64,7 @@ class ThePirateBayProvider(TorrentProvider): self.re_title_url = r'/torrent/(?P<id>\d+)/(?P<title>.*?)".+?(?P<url>magnet.*?)".+?Size (?P<size>[\d\.]* [TGKMiB]{2,3}).+?(?P<seeders>\d+)</td>.+?(?P<leechers>\d+)</td>' - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -152,6 +152,6 @@ class ThePirateBayCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = ThePirateBayProvider() diff --git a/sickbeard/providers/titansoftv.py b/sickbeard/providers/titansoftv.py index e46328f93e08548a9db5329d882fbca539265fb3..5efb5a34b05e72a802c44449ab68e7ebce2f521e 100644 --- a/sickbeard/providers/titansoftv.py +++ b/sickbeard/providers/titansoftv.py @@ -54,7 +54,7 @@ class TitansOfTVProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): # FIXME ADD MODE self._check_auth() results = [] @@ -151,7 +151,7 @@ class TitansOfTVCache(tvcache.TVCache): def _getRSSData(self): search_params = {'limit': 100} - return self.provider._do_search(search_params) + return self.provider.search(search_params) provider = TitansOfTVProvider() diff --git a/sickbeard/providers/tntvillage.py b/sickbeard/providers/tntvillage.py index 8fe48fdae60ad7d99594fb60c5a03fa6cf5b44e5..e1f598b3c05531272cbe7bf0b5275cc4c3b9ae3a 100644 --- a/sickbeard/providers/tntvillage.py +++ b/sickbeard/providers/tntvillage.py @@ -118,7 +118,7 @@ class TNTVillageProvider(TorrentProvider): return True - def _do_login(self): + def login(self): login_params = {'UserName': self.username, 'PassWord': self.password, @@ -268,14 +268,14 @@ class TNTVillageProvider(TorrentProvider): if int(episodes[0]['count']) == len(parse_result.episode_numbers): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} self.categories = "cat=" + str(self.cat) - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -411,7 +411,7 @@ class TNTVillageCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': []} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = TNTVillageProvider() diff --git a/sickbeard/providers/tokyotoshokan.py b/sickbeard/providers/tokyotoshokan.py index 80e9e65c7b5f4cf33fb6a20baa0ed8084764b1f8..f2cac0fcafd77ebf53a7e57cd8d7c728c57714c1 100644 --- a/sickbeard/providers/tokyotoshokan.py +++ b/sickbeard/providers/tokyotoshokan.py @@ -50,7 +50,7 @@ class TokyoToshokanProvider(TorrentProvider): def _get_episode_search_strings(self, ep_obj, add_string=''): return [x.replace('.', ' ') for x in show_name_helpers.makeSceneSearchString(self.show, ep_obj)] - def _do_search(self, search_string, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_string, age=0, ep_obj=None): # FIXME ADD MODE if self.show and not self.show.is_anime: return [] diff --git a/sickbeard/providers/torrentbytes.py b/sickbeard/providers/torrentbytes.py index 91fcace76fc19f233f73b401d14ddbee5ad59b29..7601a7b615f33bc74beeb75c8eba48b28c2ed691 100644 --- a/sickbeard/providers/torrentbytes.py +++ b/sickbeard/providers/torrentbytes.py @@ -53,7 +53,7 @@ class TorrentBytesProvider(TorrentProvider): self.cache = TorrentBytesCache(self) - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password, @@ -70,12 +70,12 @@ class TorrentBytesProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -193,7 +193,7 @@ class TorrentBytesCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = TorrentBytesProvider() diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py index eafec211adab3bab29ae9da018ac2bb6eddba239..a75bc6ac59fec4cc913ba2e3c09976c92cdb5215 100644 --- a/sickbeard/providers/torrentday.py +++ b/sickbeard/providers/torrentday.py @@ -53,7 +53,7 @@ class TorrentDayProvider(TorrentProvider): self.categories = {'Season': {'c14': 1}, 'Episode': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1}, 'RSS': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1, 'c14': 1}} - def _do_login(self): + def login(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True @@ -92,12 +92,12 @@ class TorrentDayProvider(TorrentProvider): logger.log(u"Unable to obtain cookie", logger.WARNING) return False - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -171,6 +171,6 @@ class TorrentDayCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = TorrentDayProvider() diff --git a/sickbeard/providers/torrentleech.py b/sickbeard/providers/torrentleech.py index 408b9b7a549b39203c056ca4cb6a3753c037df5e..bf069c022d4e011d173371ccddc1db4f355e0581 100644 --- a/sickbeard/providers/torrentleech.py +++ b/sickbeard/providers/torrentleech.py @@ -53,7 +53,7 @@ class TorrentLeechProvider(TorrentProvider): self.cache = TorrentLeechCache(self) - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password, @@ -71,12 +71,12 @@ class TorrentLeechProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): @@ -157,7 +157,7 @@ class TorrentLeechCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = TorrentLeechProvider() diff --git a/sickbeard/providers/torrentproject.py b/sickbeard/providers/torrentproject.py index f0efceb284ec089464a9a4533c27e68976ff2eea..36e70cf7af91ce6b11ff8574b5f6f1475e4f8907 100644 --- a/sickbeard/providers/torrentproject.py +++ b/sickbeard/providers/torrentproject.py @@ -38,7 +38,7 @@ class TORRENTPROJECTProvider(TorrentProvider): self.minleech = None self.cache = TORRENTPROJECTCache(self) - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -115,6 +115,6 @@ class TORRENTPROJECTCache(tvcache.TVCache): def _getRSSData(self): search_params = {'RSS': ['0day']} - return {'entries': self.provider._do_search(search_params)} + return {'entries': self.provider.search(search_params)} provider = TORRENTPROJECTProvider() diff --git a/sickbeard/providers/torrentz.py b/sickbeard/providers/torrentz.py index 79478749d18de8394ce5bc9c24b7df03b031854f..38301b6306cfe188e1e0cf8c223549758a1f9da2 100644 --- a/sickbeard/providers/torrentz.py +++ b/sickbeard/providers/torrentz.py @@ -54,7 +54,7 @@ class TORRENTZProvider(TorrentProvider): match = re.findall(r'[0-9]+', description) return (int(match[0]) * 1024**2, int(match[1]), int(match[2])) - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} @@ -133,6 +133,6 @@ class TORRENTZCache(tvcache.TVCache): self.minTime = 15 def _getRSSData(self): - return {'entries': self.provider._do_search({'RSS': ['']})} + return {'entries': self.provider.search({'RSS': ['']})} provider = TORRENTZProvider() diff --git a/sickbeard/providers/transmitthenet.py b/sickbeard/providers/transmitthenet.py index 421652dff1c418c16a0c2634a290c3f98832d9dc..307a4ca84c6682159d235e530f1b029011f26d69 100644 --- a/sickbeard/providers/transmitthenet.py +++ b/sickbeard/providers/transmitthenet.py @@ -54,7 +54,7 @@ class TransmitTheNetProvider(TorrentProvider): return True - def _do_login(self): + def login(self): login_params = { 'username': self.username, @@ -74,12 +74,12 @@ class TransmitTheNetProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -176,7 +176,7 @@ class TransmitTheNetCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = TransmitTheNetProvider() diff --git a/sickbeard/providers/tvchaosuk.py b/sickbeard/providers/tvchaosuk.py index b0670b8d321d3f328f87bec425b29975b0f68e7a..3b265b3dc2e6a6f129516fb3127855d88c7d8ac6 100644 --- a/sickbeard/providers/tvchaosuk.py +++ b/sickbeard/providers/tvchaosuk.py @@ -42,6 +42,7 @@ class TVChaosUKProvider(TorrentProvider): self.ratio = None self.minseed = None self.minleech = None + self.freeleech = None self.cache = TVChaosUKCache(self) @@ -103,7 +104,7 @@ class TVChaosUKProvider(TorrentProvider): return [search_string] - def _do_login(self): + def login(self): login_params = {'username': self.username, 'password': self.password} response = self.get_url(self.urls['login'], post_data=login_params, timeout=30) @@ -117,12 +118,12 @@ class TVChaosUKProvider(TorrentProvider): return True - def _do_search(self, search_strings, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_strings, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._do_login(): + if not self.login(): return results for mode in search_strings.keys(): @@ -144,6 +145,9 @@ class TVChaosUKProvider(TorrentProvider): torrent_table = html.find(id='listtorrents').find_all('tr') for torrent in torrent_table: try: + freeleech = torrent.find('img', alt=re.compile('Free Torrent')) + if self.freeleech and not freeleech: + continue title = torrent.find(attrs={'class':'tooltip-target'}).text.strip() download_url = torrent.find(title="Click to Download this Torrent!").parent['href'].strip() seeders = int(torrent.find(title='Seeders').text.strip()) @@ -203,7 +207,7 @@ class TVChaosUKCache(tvcache.TVCache): def _getRSSData(self): search_strings = {'RSS': ['']} - return {'entries': self.provider._do_search(search_strings)} + return {'entries': self.provider.search(search_strings)} provider = TVChaosUKProvider() diff --git a/sickbeard/providers/xthor.py b/sickbeard/providers/xthor.py index 14537bc23476c241c3272054b3629d7abee08edf..b026c80b8ec6e3300369f1c2831cb5314d0866e2 100644 --- a/sickbeard/providers/xthor.py +++ b/sickbeard/providers/xthor.py @@ -43,7 +43,7 @@ class XthorProvider(TorrentProvider): self.password = None self.ratio = None - def _do_login(self): + def login(self): if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True @@ -65,13 +65,13 @@ class XthorProvider(TorrentProvider): return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): + def search(self, search_params, age=0, ep_obj=None): results = [] items = {'Season': [], 'Episode': [], 'RSS': []} # check for auth - if not self._do_login(): + if not self.login(): return results for mode in search_params.keys(): diff --git a/sickbeard/showUpdater.py b/sickbeard/showUpdater.py index a7e8de6d1cb4d708a764e018884e12c0f4dd5e07..f8661ecd24ccf53d69e145e0d67c7b1b26e78acd 100644 --- a/sickbeard/showUpdater.py +++ b/sickbeard/showUpdater.py @@ -40,7 +40,7 @@ class ShowUpdater: self.session = requests.Session() - def run(self): + def run(self, force=False): # pylint: disable=unused-parameter self.amActive = True diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py index 30f166731ebf74e7927daf61e6294bceb5eab6f2..4dd00180c5b4c52a09cd75fc8647fbbb80f4afbb 100644 --- a/sickbeard/webserve.py +++ b/sickbeard/webserve.py @@ -298,6 +298,9 @@ class LoginHandler(BaseHandler): and (self.get_argument('password') == password or not password): api_key = sickbeard.API_KEY + if sickbeard.NOTIFY_ON_LOGIN and not helpers.is_ip_private(self.request.remote_ip): + notifiers.notify_login(self.request.remote_ip) + if api_key: remember_me = int(self.get_argument('remember_me', default=0) or 0) self.set_secure_cookie('sickrage_user', api_key, expires_days=30 if remember_me > 0 else None) @@ -3756,7 +3759,7 @@ class ConfigGeneral(Config): sickbeard.save_config() - def saveGeneral(self, log_dir=None, log_nr=5, log_size=1048576, web_port=None, web_log=None, encryption_version=None, web_ipv6=None, + def saveGeneral(self, log_dir=None, log_nr=5, log_size=1048576, web_port=None, notify_on_login=None, web_log=None, encryption_version=None, web_ipv6=None, trash_remove_show=None, trash_rotate_logs=None, update_frequency=None, skip_removed_files=None, indexerDefaultLang='en', ep_default_deleted_status=None, launch_browser=None, showupdate_hour=3, web_username=None, api_key=None, indexer_default=None, timezone_display=None, cpu_preset='NORMAL', @@ -3809,7 +3812,7 @@ class ConfigGeneral(Config): # sickbeard.LOG_DIR is set in config.change_LOG_DIR() sickbeard.COMING_EPS_MISSED_RANGE = try_int(coming_eps_missed_range, 7) sickbeard.DISPLAY_ALL_SEASONS = config.checkbox_to_value(display_all_seasons) - + sickbeard.NOTIFY_ON_LOGIN = config.checkbox_to_value(notify_on_login) sickbeard.WEB_PORT = try_int(web_port) sickbeard.WEB_IPV6 = config.checkbox_to_value(web_ipv6) # sickbeard.WEB_LOG is set in config.change_LOG_DIR() diff --git a/sickrage/providers/GenericProvider.py b/sickrage/providers/GenericProvider.py index afccbb658d3e213d93722c3e295b60f1036e1049..a02260f55a6a95cfe3739f87f5fd73773152e5cb 100644 --- a/sickrage/providers/GenericProvider.py +++ b/sickrage/providers/GenericProvider.py @@ -77,7 +77,7 @@ class GenericProvider(object): # pylint: disable=too-many-instance-attributes shuffle(self.bt_cache_urls) def download_result(self, result): - if not self._do_login(): + if not self.login(): return False urls, filename = self._make_url(result) @@ -150,7 +150,7 @@ class GenericProvider(object): # pylint: disable=too-many-instance-attributes logger.log(u'First search_string has rid', logger.DEBUG) for search_string in search_strings: - items_list += self._do_search(search_string, search_mode=search_mode, ep_obj=episode) + items_list += self.search(search_string, ep_obj=episode) if first: first = False @@ -381,10 +381,10 @@ class GenericProvider(object): # pylint: disable=too-many-instance-attributes def _check_auth(self): # pylint: disable=no-self-use return True - def _do_login(self): # pylint: disable=no-self-use + def login(self): # pylint: disable=no-self-use return True - def _do_search(self, search_params, search_mode='eponly', age=0, ep_obj=None): # pylint: disable=unused-argument,no-self-use + def search(self, search_params, age=0, ep_obj=None): # pylint: disable=unused-argument,no-self-use return [] def _get_result(self, episodes): # pylint: disable=no-self-use diff --git a/sickrage/providers/TorrentProvider.py b/sickrage/providers/TorrentProvider.py index 747bcaa070977e420e1894ddd5d683814fb6b35a..12fd59fe932ea40aa1729a1f70264ad846f23f35 100644 --- a/sickrage/providers/TorrentProvider.py +++ b/sickrage/providers/TorrentProvider.py @@ -58,7 +58,7 @@ class TorrentProvider(GenericProvider): for term in self.proper_strings: search_strings = self._get_episode_search_strings(episode, add_string=term) - for item in self._do_search(search_strings[0]): + for item in self.search(search_strings[0]): title, url = self._get_title_and_url(item) results.append(Proper(title, url, datetime.today(), show)) diff --git a/tests/search_tests.py b/tests/search_tests.py index 94eed6f69a52e75e166b5c4c0694d08ce6e634f8..326a4f2f2388c010eeba5bbbf16b26c17c2d5003 100644 --- a/tests/search_tests.py +++ b/tests/search_tests.py @@ -117,7 +117,7 @@ def test_generator(cur_data, cur_name, cur_provider): if not cur_provider.public: continue - items = cur_provider._do_search(search_strings) # pylint: disable=protected-access + items = cur_provider.search(search_strings) # pylint: disable=protected-access if not items: print "No results from cur_provider?" continue diff --git a/tests/sickrage_tests/providers/generic_provider_tests.py b/tests/sickrage_tests/providers/generic_provider_tests.py index ac1e81e43d2e49417bb5a7de465c8f97d40fdc63..28e9072e82e085610b737807e6c38dc331fe4024 100644 --- a/tests/sickrage_tests/providers/generic_provider_tests.py +++ b/tests/sickrage_tests/providers/generic_provider_tests.py @@ -248,15 +248,15 @@ class GenericProviderTests(unittest.TestCase): """ self.assertTrue(GenericProvider('Test Provider')._check_auth()) - def test__do_login(self): + def test_login(self): """ - Test _do_login + Test login """ - self.assertTrue(GenericProvider('Test Provider')._do_login()) + self.assertTrue(GenericProvider('Test Provider').login()) - def test__do_search(self): + def test_search(self): """ - Test _do_search + Test search """ test_cases = { None: [], @@ -281,7 +281,7 @@ class GenericProviderTests(unittest.TestCase): for test in test_cases, unicode_test_cases: for (search_params, result) in test.iteritems(): - self.assertEqual(GenericProvider('Test Provider')._do_search(search_params), result) + self.assertEqual(GenericProvider('Test Provider').search(search_params), result) def test__get_size(self): """ diff --git a/tests/torrent_tests.py b/tests/torrent_tests.py index 17588377983d96a87c1fc8c9cdf9a1a4cd8da807..665be92ed4083a3243507f76984a4f4a31475804 100644 --- a/tests/torrent_tests.py +++ b/tests/torrent_tests.py @@ -69,7 +69,7 @@ class TorrentBasicTests(test.SickbeardTestDBCase): # pylint: disable=protected-access search_strings_list = bitcannon._get_episode_search_strings(self.shows[0].episodes[0]) # [{'Episode': ['Italian Works S05E10']}] for search_strings in search_strings_list: - bitcannon._do_search(search_strings) # {'Episode': ['Italian Works S05E10']} # pylint: disable=protected-access + bitcannon.search(search_strings) # {'Episode': ['Italian Works S05E10']} # pylint: disable=protected-access return True