From 985bcf42443372dc8d440f43b2300cbf6531402b Mon Sep 17 00:00:00 2001 From: JackDandy Date: Thu, 4 May 2017 00:40:47 +0100 Subject: [PATCH] Remove provider Nyaa. Change improve RSS validation (particularly for anime). Change improve support for legacy magnet encoding. --- CHANGES.md | 9 +- gui/slick/images/providers/nyaatorrents.png | Bin 1949 -> 0 bytes sickbeard/providers/__init__.py | 3 +- sickbeard/providers/generic.py | 18 ++-- sickbeard/providers/nyaatorrents.py | 107 -------------------- sickbeard/providers/rsstorrent.py | 10 +- 6 files changed, 29 insertions(+), 118 deletions(-) delete mode 100644 gui/slick/images/providers/nyaatorrents.png delete mode 100644 sickbeard/providers/nyaatorrents.py diff --git a/CHANGES.md b/CHANGES.md index f612912f..5ad8c7d6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -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 diff --git a/gui/slick/images/providers/nyaatorrents.png b/gui/slick/images/providers/nyaatorrents.png deleted file mode 100644 index afa0b197e4a55ef0c94256c71bf1fa2b3b9a1fa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1949 zcmV;O2V(e%P)KLZ*U+@Om_!p#rO2g^M0T2_xn8WlYz|VRo{2h z7R-8~s+989_{5}@xj~v|SVK2!s&?S#%H<(|s_(lza_;?13gFuImGA%atf|SshSU>4 zvliI1kU9psYx^n$;})>zXy}KKc^2qW;}esR$pT&VC@uh9Q&Bt)bg9uwKV)3Mv>VkL zWafdMsYJe>h$9aGbd{thm1A3#Qr;@7=CtF=gx$wn|Iah)wwCoa0c(Sqkwd^%NF8ga zfl3^IVpoeJz>AQ&?1%XZuo+T+v}VR~z&1!fHLVVeMfmiqCmN$~0_z}MbHc&VIDf*M z8a^D=rq9eY4^?8!WjpAf1fGZV&4wHtiu`EQWT6Q3fVQd88i@I|gTdTLahc~tqklN! z(bPNDgJqx_wD(oBayas=osn*-67g#n{jeN+&=x&+cqrl&rVNTB%lWV|IuO;0-Ju$d zYsKWWb6_yW&--q9DDo!Gs#awz#$2tcVkzPge@kyH=F~UTs)a+q4$${=BvnPyWD1Fm z$9*g+l*nV@qi8aXgG&jCheY9|o@54R6KaTg@e5cCQ`T^W13>U$ckMe zEB1;Zu}|y~eOTf(@w(VA3L-1|#NKvoIiYV+=XRUtU0O&iDjXqyy1TWtqjyrh?bugN z-Fcw8`G{w^>?b(^0%qFC?aBTx&40I{!*N}ld+XZTOY};n7Us9#EY2PIq^1>?^14$oGct4Rf-m zlg<8;{WE(#`)T%U_V9}@3pVBZ?qq=wDZ~p?Fa3m_NDf1;;mNSkM`S> zOLQyoR-CoOHS^|1^98eDK4-pU4t4m<^=7X*U~VxB=EnBBCH0cMI85NSr@FFMgd4-d z;V2SCKou8{;}7kBTrD<q>F#F8dC{~qTohcbm3C$ zMsd@PTNm!Vfy?4TLetNt!Yxogd{e}OzxA!nK}3O=OVSwU-0n#sH-1eTd4c> zN+uZsAOe8W4otubFi9q0@&yXDDiH=d;8Hnr0ZAjYh@d3n=nHSM z8(5Be5T=$$3`Q*4X1Ge&vxd+VD3K9PT%>aHQEU<)KCp4b@Ttcsy?li%3K`Z3TfLOI zFwdNnX&wl1CY(&RNWCKC)9<1bhzRC^i-JMFN?t<}MMM)%Ff{oT%25PcyF@>Jizdc+ zWpaZ95Sw$}|Iw2DJf~=Itg~WLaz8WAd5PtQKn|-5xv5ziDmm((MJ9e^%RU z?(AW+jFGuN**>uJ7TbLK#wC_EI^0=ladrAUKm0bsdy5^W1cDns(eDj2>U%ino`2>2 zFpLY1qlwdmT)4;F!ZLp}TQtV%RQ)19-@MC5Uwn-T`uHavK~21f_DT#E^1=Oxg3=oM zPN_~l3|Wi~vq=fvk6Cdl zbT7S4n2QLa2oXV{T$3y5%^Jf=YE#7cL{yo1?gRQOH^^1SsSX}tefcKKC(dzftU;r* jMw;gF92d8wI{ys-kBVrr;r{M100000NkvXXu0mjf#D>1T diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py index 759da2f7..f133fd98 100755 --- a/sickbeard/providers/__init__.py +++ b/sickbeard/providers/__init__.py @@ -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', ] diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py index 2cd2cd37..5c4a585c 100644 --- a/sickbeard/providers/generic.py +++ b/sickbeard/providers/generic.py @@ -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): diff --git a/sickbeard/providers/nyaatorrents.py b/sickbeard/providers/nyaatorrents.py deleted file mode 100644 index 24a6f951..00000000 --- a/sickbeard/providers/nyaatorrents.py +++ /dev/null @@ -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 . - -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() diff --git a/sickbeard/providers/rsstorrent.py b/sickbeard/providers/rsstorrent.py index 8d3fea3b..f2102cc2 100644 --- a/sickbeard/providers/rsstorrent.py +++ b/sickbeard/providers/rsstorrent.py @@ -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)