Merge branch 'hotfix/0.12.15'

This commit is contained in:
JackDandy 2017-05-04 00:41:29 +01:00
commit a016c3b845
6 changed files with 29 additions and 118 deletions

View file

@ -1,4 +1,11 @@
### 0.12.14 (2017-05-02 17:10:00 UTC)
### 0.12.15 (2017-05-04 00:40:00 UTC)
* Remove provider Nyaa
* Change improve RSS validation (particularly for anime)
* Change improve support for legacy magnet encoding
### 0.12.14 (2017-05-02 17:10:00 UTC)
* Change provider Transmithe.net is now Nebulance

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View file

@ -33,7 +33,7 @@ from . import alpharatio, beyondhd, bithdtv, bitmetv, btn, btscene, dh, extrator
thepiratebay, torlock, torrentday, torrenting, torrentleech, \
torrentz2, tvchaosuk, zooqle
# anime
from . import anizb, nyaatorrents, tokyotoshokan
from . import anizb, tokyotoshokan
# custom
try:
from . import custom01
@ -84,7 +84,6 @@ __all__ = ['omgwtfnzbs',
'torrentz2',
'tvchaosuk',
'zooqle',
'nyaatorrents',
'tokyotoshokan',
]

View file

@ -176,17 +176,21 @@ class GenericProvider:
final_dir = sickbeard.TORRENT_DIR
link_type = 'magnet'
try:
torrent_hash = re.findall('(?i)urn:btih:([0-9a-f]{32,40})', result.url)[0].upper()
btih = None
try:
btih = re.findall('urn:btih:([\w]{32,40})', result.url)[0]
if 32 == len(btih):
from base64 import b16encode, b32decode
btih = b16encode(b32decode(btih))
except (StandardError, Exception):
pass
if 32 == len(torrent_hash):
torrent_hash = b16encode(b32decode(torrent_hash)).lower()
if not torrent_hash:
if not btih or not re.search('(?i)[0-9a-f]{32,40}', btih):
logger.log('Unable to extract torrent hash from link: ' + ex(result.url), logger.ERROR)
return False
urls = ['http%s://%s/torrent/%s.torrent' % (u + (torrent_hash,))
for u in (('s', 'itorrents.org'), ('s', 'torra.pro'), ('s', 'torra.click'),
urls = ['http%s://%s/torrent/%s.torrent' % (u + (btih.upper(),))
for u in (('s', 'itorrents.org'), ('s', 'torra.pro'), ('s', 'torrasave.site'),
('s', 'torrage.info'), ('', 'reflektor.karmorra.info'),
('s', 'torrentproject.se'), ('', 'thetorrent.org'))]
except (StandardError, Exception):

View file

@ -1,107 +0,0 @@
#
# This file is part of SickGear.
#
# SickGear 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.
#
# SickGear 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 SickGear. If not, see <http://www.gnu.org/licenses/>.
import re
import urllib
from . import generic
from sickbeard import logger, show_name_helpers, tvcache
from sickbeard.helpers import tryInt
class NyaaProvider(generic.TorrentProvider):
def __init__(self):
generic.TorrentProvider.__init__(self, 'NyaaTorrents', anime_only=True)
self.url_base = self.url = 'https://www.nyaa.se/'
self.minseed, self.minleech = 2 * [None]
self.cache = NyaaCache(self)
def _search_provider(self, search_string, search_mode='eponly', **kwargs):
if self.show and not self.show.is_anime:
return []
params = urllib.urlencode({'term': search_string.encode('utf-8'),
'cats': '1_37', # Limit to English-translated Anime (for now)
# 'sort': '2', # Sort Descending By Seeders
})
return self.get_data(getrss_func=self.cache.getRSSFeed,
search_url='%s?page=rss&%s' % (self.url, params),
mode=('Episode', 'Season')['sponly' == search_mode])
def get_data(self, getrss_func, search_url, mode='cache'):
data = getrss_func(search_url)
results = []
if data and 'entries' in data:
rc = dict((k, re.compile('(?i)' + v)) for (k, v) in {
'stats': '(\d+)\W+seed[^\d]+(\d+)\W+leech[^\d]+\d+\W+down[^\d]+([\d.,]+\s\w+)'}.iteritems())
for cur_item in data.get('entries', []):
try:
seeders, leechers, size = 0, 0, 0
stats = rc['stats'].findall(cur_item.get('summary_detail', {'value': ''}).get('value', ''))
if len(stats):
seeders, leechers, size = (tryInt(n, n) for n in stats[0])
if self._peers_fail(mode, seeders, leechers):
continue
title, download_url = self._title_and_url(cur_item)
download_url = self._link(download_url)
except (AttributeError, TypeError, ValueError, IndexError):
continue
if title and download_url:
results.append((title, download_url, seeders, self._bytesizer(size)))
self._log_search(mode, len(results), search_url)
return self._sort_seeding(mode, results)
def _season_strings(self, ep_obj, **kwargs):
return show_name_helpers.makeSceneShowSearchStrings(self.show)
def _episode_strings(self, ep_obj, **kwargs):
return self._season_strings(ep_obj)
class NyaaCache(tvcache.TVCache):
def __init__(self, this_provider):
tvcache.TVCache.__init__(self, this_provider)
self.update_freq = 15
def _cache_data(self):
params = urllib.urlencode({'page': 'rss', # Use RSS page
'order': '1', # Sort Descending By Date
'cats': '1_37' # Limit to English-translated Anime (for now)
})
return self.provider.get_data(getrss_func=self.getRSSFeed,
search_url='%s?%s' % (self.provider.url, params))
provider = NyaaProvider()

View file

@ -88,7 +88,15 @@ class TorrentRssProvider(generic.TorrentProvider):
if not (title and url):
continue
if url.startswith('magnet:'):
if re.search('urn:btih:([0-9a-f]{32,40})', url):
btih = None
try:
btih = re.findall('urn:btih:([\w]{32,40})', url)[0]
if 32 == len(btih):
from base64 import b16encode, b32decode
btih = b16encode(b32decode(btih))
except (StandardError, Exception):
pass
if re.search('(?i)[0-9a-f]{32,40}', btih):
break
else:
torrent_file = self.get_url(url)