diff --git a/sickbeard/providers/nyaatorrents.py b/sickbeard/providers/nyaatorrents.py index 407e212d621cecc266f4f847bb980ceaa5b9b0db..088a72c12d32f8ec3a8610f7dcc42e657f61769a 100644 --- a/sickbeard/providers/nyaatorrents.py +++ b/sickbeard/providers/nyaatorrents.py @@ -1,7 +1,7 @@ # Author: Mr_Orange # URL: http://code.google.com/p/sickbeard/ # -# This file is part of SickRage. +# 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 @@ -46,63 +46,71 @@ class NyaaProvider(generic.TorrentProvider): self.url = self.urls['base_url'] + self.minseed = 0 + self.minleech = 0 + self.confirmed = False + def isEnabled(self): return self.enabled - def getQuality(self, item, anime=False): - title = item.get('title') - quality = Quality.sceneQuality(title, anime) - return quality + def _doSearch(self, search_strings, search_mode='eponly', epcount=0, age=0, epObj=None): + if self.show and not self.show.is_anime: + return [] - def findSearchResults(self, show, episodes, search_mode, manualSearch=False, downCurQuality=False): - return generic.TorrentProvider.findSearchResults(self, show, episodes, search_mode, manualSearch, downCurQuality) + results = [] + items = {'Season': [], 'Episode': [], 'RSS': []} - def _get_season_search_strings(self, ep_obj): - return [x for x in show_name_helpers.makeSceneSeasonSearchString(self.show, ep_obj)] + for mode in search_strings.keys(): + logger.log(u"Search Mode: %s" % mode, logger.DEBUG) + for search_string in search_strings[mode]: + if mode != 'RSS': + logger.log(u"Search string: %s" % search_string, logger.DEBUG) - def _get_episode_search_strings(self, ep_obj, add_string=''): - return [x for x in show_name_helpers.makeSceneSearchString(self.show, ep_obj)] + params = { + "page": 'rss', + "cats": '1_0', # All anime + "sort": 2, # Sort Descending By Seeders + "order": 1 + } + if mode != 'RSS': + params["term"] = search_string.encode('utf-8') - def _doSearch(self, search_string, search_mode='eponly', epcount=0, age=0, epObj=None): - #FIXME - if self.show and not self.show.is_anime: - return [] + searchURL = self.url + '?' + urllib.urlencode(params) + logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) - logger.log(u"Search string: %s " % search_string, logger.DEBUG) + summary_regex = ur"(\d+) seeder\(s\), (\d+) leecher\(s\), \d+ download\(s\) - (\d+.?\d* [KMGT]iB)(.*)" + s = re.compile(summary_regex, re.DOTALL) - params = { - "term": search_string.encode('utf-8'), - "cats": '1_0', # All anime - "sort": '2', # Sort Descending By Seeders - } + results = [] + for curItem in self.cache.getRSSFeed(searchURL, items=['entries'])['entries'] or []: + title = curItem['title'] + download_url = curItem['link'] + if not all([title, download_url]): + continue - searchURL = self.url + '?page=rss&' + urllib.urlencode(params) - logger.log(u"Search URL: %s" % searchURL, logger.DEBUG) + seeders, leechers, size, verified = s.findall(curItem['summary'])[0] + size = self._convertSize(size) + # 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 - results = [] - for curItem in self.cache.getRSSFeed(searchURL, items=['entries'])['entries'] or []: - title = curItem[0] - download_url = curItem[1] - #FIXME - size = -1 - seeders = 1 - leechers = 0 + if self.confirmed and not verified and mode != 'RSS': + logger.log(u"Found result " + title + " but that doesn't seem like a verified result so I'm ignoring it", logger.DEBUG) + continue - if not all([title, download_url]): - continue + item = title, download_url, size, seeders, leechers + if mode != 'RSS': + logger.log(u"Found result: %s " % title, logger.DEBUG) - #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 + items[mode].append(item) - item = title, download_url, size, seeders, leechers - logger.log(u"Found result: %s " % title, logger.DEBUG) + # For each search mode sort all the items by seeders if available + items[mode].sort(key=lambda tup: tup[3], reverse=True) - #FIX ME SORTING - results.append(curItem) + results += items[mode] return results @@ -114,6 +122,19 @@ class NyaaProvider(generic.TorrentProvider): return match.group(1) return None + def _convertSize(self, size): + size, modifier = size.split(' ') + size = float(size) + if modifier in 'KiB': + size = size * 1024 + elif modifier in 'MiB': + size = size * 1024**2 + elif modifier in 'GiB': + size = size * 1024**3 + elif modifier in 'TiB': + size = size * 1024**4 + return size + def seedRatio(self): return self.ratio @@ -126,16 +147,7 @@ class NyaaCache(tvcache.TVCache): self.minTime = 15 def _getRSSData(self): - params = { - "page": 'rss', # Use RSS page - "order": '1', # Sort Descending By Date - "cats": '1_37', # Limit to English-translated Anime (for now) - } - - url = self.provider.url + '?' + urllib.urlencode(params) - - logger.log(u"Cache update URL: %s" % url, logger.DEBUG) - - return self.getRSSFeed(url) + search_params = {'RSS': ['']} + return {'entries': self.provider._doSearch(search_params)} provider = NyaaProvider()