diff --git a/gui/slick/images/providers/BLUETIGERS.png b/gui/slick/images/providers/BLUETIGERS.png deleted file mode 100644 index e6f83e734de85b96f2577e7a35e0437a48d242f4..0000000000000000000000000000000000000000 Binary files a/gui/slick/images/providers/BLUETIGERS.png and /dev/null differ diff --git a/gui/slick/images/providers/FNT.png b/gui/slick/images/providers/FNT.png deleted file mode 100644 index af30de65eb256df3ea3b25a7f2c52cc6aece0e94..0000000000000000000000000000000000000000 Binary files a/gui/slick/images/providers/FNT.png and /dev/null differ diff --git a/sickbeard/__init__.py b/sickbeard/__init__.py index 427e14e84814a06217620339f862de2f5acb7ca7..4546404c35870069ac9f372b5c38516cc698d2f5 100755 --- a/sickbeard/__init__.py +++ b/sickbeard/__init__.py @@ -37,7 +37,7 @@ from github import Github from sickbeard import providers, metadata, config, webserveInit from sickbeard.providers.generic import GenericProvider from providers import btn, newznab, womble, thepiratebay, torrentleech, kat, iptorrents, \ - omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, nextgen, speedcd, nyaatorrents, animenzb, bluetigers, fnt, torrentbytes, animezb, \ + omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, nextgen, speedcd, nyaatorrents, animenzb, torrentbytes, animezb, \ freshontv, morethantv, bitsoup, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, scenetime from sickbeard.config import CheckSection, check_setting_int, check_setting_str, check_setting_float, ConfigMigrator, \ naming_ep_type diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 0c802b7466ab58f57b26b45b696eea1b853c5f3e..a20125b0c13ddfda6b91fdfaf458d497a9a93768 100644 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -44,8 +44,6 @@ __all__ = ['womble', 'rarbg', 'tntvillage', 'binsearch', - 'bluetigers', - 'fnt', 'scenetime', ] diff --git a/sickbeard/providers/bluetigers.py b/sickbeard/providers/bluetigers.py deleted file mode 100644 index cad18eaa434b9461a83e0c1afad9b0edf7628dff..0000000000000000000000000000000000000000 --- a/sickbeard/providers/bluetigers.py +++ /dev/null @@ -1,276 +0,0 @@ -# -*- coding: latin-1 -*- -# Author: raver2046 <raver2046@gmail.com> -# URL: http://code.google.com/p/sickbeard/ -# -# This file is part of Sick Beard. -# -# Sick Beard 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. -# -# Sick Beard 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 Sick Beard. If not, see <http://www.gnu.org/licenses/>. - -import traceback -import re -import datetime -import time -from lib.requests.auth import AuthBase -import sickbeard -import generic -import urllib -from lib import requests -from lib.requests import exceptions -from sickbeard.bs4_parser import BS4Parser -from sickbeard.common import Quality -from sickbeard import logger -from sickbeard import tvcache -from sickbeard import show_name_helpers -from sickbeard import db -from sickbeard import helpers -from lib.unidecode import unidecode -from sickbeard import classes -from sickbeard.helpers import sanitizeSceneName -from sickbeard.exceptions import ex - - -class BLUETIGERSProvider(generic.TorrentProvider): - def __init__(self): - generic.TorrentProvider.__init__(self, "BLUETIGERS") - - self.supportsBacklog = True - self.enabled = False - self.username = None - self.password = None - self.ratio = None - self.token = None - self.tokenLastUpdate = None - - self.cache = BLUETIGERSCache(self) - - self.urls = {'base_url': 'https://www.bluetigers.ca/', - 'search': 'https://www.bluetigers.ca/torrents-search.php?search=%s%s', - 'login': 'https://www.bluetigers.ca/account-login.php', - 'download': 'https://www.bluetigers.ca/torrents-details.php?id=%s&hit=1', - } - - self.url = self.urls['base_url'] - self.categories = "&c16=1&c10=1&c130=1&c131=1&c17=1&c18=1&c19=1" - - def isEnabled(self): - return self.enabled - - def imageName(self): - return 'BLUETIGERS.png' - - def getQuality(self, item, anime=False): - quality = Quality.sceneQuality(item[0], anime) - return quality - - def _doLogin(self): - - - if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): - return True - - - login_params = {'username': self.username, - 'password': self.password, - 'take_login' : '1' - } - - if not self.session: - self.session = requests.Session() - - logger.log('Performing authentication to BLUETIGERS', logger.DEBUG) - try: - response = self.session.post(self.urls['login'], data=login_params, timeout=30) - except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError), e: - logger.log(u'Unable to connect to ' + self.name + ' provider: ' + ex(e), logger.ERROR) - return False - - if re.search('/account-logout.php', response.text): - logger.log(u'Login to ' + self.name + ' was successful.', logger.DEBUG) - return True - else: - logger.log(u'Login to ' + self.name + ' was unsuccessful.', logger.DEBUG) - return False - - return True - - def _get_season_search_strings(self, ep_obj): - - search_string = {'Season': []} - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + '.' + str(ep_obj.airdate).split('-')[0] - elif ep_obj.show.anime: - ep_string = show_name + '.' + "%d" % ep_obj.scene_absolute_number - else: - ep_string = show_name + '.S%02d' % int(ep_obj.scene_season) # 1) showName.SXX - - search_string['Season'].append(ep_string) - - return [search_string] - - def _get_episode_search_strings(self, ep_obj, add_string=''): - - search_string = {'Episode': []} - - if not ep_obj: - return [] - - if self.show.air_by_date: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = sanitizeSceneName(show_name) + '.' + \ - str(ep_obj.airdate).replace('-', '|') - search_string['Episode'].append(ep_string) - elif self.show.sports: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = sanitizeSceneName(show_name) + '.' + \ - str(ep_obj.airdate).replace('-', '|') + '|' + \ - ep_obj.airdate.strftime('%b') - search_string['Episode'].append(ep_string) - elif self.show.anime: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = sanitizeSceneName(show_name) + '.' + \ - "%i" % int(ep_obj.scene_absolute_number) - search_string['Episode'].append(ep_string) - else: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = show_name_helpers.sanitizeSceneName(show_name) + '.' + \ - sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep_obj.scene_season, - 'episodenumber': ep_obj.scene_episode} + ' %s' % add_string - - search_string['Episode'].append(re.sub('\s+', '.', ep_string)) - - return [search_string] - - def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None): - - logger.log(u"_doSearch started with ..." + str(search_params), logger.DEBUG) - - results = [] - items = {'Season': [], 'Episode': [], 'RSS': []} - - for mode in search_params.keys(): - - for search_string in search_params[mode]: - - if isinstance(search_string, unicode): - search_string = unidecode(search_string) - - - searchURL = self.urls['search'] % (urllib.quote(search_string), self.categories) - - logger.log(u"Search string: " + searchURL, logger.DEBUG) - - data = self.getURL(searchURL) - if not data: - continue - - try: - with BS4Parser(data, features=["html5lib", "permissive"]) as html: - result_linkz = html.findAll('a', href=re.compile("torrents-details")) - - if not result_linkz: - logger.log(u"The Data returned from " + self.name + " do not contains any torrent", - logger.DEBUG) - continue - - if result_linkz: - for link in result_linkz: - title = link.text - logger.log(u"BLUETIGERS TITLE TEMP: " + title, logger.DEBUG) - download_url = self.urls['base_url'] + "/" + link['href'] - download_url = download_url.replace("torrents-details","download") - logger.log(u"BLUETIGERS downloadURL: " + download_url, logger.DEBUG) - - if not title or not download_url: - continue - - item = title, download_url - logger.log(u"Found result: " + title.replace(' ','.') + " (" + download_url + ")", logger.DEBUG) - - items[mode].append(item) - - except Exception, e: - logger.log(u"Failed parsing " + self.name + " Traceback: " + traceback.format_exc(), logger.ERROR) - - results += items[mode] - - return results - - def _get_title_and_url(self, item): - - title, url = item - - if title: - title = self._clean_title_from_provider(title) - - if url: - url = str(url).replace('&', '&') - - return title, url - - def findPropers(self, search_date=datetime.datetime.today()): - - results = [] - - myDB = db.DBConnection() - sqlResults = myDB.select( - 'SELECT s.show_name, e.showid, e.season, e.episode, e.status, e.airdate FROM tv_episodes AS e' + - ' INNER JOIN tv_shows AS s ON (e.showid = s.indexer_id)' + - ' WHERE e.airdate >= ' + str(search_date.toordinal()) + - ' AND (e.status IN (' + ','.join([str(x) for x in Quality.DOWNLOADED]) + ')' + - ' OR (e.status IN (' + ','.join([str(x) for x in Quality.SNATCHED]) + ')))' - ) - - if not sqlResults: - return [] - - for sqlshow in sqlResults: - self.show = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) - if self.show: - curEp = self.show.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') - - for item in self._doSearch(searchString[0]): - title, url = self._get_title_and_url(item) - results.append(classes.Proper(title, url, datetime.datetime.today(), self.show)) - - return results - - def seedRatio(self): - return self.ratio - - -class BLUETIGERSAuth(AuthBase): - """Attaches HTTP Authentication to the given Request object.""" - def __init__(self, token): - self.token = token - - def __call__(self, r): - r.headers['Authorization'] = self.token - return r - - -class BLUETIGERSCache(tvcache.TVCache): - def __init__(self, provider): - tvcache.TVCache.__init__(self, provider) - - # Only poll BLUETIGERS every 10 minutes max - self.minTime = 10 - - def _getRSSData(self): - search_params = {'RSS': ['']} - return {'entries': self.provider._doSearch(search_params)} - - -provider = BLUETIGERSProvider() diff --git a/sickbeard/providers/fnt.py b/sickbeard/providers/fnt.py deleted file mode 100644 index 2cc56d925555e9284ec523fc4947d583e8ed3151..0000000000000000000000000000000000000000 --- a/sickbeard/providers/fnt.py +++ /dev/null @@ -1,300 +0,0 @@ -# -*- coding: latin-1 -*- -# Author: raver2046 <raver2046@gmail.com> from djoole <bobby.djoole@gmail.com> -# URL: http://code.google.com/p/sickbeard/ -# -# This file is part of Sick Beard. -# -# Sick Beard 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. -# -# Sick Beard 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 Sick Beard. If not, see <http://www.gnu.org/licenses/>. - -import traceback -import re -import datetime -import time -from lib.requests.auth import AuthBase -import sickbeard -import generic -import urllib -from lib import requests -from lib.requests import exceptions -from sickbeard.bs4_parser import BS4Parser -from sickbeard.common import Quality -from sickbeard import logger -from sickbeard import tvcache -from sickbeard import show_name_helpers -from sickbeard import db -from sickbeard import helpers -from sickbeard import classes -from lib.unidecode import unidecode -from sickbeard.helpers import sanitizeSceneName -from sickbeard.exceptions import ex - - -class FNTProvider(generic.TorrentProvider): - def __init__(self): - generic.TorrentProvider.__init__(self, "FNT") - - self.supportsBacklog = True - self.enabled = False - self.username = None - self.password = None - self.ratio = None - self.minseed = None - self.minleech = None - - self.cache = FNTCache(self) - - self.urls = {'base_url': 'https://fnt.nu', - 'search': 'https://www.fnt.nu/torrents/recherche/?afficher=1&recherche=%s%s', - 'login': 'https://fnt.nu/account-login.php', - 'download': 'https://fnt.nu/download.php?id=%s&dl=oui', - } - - self.url = self.urls['base_url'] - self.categories = "&afficher=1&c118=1&c129=1&c119=1&c120=1&c121=1&c126=1&c137=1&c138=1&c146=1&c122=1&c110=1&c109=1&c135=1&c148=1&c153=1&c149=1&c150=1&c154=1&c155=1&c156=1&c114=1&visible=1&freeleech=0&nuke=1&3D=0&sort=size&order=desc" - - def isEnabled(self): - return self.enabled - - def imageName(self): - return 'FNT.png' - - def getQuality(self, item, anime=False): - quality = Quality.sceneQuality(item[0], anime) - return quality - - def _doLogin(self): - - - if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): - return True - - login_params = {'username': self.username, - 'password': self.password, - 'submit' : 'Se loguer' - } - - if not self.session: - self.session = requests.Session() - - logger.log('Performing authentication to FNT', logger.DEBUG) - try: - response = self.session.post(self.urls['login'], data=login_params, timeout=30) - except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError), e: - logger.log(u'Unable to connect to ' + self.name + ' provider: ' + ex(e), logger.ERROR) - return False - - if re.search('/account-logout.php', response.text): - logger.log(u'Login to ' + self.name + ' was successful.', logger.DEBUG) - return True - else: - logger.log(u'Login to ' + self.name + ' was unsuccessful.', logger.DEBUG) - return False - - return True - - def _get_season_search_strings(self, ep_obj): - - search_string = {'Season': []} - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = show_name + '.' + str(ep_obj.airdate).split('-')[0] - elif ep_obj.show.anime: - ep_string = show_name + '.' + "%d" % ep_obj.scene_absolute_number - else: - ep_string = show_name + '.S%02d' % int(ep_obj.scene_season) # 1) showName.SXX - - search_string['Season'].append(ep_string) - - return [search_string] - - def _get_episode_search_strings(self, ep_obj, add_string=''): - - search_string = {'Episode': []} - - if not ep_obj: - return [] - - if self.show.air_by_date: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = sanitizeSceneName(show_name) + '.' + \ - str(ep_obj.airdate).replace('-', '|') - search_string['Episode'].append(ep_string) - elif self.show.sports: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = sanitizeSceneName(show_name) + '.' + \ - str(ep_obj.airdate).replace('-', '|') + '|' + \ - ep_obj.airdate.strftime('%b') - search_string['Episode'].append(ep_string) - elif self.show.anime: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = sanitizeSceneName(show_name) + '.' + \ - "%i" % int(ep_obj.scene_absolute_number) - search_string['Episode'].append(ep_string) - else: - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - ep_string = show_name_helpers.sanitizeSceneName(show_name) + '.' + \ - sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep_obj.scene_season, - 'episodenumber': ep_obj.scene_episode} + ' %s' % add_string - - search_string['Episode'].append(re.sub('\s+', '.', ep_string)) - - return [search_string] - - def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0, epObj=None): - - logger.log(u"_doSearch started with ..." + str(search_params), logger.DEBUG) - - results = [] - items = {'Season': [], 'Episode': [], 'RSS': []} - - for mode in search_params.keys(): - - - for search_string in search_params[mode]: - - if isinstance(search_string, unicode): - search_string = unidecode(search_string) - - - searchURL = self.urls['search'] % (urllib.quote(search_string), self.categories) - - logger.log(u"Search string: " + searchURL, logger.DEBUG) - - - data = self.getURL(searchURL) - if not data: - continue - - try: - with BS4Parser(data, features=["html5lib", "permissive"]) as html: - result_table = html.find('table', {'id': 'tablealign3bis'}) - - if not result_table: - logger.log(u"The Data returned from " + self.name + " do not contains any torrent", - logger.DEBUG) - continue - - if result_table: - rows = result_table.findAll("tr" , {"class" : "ligntorrent"} ) - - for row in rows: - link = row.findAll('td')[1].find("a" , href=re.compile("fiche_film") ) - - if link: - - try: - title = link.text - logger.log(u"FNT TITLE : " + title, logger.DEBUG) - download_url = self.urls['base_url'] + "/" + row.find("a",href=re.compile("download\.php"))['href'] - except (AttributeError, TypeError): - continue - - if not title or not download_url: - continue - - try: - id = download_url.replace(self.urls['base_url'] + "/" + 'download.php?id=', '').replace('&dl=oui', '').replace('&dl=oui', '') - logger.log(u"FNT id du torrent " + str(id), logger.DEBUG) - defailseedleech = link['mtcontent'] - seeders = int(defailseedleech.split("<font color='#00b72e'>")[1].split("</font>")[0]) - logger.log(u"FNT seeders : " + str(seeders), logger.DEBUG) - leechers = int(defailseedleech.split("<font color='red'>")[1].split("</font>")[0]) - logger.log(u"FNT leechers : " + str(leechers), logger.DEBUG) - except: - logger.log(u"Unable to parse torrent id & seeders leechers " + self.name + " Traceback: " + traceback.format_exc(), logger.DEBUG) - continue - - #Filter unseeded torrent - if mode != 'RSS' and (seeders < self.minseed or leechers < self.minleech): - continue - - item = title, download_url , id, seeders, leechers - logger.log(u"Found result: " + title.replace(' ','.') + " (" + download_url + ")", logger.DEBUG) - - items[mode].append(item) - - except Exception, e: - logger.log(u"Failed parsing " + self.name + " Traceback: " + traceback.format_exc(), logger.ERROR) - - results += items[mode] - - return results - - def _get_title_and_url(self, item): - - title, url, id, seeders, leechers = item - - if title: - title = self._clean_title_from_provider(title) - - if url: - url = str(url).replace('&', '&') - - return title, url - - def findPropers(self, search_date=datetime.datetime.today()): - - results = [] - - myDB = db.DBConnection() - sqlResults = myDB.select( - 'SELECT s.show_name, e.showid, e.season, e.episode, e.status, e.airdate FROM tv_episodes AS e' + - ' INNER JOIN tv_shows AS s ON (e.showid = s.indexer_id)' + - ' WHERE e.airdate >= ' + str(search_date.toordinal()) + - ' AND (e.status IN (' + ','.join([str(x) for x in Quality.DOWNLOADED]) + ')' + - ' OR (e.status IN (' + ','.join([str(x) for x in Quality.SNATCHED]) + ')))' - ) - - if not sqlResults: - return [] - - for sqlshow in sqlResults: - self.show = helpers.findCertainShow(sickbeard.showList, int(sqlshow["showid"])) - if self.show: - curEp = self.show.getEpisode(int(sqlshow["season"]), int(sqlshow["episode"])) - searchString = self._get_episode_search_strings(curEp, add_string='PROPER|REPACK') - - for item in self._doSearch(searchString[0]): - title, url = self._get_title_and_url(item) - results.append(classes.Proper(title, url, datetime.datetime.today(), self.show)) - - return results - - def seedRatio(self): - return self.ratio - - -class FNTAuth(AuthBase): - """Attaches HTTP Authentication to the given Request object.""" - def __init__(self, token): - self.token = token - - def __call__(self, r): - r.headers['Authorization'] = self.token - return r - - -class FNTCache(tvcache.TVCache): - def __init__(self, provider): - tvcache.TVCache.__init__(self, provider) - - # Only poll FNT every 10 minutes max - self.minTime = 10 - - def _getRSSData(self): - search_params = {'RSS': ['']} - return {'entries': self.provider._doSearch(search_params)} - - -provider = FNTProvider()