From 5837598d29f2731c68ea83c73f466d7a658808f6 Mon Sep 17 00:00:00 2001 From: JackDandy Date: Wed, 17 Jun 2015 00:51:37 +0100 Subject: [PATCH] Change refactor TD to use torrent provider simplification and PEP8. Change provider TD login process to use General Config/Advanced/Proxy host setting. --- CHANGES.md | 2 + sickbeard/providers/speedcd.py | 2 +- sickbeard/providers/torrentbytes.py | 4 +- sickbeard/providers/torrentday.py | 222 +++++++--------------------- 4 files changed, 61 insertions(+), 169 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5574cd88..bca7b2ad 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -22,6 +22,7 @@ * Change provider IPT login process to use General Config/Advanced/Proxy host setting * Change provider TB PEP8 and code convention cleanup * Change provider TB login process to use General Config/Advanced/Proxy host setting +* Change provider TD login process to use General Config/Advanced/Proxy host setting * Remove useless webproxies from provider TPB as they fail for one reason or another * Change provider TPB to use mediaExtensions from common instead of hard-coded private list * Add new tld variants to provider TPB @@ -34,6 +35,7 @@ * Change refactor SCC to use torrent provider simplification and PEP8 * Change refactor SCD to use torrent provider simplification * Change refactor TB to use torrent provider simplification and PEP8 +* Change refactor TD to use torrent provider simplification and PEP8 * Remove HDTorrents torrent provider * Remove NextGen torrent provider * Add Rarbg torrent provider diff --git a/sickbeard/providers/speedcd.py b/sickbeard/providers/speedcd.py index d325c28e..a0f33c56 100644 --- a/sickbeard/providers/speedcd.py +++ b/sickbeard/providers/speedcd.py @@ -97,7 +97,7 @@ class SpeedCDProvider(generic.TorrentProvider): title = remove_tag.sub('', torrent['name']) url = self.urls['get'] % (torrent['id']) if title and url: - items[mode].append((title, url)) + items[mode].append((title, url, seeders)) except Exception: time.sleep(1.1) diff --git a/sickbeard/providers/torrentbytes.py b/sickbeard/providers/torrentbytes.py index fce0b307..d61a41f5 100644 --- a/sickbeard/providers/torrentbytes.py +++ b/sickbeard/providers/torrentbytes.py @@ -105,7 +105,7 @@ class TorrentBytesProvider(generic.TorrentProvider): continue if title and download_url: - items[mode].append((title, download_url)) + items[mode].append((title, download_url, seeders)) except generic.HaltParseException: pass @@ -115,7 +115,7 @@ class TorrentBytesProvider(generic.TorrentProvider): self._log_result(mode, len(items[mode]) - cnt, search_url) # For each search mode sort all the items by seeders - items[mode].sort(key=lambda tup: tup[3], reverse=True) + items[mode].sort(key=lambda tup: tup[2], reverse=True) results += items[mode] diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py index 0862ff11..094015d9 100644 --- a/sickbeard/providers/torrentday.py +++ b/sickbeard/providers/torrentday.py @@ -1,4 +1,4 @@ -# Author: Mr_Orange +# coding=utf-8 # # This file is part of SickGear. # @@ -17,141 +17,63 @@ import re import datetime +import time -import sickbeard -import generic -from sickbeard.common import Quality -from sickbeard import logger, tvcache, db, classes, helpers, show_name_helpers -from sickbeard.exceptions import ex -from lib import requests -from lib.requests import exceptions -from sickbeard.helpers import sanitizeSceneName +from . import generic +from sickbeard import logger, tvcache, helpers class TorrentDayProvider(generic.TorrentProvider): def __init__(self): + generic.TorrentProvider.__init__(self, 'TorrentDay') - generic.TorrentProvider.__init__(self, 'TorrentDay', True, False) - self.username = None - self.password = None - self._uid = None - self._hash = None - self.cookies = None + self.url_base = 'https://torrentday.eu/' + self.urls = {'config_provider_home_uri': self.url_base, + 'login': self.url_base + 'torrents/', + 'search': self.url_base + 'V3/API/API.php', + 'get': self.url_base + 'download.php/%s/%s'} - self.minseed = None - self.minleech = None + self.categories = {'Season': {'c14': 1}, + 'Episode': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1}, + 'Cache': {'c2': 1, 'c26': 1, 'c7': 1, 'c24': 1, 'c14': 1}} + + self.url = self.urls['config_provider_home_uri'] + + self.username, self.password, self.minseed, self.minleech = 4 * [None] self.freeleech = False - self.ratio = None - - self.urls = {'base_url': 'https://torrentday.eu', - 'login': 'https://torrentday.eu/torrents/', - 'search': 'https://torrentday.eu/V3/API/API.php', - 'download': 'https://torrentday.eu/download.php/%s/%s'} - - self.url = self.urls['base_url'] - - 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}} - self.cache = TorrentDayCache(self) - 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()): + logged_in = lambda: 'uid' in self.session.cookies and 'pass' in self.session.cookies + if logged_in(): return True - if self._uid and self._hash: - - requests.utils.add_dict_to_cookiejar(self.session.cookies, self.cookies) - - else: - + if self._checkAuth(): login_params = {'username': self.username, 'password': self.password, 'submit.x': 0, 'submit.y': 0} - - try: - response = self.session.post(self.urls['login'], data=login_params, timeout=30, verify=False) - except (requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as e: - logger.log(u'Unable to connect to ' + self.name + ' provider: ' + ex(e), logger.ERROR) - return False - - if re.search('You tried too often', response.text): - logger.log(u'Too many login attempts for ' + self.name + ', can\'t retrive any data', logger.ERROR) - return False - - if 401 == response.status_code: - logger.log(u'Your authentication credentials for ' + self.name + ' are incorrect, check your config.', logger.ERROR) - return False - - if requests.utils.dict_from_cookiejar(self.session.cookies)['uid'] and requests.utils.dict_from_cookiejar(self.session.cookies)['pass']: - self._uid = requests.utils.dict_from_cookiejar(self.session.cookies)['uid'] - self._hash = requests.utils.dict_from_cookiejar(self.session.cookies)['pass'] - self.cookies = {'uid': self._uid, 'pass': self._hash} + response = helpers.getURL(self.urls['login'], post_data=login_params, session=self.session) + if response and logged_in(): return True - else: - logger.log(u'Unable to obtain a cookie for TorrentDay', logger.ERROR) - return False + msg = u'Failed to authenticate' + if response and 'tried too often' in response: + msg = u'Too many login attempts' + logger.log(u'%s, abort provider %s' % (msg, self.name), logger.ERROR) - def _get_season_search_strings(self, ep_obj): - - if ep_obj.show.air_by_date or ep_obj.show.sports: - ep_string = str(ep_obj.airdate).split('-')[0] - elif ep_obj.show.anime: - ep_string = '%d' % ep_obj.scene_absolute_number - else: - ep_string = 'S%02d' % int(ep_obj.scene_season) # 1) showName SXX - - search_string = {'Season': []} - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - search_string['Season'].append('%s %s' % (show_name, ep_string)) - - return [search_string] - - def _get_episode_search_strings(self, ep_obj, add_string=''): - - if not ep_obj: - return [] - - if self.show.air_by_date or self.show.sports: - ep_detail = str(ep_obj.airdate).replace('-', '.') - if self.show.sports: - ep_detail += '|' + ep_obj.airdate.strftime('%b') - elif self.show.anime: - ep_detail = ep_obj.scene_absolute_number - else: - ep_detail = sickbeard.config.naming_ep_type[2] % {'seasonnumber': ep_obj.scene_season, - 'episodenumber': ep_obj.scene_episode} - - if add_string and not self.show.anime: - ep_detail += ' ' + add_string - - search_string = {'Episode': []} - for show_name in set(show_name_helpers.allPossibleShowNames(self.show)): - search_string['Episode'].append(re.sub('\s+', ' ', '%s %s' % (sanitizeSceneName(show_name), ep_detail))) - - return [search_string] + return False def _doSearch(self, search_params, search_mode='eponly', epcount=0, age=0): results = [] - items = {'Season': [], 'Episode': [], 'RSS': []} - if not self._doLogin(): - return [] + return results + + items = {'Season': [], 'Episode': [], 'Cache': []} for mode in search_params.keys(): for search_string in search_params[mode]: - - logger.log(u'Search string: ' + search_string, logger.DEBUG) - search_string = '+'.join(search_string.split()) - post_data = dict({'/browse.php?': None, 'cata': 'yes', 'jxt': 8, 'jxw': 'b', 'search': search_string}, **self.categories[mode]) @@ -159,85 +81,53 @@ class TorrentDayProvider(generic.TorrentProvider): post_data.update({'free': 'on'}) data_json = self.getURL(self.urls['search'], post_data=post_data, json=True) - if not data_json: - continue - + cnt = len(items[mode]) try: + if not data_json: + raise generic.HaltParseException torrents = data_json.get('Fs', [])[0].get('Cn', {}).get('torrents', []) + + for torrent in torrents: + seeders, leechers = int(torrent['seed']), int(torrent['leech']) + if 'Cache' != mode and (seeders < self.minseed or leechers < self.minleech): + continue + + title = re.sub(r'\[.*=.*\].*\[/.*\]', '', torrent['name']) + + download_url = self.urls['get'] % (torrent['id'], torrent['fname']) + + if title and download_url: + items[mode].append((title, download_url, seeders)) except Exception: - continue + time.sleep(1.1) - for torrent in torrents: + self._log_result(mode, len(items[mode]) - cnt, + ('search string: ' + search_string, self.name)['Cache' == mode]) - seeders = int(torrent['seed']) - leechers = int(torrent['leech']) - if 'RSS' != mode and (seeders < self.minseed or leechers < self.minleech): - continue - - title = re.sub(r'\[.*=.*\].*\[/.*\]', '', torrent['name']) - url = self.urls['download'] % (torrent['id'], torrent['fname']) - if title and url: - items[mode].append((title, url, seeders, leechers)) + # For each search mode sort all the items by seeders + items[mode].sort(key=lambda tup: tup[2], reverse=True) results += items[mode] return results - def _get_title_and_url(self, item): - - title, url = item[0], item[1] - - if title: - title = u'' + title.replace(' ', '.') - - if url: - url = str(url).replace('&', '&') - - return title, url - def findPropers(self, search_date=datetime.datetime.today()): - results = [] + return self._find_propers(search_date, '') - my_db = db.DBConnection() - sql_results = my_db.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]) + ')))' - ) + def _get_episode_search_strings(self, ep_obj, add_string='', **kwargs): - if not sql_results: - return [] - - for sqlshow in sql_results: - self.show = helpers.findCertainShow(sickbeard.showList, int(sqlshow['showid'])) - if self.show: - cur_ep = self.show.getEpisode(int(sqlshow['season']), int(sqlshow['episode'])) - - search_string = self._get_episode_search_strings(cur_ep, add_string='PROPER|REPACK') - - for item in self._doSearch(search_string[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 + return generic.TorrentProvider._get_episode_search_strings(self, ep_obj, add_string, sep_date='.') class TorrentDayCache(tvcache.TVCache): - def __init__(self, this_provider): + def __init__(self, this_provider): tvcache.TVCache.__init__(self, this_provider) - self.minTime = 10 - def _getRSSData(self): - search_params = {'RSS': ['']} - return self.provider._doSearch(search_params) + + return self.provider.get_cache_data() provider = TorrentDayProvider()