diff --git a/SickBeard.py b/SickBeard.py index 11202dee8f758feb2a6163e890e3c9d354ff12fb..c7ed1b4ee957abdd76c8b0fec06715db325343a9 100755 --- a/SickBeard.py +++ b/SickBeard.py @@ -86,7 +86,7 @@ if os.path.isdir(OLD_TORNADO): shutil.rmtree(OLD_TORNADO + '_kill') import sickbeard -from sickbeard import db, logger, network_timezones, failed_history, name_cache +from sickbeard import db, logger, network_timezones, failed_history # , name_cache from sickbeard.tv import TVShow from sickbeard.webserveInit import SRWebServer from sickbeard.event_queue import Events @@ -360,7 +360,7 @@ class SickRage(object): sickbeard.start() # Build internal name cache - name_cache.buildNameCache() + # name_cache.buildNameCache() # Pre-populate network timezones, it isn't thread safe network_timezones.update_network_dict() diff --git a/sickbeard/providers/morethantv.py b/sickbeard/providers/morethantv.py index 115a911e88daad00eedd4f3cbc114a1c71348817..f44feab0d4f769762ef9b78f86a515ebfa5345e6 100644 --- a/sickbeard/providers/morethantv.py +++ b/sickbeard/providers/morethantv.py @@ -23,12 +23,12 @@ import re import requests -import traceback +from urllib import urlencode from sickbeard import logger from sickbeard import tvcache from sickbeard.bs4_parser import BS4Parser -from sickrage.helper.common import convert_size +from sickrage.helper.common import try_int, convert_size from sickrage.helper.exceptions import AuthException from sickrage.providers.torrent.TorrentProvider import TorrentProvider @@ -46,17 +46,12 @@ class MoreThanTVProvider(TorrentProvider): # pylint: disable=too-many-instance- self.ratio = None self.minseed = None self.minleech = None - # self.freeleech = False - self.urls = {'base_url': 'https://www.morethan.tv/', - 'login': 'https://www.morethan.tv/login.php', - 'detail': 'https://www.morethan.tv/torrents.php?id=%s', - 'search': 'https://www.morethan.tv/torrents.php?tags_type=1&order_by=time&order_way=desc&action=basic&searchsubmit=1&searchstr=%s', - 'download': 'https://www.morethan.tv/torrents.php?action=download&id=%s'} - - self.url = self.urls['base_url'] - - self.cookies = None + self.url = 'https://www.morethan.tv/' + self.urls = { + 'login': self.url + 'login.php', + 'search': self.url + 'torrents.php', + } self.proper_strings = ['PROPER', 'REPACK'] @@ -73,39 +68,48 @@ class MoreThanTVProvider(TorrentProvider): # pylint: disable=too-many-instance- if any(requests.utils.dict_from_cookiejar(self.session.cookies).values()): return True - if self._uid and self._hash: - requests.utils.add_dict_to_cookiejar(self.session.cookies, self.cookies) - else: - login_params = {'username': self.username, - 'password': self.password, - 'login': 'Log in', - 'keeplogged': '1'} + login_params = { + 'username': self.username, + 'password': self.password, + 'login': 'Log in', + 'keeplogged': '1' + } - response = self.get_url(self.urls['login'], post_data=login_params, timeout=30) - if not response: - logger.log(u"Unable to connect to provider", logger.WARNING) - return False + response = self.get_url(self.urls['login'], post_data=login_params, timeout=30) + if not response: + logger.log(u"Unable to connect to provider", logger.WARNING) + return False - if re.search('Your username or password was incorrect.', response): - logger.log(u"Invalid username or password. Check your settings", logger.WARNING) - return False + if re.search('Your username or password was incorrect.', response): + logger.log(u"Invalid username or password. Check your settings", logger.WARNING) + return False - return True + return True - def search(self, search_params, age=0, ep_obj=None): # pylint: disable=too-many-branches, too-many-locals + def search(self, search_strings, age=0, ep_obj=None): # pylint: disable=too-many-branches, too-many-locals results = [] if not self.login(): return results - for mode in search_params: + search_params = { + 'tags_type': 1, + 'order_by': 'time', + 'order_way': 'desc', + 'action': 'basic', + 'searchsubmit': 1, + 'searchstr': '' + } + + for mode in search_strings: items = [] logger.log(u"Search Mode: %s" % mode, logger.DEBUG) - for search_string in search_params[mode]: - + for search_string in search_strings[mode]: if mode != 'RSS': logger.log(u"Search string: %s " % search_string, logger.DEBUG) - search_url = self.urls['search'] % (search_string.replace('(', '').replace(')', '')) + search_params['searchstr'] = search_string + + search_url = "%s?%s" % (self.urls['search'], urlencode(search_params)) logger.log(u"Search URL: %s" % search_url, logger.DEBUG) # returns top 15 results by default, expandable in user profile to 100 @@ -113,64 +117,56 @@ class MoreThanTVProvider(TorrentProvider): # pylint: disable=too-many-instance- if not data: continue - try: - with BS4Parser(data, 'html5lib') as html: - torrent_table = html.find('table', attrs={'class': 'torrent_table'}) - torrent_rows = torrent_table.findChildren('tr') if torrent_table else [] - - # Continue only if one Release is found - if len(torrent_rows) < 2: - logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) - continue - - # skip colheader - for result in torrent_rows[1:]: - cells = result.findChildren('td') + with BS4Parser(data, 'html5lib') as html: + torrent_table = html.find('table', class_='torrent_table') + torrent_rows = torrent_table.find_all('tr') if torrent_table else [] - # skip if torrent has been nuked due to poor quality - nuked = cells[1].find('img', alt='Nuked') - if nuked: - continue - - link = cells[1].find('a', attrs={'title': 'Download'}) - if not link: - continue - - torrent_id_long = link['href'].replace('torrents.php?action=download&id=', '') + # Continue only if one Release is found + if len(torrent_rows) < 2: + logger.log(u"Data returned from provider does not contain any torrents", logger.DEBUG) + continue - try: - if link.get('title', ''): - title = cells[1].find('a', {'title': 'View torrent'}).contents[0].strip() - else: - title = link.contents[0] - download_url = self.urls['download'] % torrent_id_long + def process_column_header(td): + result = '' + if td.a and td.a.img: + result = td.a.img.get('title', td.a.get_text(strip=True)) + if not result: + result = td.get_text(strip=True) + return result - seeders = cells[6].contents[0] - leechers = cells[7].contents[0] - torrent_size = cells[4].text.strip() + labels = [process_column_header(label) for label in torrent_rows[0].find_all('td')] - size = convert_size(torrent_size) or -1 - - except (AttributeError, TypeError): + # skip colheader + for result in torrent_rows[1:]: + try: + # skip if torrent has been nuked due to poor quality + if result.find('img', alt='Nuked'): continue + title = result.find('a', title='View torrent').get_text(strip=True) + download_url = self.url + result.find('span', title='Download').parent['href'] if not all([title, download_url]): continue - # Filter unseeded torrent - if seeders < self.minseed or leechers < self.minleech: - if mode != 'RSS': - logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) - continue + cells = result.find_all('td') + seeders = try_int(cells[labels.index('Seeders')].get_text(strip=True)) + leechers = try_int(cells[labels.index('Leechers')].get_text(strip=True)) + torrent_size = cells[labels.index('Size')].get_text(strip=True) + except StandardError: + continue - item = title, download_url, size, seeders, leechers + # Filter unseeded torrent + if seeders < self.minseed or leechers < self.minleech: if mode != 'RSS': - logger.log(u"Found result: %s " % title, logger.DEBUG) + logger.log(u"Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format(title, seeders, leechers), logger.DEBUG) + continue - items.append(item) + size = convert_size(torrent_size) or -1 + item = title, download_url, size, seeders, leechers + if mode != 'RSS': + logger.log(u"Found result: %s " % title, logger.DEBUG) - except Exception: - logger.log(u"Failed parsing provider. Traceback: %s" % traceback.format_exc(), logger.ERROR) + items.append(item) # For each search mode sort all the items by seeders if available items.sort(key=lambda tup: tup[3], reverse=True) @@ -192,7 +188,7 @@ class MoreThanTVCache(tvcache.TVCache): self.minTime = 20 def _getRSSData(self): - search_params = {'RSS': ['']} - return {'entries': self.provider.search(search_params)} + search_strings = {'RSS': ['']} + return {'entries': self.provider.search(search_strings)} provider = MoreThanTVProvider()