diff --git a/gui/slick/images/providers/t411.png b/gui/slick/images/providers/t411.png deleted file mode 100644 index 7695f5bbe46d287c50226d090441b667abd046cb..0000000000000000000000000000000000000000 Binary files a/gui/slick/images/providers/t411.png and /dev/null differ diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 37ace85610cfa09e24eab97ba25ee361583ac4aa..cdd98b9ee44d3adea57a22f00841d9276cdfc2bd 100644 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -27,7 +27,7 @@ import sickbeard from sickbeard.providers import (abnormal, alpharatio, archetorrent, binsearch, bitcannon, btn, cpasbien, danishbits, elitetorrent, filelist, gftracker, hd4free, hdbits, hdspace, hdtorrents, hdtorrents_it, horriblesubs, hounddawgs, ilcorsaronero, immortalseed, iptorrents, limetorrents, morethantv, ncore, nebulance, newpct, norbits, nyaa, omgwtfnzbs, pretome, rarbg, scc, scenetime, shazbat, - skytorrents, speedcd, t411, thepiratebay, tntvillage, tokyotoshokan, torrent9, torrentbytes, torrentday, torrentleech, + skytorrents, speedcd, thepiratebay, tntvillage, tokyotoshokan, torrent9, torrentbytes, torrentday, torrentleech, torrentproject, torrentz, tvchaosuk, xthor) __all__ = [ @@ -35,7 +35,7 @@ __all__ = [ 'elitetorrent', 'filelist', 'gftracker', 'hd4free', 'hdbits', 'hdspace', 'hdtorrents', 'hdtorrents_it', 'horriblesubs', 'hounddawgs', 'ilcorsaronero', 'immortalseed', 'iptorrents', 'limetorrents', 'morethantv', 'ncore', 'nebulance', 'newpct', 'norbits', 'nyaa', 'omgwtfnzbs', 'pretome', 'rarbg', 'scc', 'scenetime', - 'shazbat', 'skytorrents', 'speedcd', 't411', 'thepiratebay', 'tntvillage', 'tokyotoshokan', 'torrent9', + 'shazbat', 'skytorrents', 'speedcd', 'thepiratebay', 'tntvillage', 'tokyotoshokan', 'torrent9', 'torrentbytes', 'torrentday', 'torrentleech', 'torrentproject', 'torrentz', 'tvchaosuk', 'xthor' ] diff --git a/sickbeard/providers/t411.py b/sickbeard/providers/t411.py deleted file mode 100644 index 9d9b7a86b9b159625e6bdf27353f66742409fcad..0000000000000000000000000000000000000000 --- a/sickbeard/providers/t411.py +++ /dev/null @@ -1,175 +0,0 @@ -# coding=utf-8 -# Author: djoole <bobby.djoole@gmail.com> -# -# URL: https://sickrage.github.io -# -# 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/>. - -from __future__ import print_function, unicode_literals - -import time -import traceback - -import six -from requests.auth import AuthBase - -from sickbeard import logger, tvcache -from sickrage.helper.common import convert_size, try_int -from sickrage.providers.torrent.TorrentProvider import TorrentProvider - - -class T411Provider(TorrentProvider): # pylint: disable=too-many-instance-attributes - - def __init__(self): - - TorrentProvider.__init__(self, "T411") - - self.username = None - self.password = None - self.token = None - self.tokenLastUpdate = None - - self.cache = tvcache.TVCache(self, min_time=10) # Only poll T411 every 10 minutes max - - self.urls = {'base_url': 'https://www.t411.al/', - 'search': 'https://api.t411.al/torrents/search/%s*?cid=%s&limit=100', - 'rss': 'https://api.t411.al/torrents/top/today', - 'login_page': 'https://api.t411.al/auth', - 'download': 'https://api.t411.al/torrents/download/%s'} - - self.url = self.urls['base_url'] - - self.subcategories = [433, 637, 455, 639] - - self.minseed = 0 - self.minleech = 0 - self.confirmed = False - - def login(self): - - if self.token and self.tokenLastUpdate and time.time() < (self.tokenLastUpdate + 30 * 60): - return True - - login_params = {'username': self.username, - 'password': self.password} - - response = self.get_url(self.urls['login_page'], post_data=login_params, returns='json', verify=False) - if not response: - logger.log("Unable to connect to provider", logger.WARNING) - return False - - if response and 'token' in response: - self.token = response['token'] - self.tokenLastUpdate = time.time() - self.session.auth = T411Auth(self.token) - return True - else: - logger.log("Token not found in authentication response", logger.WARNING) - return False - - def search(self, search_params, age=0, ep_obj=None): # pylint: disable=too-many-branches, too-many-locals, too-many-statements - results = [] - if not self.login(): - return results - - for mode in search_params: - items = [] - logger.log("Search Mode: {0}".format(mode), logger.DEBUG) - for search_string in search_params[mode]: - - if mode != 'RSS': - logger.log("Search string: {0}".format - (search_string.decode("utf-8")), logger.DEBUG) - - search_urlS = ([self.urls['search'] % (search_string, u) for u in self.subcategories], [self.urls['rss']])[mode == 'RSS'] - for search_url in search_urlS: - data = self.get_url(search_url, returns='json', verify=False) - if not data: - continue - - try: - if 'torrents' not in data and mode != 'RSS': - logger.log("Data returned from provider does not contain any torrents", logger.DEBUG) - continue - - torrents = data['torrents'] if mode != 'RSS' else data - - if not torrents: - logger.log("Data returned from provider does not contain any torrents", logger.DEBUG) - continue - - for torrent in torrents: - if mode == 'RSS' and 'category' in torrent and try_int(torrent['category'], 0) not in self.subcategories: - continue - - try: - title = torrent['name'] - torrent_id = torrent['id'] - download_url = (self.urls['download'] % torrent_id).encode('utf8') - if not all([title, download_url]): - continue - - seeders = try_int(torrent['seeders']) - leechers = try_int(torrent['leechers']) - verified = bool(torrent['isVerified']) - torrent_size = torrent['size'] - - # Filter unseeded torrent - if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': - logger.log("Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) - continue - - if self.confirmed and not verified and mode != 'RSS': - logger.log("Found result " + title + " but that doesn't seem like a verified result so I'm ignoring it", logger.DEBUG) - continue - - size = convert_size(torrent_size) or -1 - item = {'title': title, 'link': download_url, 'size': size, 'seeders': seeders, 'leechers': leechers, 'hash': ''} - if mode != 'RSS': - logger.log("Found result: {0} with {1} seeders and {2} leechers".format(title, seeders, leechers), logger.DEBUG) - - items.append(item) - - except Exception: - logger.log("Invalid torrent data, skipping result: {0}".format(torrent), logger.DEBUG) - logger.log("Failed parsing provider. Traceback: {0}".format(traceback.format_exc()), logger.DEBUG) - continue - - except Exception: - logger.log("Failed parsing provider. Traceback: {0}".format(traceback.format_exc()), logger.ERROR) - - # For each search mode sort all the items by seeders if available if available - items.sort(key=lambda d: try_int(d.get('seeders', 0)), reverse=True) - - results += items - - return results - - -class T411Auth(AuthBase): # pylint: disable=too-few-public-methods - """Attaches HTTP Authentication to the given Request object.""" - def __init__(self, token): - if isinstance(token, six.text_type): - self.token = token.encode('utf-8') - else: - self.token = token - - def __call__(self, r): - r.headers[b'Authorization'] = self.token - return r - -provider = T411Provider()