diff --git a/CHANGES.md b/CHANGES.md
index 37cadef4..8043632a 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -20,6 +20,7 @@
'non scene if no recent search results', 'non scene if no active search results',
'not scene nuked', and 'nuked if no active search results'
* Change improve tvdb_api performance; remember if episodes are cached and reload show if not and episodes are requested
+* Change remove redundant torrent URLs and improve provider loader
[develop changelog]
diff --git a/sickbeard/helpers.py b/sickbeard/helpers.py
index 30388e8a..375fa402 100644
--- a/sickbeard/helpers.py
+++ b/sickbeard/helpers.py
@@ -1166,6 +1166,8 @@ def getURL(url, post_data=None, params=None, headers=None, timeout=30, session=N
cache_dir = sickbeard.CACHE_DIR or _getTempDir()
session = CacheControl(sess=session, cache=caches.FileCache(ek.ek(os.path.join, cache_dir, 'sessions')))
+ provider = kwargs.pop('provider', None)
+
# session master headers
req_headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip,deflate'}
@@ -1220,6 +1222,10 @@ def getURL(url, post_data=None, params=None, headers=None, timeout=30, session=N
url = urlparse.urlunparse(parsed)
response = session.get(url, timeout=timeout, **kwargs)
+ # noinspection PyProtectedMember
+ if provider and provider._has_signature(response.content):
+ return response.content
+
if raise_status_code:
response.raise_for_status()
diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py
index 1b819d9b..978503cb 100755
--- a/sickbeard/providers/__init__.py
+++ b/sickbeard/providers/__init__.py
@@ -17,86 +17,38 @@
# along with SickGear. If not, see .
from os import sys
+import importlib
import os.path
import sickbeard
-from . import generic
+from . import generic, newznab
from .newznab import NewznabConstants
from sickbeard import logger, encodingKludge as ek
-# usenet
-from . import newznab, omgwtfnzbs
-# torrent
-from . import alpharatio, alphareign, beyondhd, bithdtv, bitmetv, blutopia, btn, btscene, dh, ettv, eztv, \
- fano, filelist, funfile, grabtheinfo, hdbits, hdme, hdspace, hdtorrents, horriblesubs, immortalseed, \
- iptorrents, limetorrents, magnetdl, morethan, nebulance, ncore, nyaa, pisexy, potuk, pretome, privatehd, ptf, \
- rarbg, revtt, scenehd, scenetime, shazbat, showrss, skytorrents, speedcd, \
- thepiratebay, torlock, torrentday, torrenting, torrentleech, \
- torrentz2, tvchaosuk, wop, xspeeds, zooqle
-# anime
-from . import anizb, tokyotoshokan
-# custom
-try:
- from . import custom01
-except (StandardError, Exception):
- pass
-__all__ = ['omgwtfnzbs',
- 'alpharatio',
- 'alphareign',
- 'anizb',
- 'beyondhd',
- 'bithdtv',
- 'bitmetv',
- 'blutopia',
- 'btn',
- 'btscene',
- 'custom01',
- 'dh',
- 'ettv',
- 'eztv',
- 'fano',
- 'filelist',
- 'funfile',
- 'grabtheinfo',
- 'hdbits',
- 'hdme',
- 'hdspace',
- 'hdtorrents',
- 'horriblesubs',
- 'immortalseed',
- 'iptorrents',
- 'limetorrents',
- 'magnetdl',
- 'morethan',
- 'nebulance',
- 'ncore',
- 'nyaa',
- 'pisexy',
- 'potuk',
- 'pretome',
- 'privatehd',
- 'ptf',
- 'rarbg',
- 'revtt',
- 'scenehd',
- 'scenetime',
- 'shazbat',
- 'showrss',
- 'skytorrents',
- 'speedcd',
- 'thepiratebay',
- 'torlock',
- 'torrentday',
- 'torrenting',
- 'torrentleech',
- 'torrentz2',
- 'tvchaosuk',
- 'wop',
- 'xspeeds',
- 'zooqle',
- 'tokyotoshokan',
- ]
+__all__ = [
+ # usenet
+ 'omgwtfnzbs',
+ # torrent
+ 'alpharatio', 'alphareign', 'beyondhd', 'bithdtv', 'bitmetv', 'blutopia', 'btn', 'btscene',
+ 'custom01', 'custom11', 'dh', 'ettv', 'eztv', 'fano', 'filelist', 'funfile', 'grabtheinfo',
+ 'hdbits', 'hdme', 'hdspace', 'hdtorrents', 'horriblesubs',
+ 'immortalseed', 'iptorrents', 'limetorrents', 'magnetdl', 'morethan', 'nebulance', 'ncore', 'nyaa',
+ 'pisexy', 'potuk', 'pretome', 'privatehd', 'ptf',
+ 'rarbg', 'revtt', 'scenehd', 'scenetime', 'shazbat', 'showrss', 'skytorrents', 'speedcd',
+ 'thepiratebay', 'torlock', 'torrentday', 'torrenting', 'torrentleech', 'torrentz2', 'tvchaosuk',
+ 'wop', 'xspeeds', 'zooqle',
+ # anime
+ 'anizb', 'tokyotoshokan',
+ ]
+for module in __all__:
+ try:
+ m = importlib.import_module('.' + module, 'sickbeard.providers')
+ globals().update({n: getattr(m, n) for n in m.__all__} if hasattr(m, '__all__')
+ else dict(filter(lambda t: '_' != t[0][0], m.__dict__.items())))
+ except ImportError as e:
+ if 'custom' != module[0:6]:
+ raise e
def sortedProviderList():
diff --git a/sickbeard/providers/btscene.py b/sickbeard/providers/btscene.py
index 77d3e2c5..e1d85d39 100644
--- a/sickbeard/providers/btscene.py
+++ b/sickbeard/providers/btscene.py
@@ -37,36 +37,6 @@ class BTSceneProvider(generic.TorrentProvider):
'z Rn Y', 'uVv2vY', '1 5vSZ', 'sJ omb', 'rNov2b', 'uQoWvZ', '0FvoGb']],
[re.sub('[v\sp]+', '', x[::-1]) for x in [
'zRnp Y', 'upVp2Y', '15SvpZ', 'spJpmb', 'r N 2b', 'u QvWZ', '=Mvm d']],
- [re.sub('[P\sh]+', '', x[::-1]) for x in [
- 'zh RnY', 'uV2 Y', '1P5ShZ', 's Jm b', 'rN2h b', 'uQPW Z', '=ghXPb']],
- [re.sub('[g\si]+', '', x[::-1]) for x in [
- 'zRiniY', 'uVgg2Y', '1 i5SZ', 'sJiimb', 'rN2igb', 'u IX Z', 'ul 2d']],
- [re.sub('[O\sp]+', '', x[::-1]) for x in [
- 'zORnOY', 'uV2OpY', '15pSOZ', 'spJpmb', 'rN2O b', 'uOIXpZ', '=pM2OY']],
- [re.sub('[ \sH]+', '', x[::-1]) for x in [
- 'zRHnHY', 'l H52b', '15HHSM', 'sJ mHb', 'rN 2 b', 'uQ WHZ', 's 9 Gb']],
- [re.sub('[o\s ]+', '', x[::-1]) for x in [
- 'zRoonY', 'l5 2 b', '15ooSM', 'sJomob', 'rN2o b', 'uoQW Z', 'mRo3od']],
- [re.sub('[0\sg]+', '', x[::-1]) for x in [
- 'zR0n0Y', 'l5 g2b', '1g5S M', 'sJm gb', 'rN0g2b', 'uQW 0Z', '=gMX b']],
- [re.sub('[r\sj]+', '', x[::-1]) for x in [
- 'zR nrY', 'uVj2rY', 'ir 5SZ', 'hB Xre', 'lN j3c', 'vj 5CZ', '=jjcmc']],
- [re.sub('[M\st]+', '', x[::-1]) for x in [
- 'z MRnY', 'uV2tMY', 'i5 StZ', 'hBtXte', 'lN3 tc', 'lMM5CZ', '== tQd']],
- [re.sub('[K\so]+', '', x[::-1]) for x in [
- 'zR n Y', 'uV2 oY', 'i5 SZ', 'hBX oe', 'loNK3c', 'i 5CoZ', '=K=goe']],
- [re.sub('[i\sP]+', '', x[::-1]) for x in [
- 'ctQiniY', 'mblNPP2', 'M 2YPtU', 'vJHPcPu', 'c z5PCe', 'QZj FPG', '=i =']],
- [re.sub('[k\sq]+', '', x[::-1]) for x in [
- '2Yzk RnY', '0k5qSZuV', 'WZyJ3qqb', 'p1m ke05', 'i cvJnkc', '=cmkckv5']],
- [re.sub('[f\sG]+', '', x[::-1]) for x in [
- 'Rn Y', '2 fYz', 'Z fuV', 'sf 5S', 'RffXY', 'nGfLv', '3ffB']],
- [re.sub('[t\sF]+', '', x[::-1]) for x in [
- 'zFtRnY', 'u V2Y', '65S tZ', '2NFG e', 'pdFnFL', '= =Fgb']],
- [re.sub('[q\s ]+', '', x[::-1]) for x in [
- 't QqnY', 'l N2 c', 'tUmq b', 'uM2 Y', 'vl Wqd', 'hZ qmL', 'oRXqqa']],
- [re.sub('[o\st]+', '', x[::-1]) for x in [
- 'YzRnooY', 'SoZu V2', 'Jmtb 15', 'rN 2bs', 'Ls xWtY', 'wZyt 9m', '= t=']],
]]]
self.url_vars = {'search': '?q=%s&order=1', 'browse': 'lastdaycat/type/Series/',
'get': 'torrentdownload.php?id=%s'}
diff --git a/sickbeard/providers/eztv.py b/sickbeard/providers/eztv.py
index 4d84000f..94215f17 100644
--- a/sickbeard/providers/eztv.py
+++ b/sickbeard/providers/eztv.py
@@ -38,22 +38,6 @@ class EztvProvider(generic.TorrentProvider):
'0vp XZ', 'uvEj d', 'i5 Wzd', 'j9 vGb', 'kV2v a', '0zdvnL', '==vg Z']],
[re.sub('[f\sT]+', '', x[::-1]) for x in [
'0TpfXZ', 'ufTEjd', 'i5WTTd', 'j9f Gb', 'kV f2a', 'z1mTTL']],
- [re.sub('[ \sR]+', '', x[::-1]) for x in [
- '0pXRRZ', 'h 1id', 'w5yRRZ', '4 9 mc', 'w N nL', 'lNRW Y']],
- [re.sub('[x\su]+', '', x[::-1]) for x in [
- 'dx0xpXZ', '3bx05xi', '5WZyxuJ', 'p1mexu0', 'c vuJnc', 'mcuuv5i', '= c']],
- [re.sub('[T\sr]+', '', x[::-1]) for x in [
- 'XT Z', '0Trp', 'iTTd', 'sT 5', 'XTrY', 'vT R', 'nrrL', '3T B']],
- [re.sub('[l\sT]+', '', x[::-1]) for x in [
- 'pX Z', 'idl 0', 'e6l 5', '2lTNG', 'd nTL', 'g blp', '= =']],
- [re.sub('[T\sR]+', '', x[::-1]) for x in [
- '0p X Z', 'h1iRRd', '15R yZ', 'u 8WRa', 'p RFmZ', '=gTGRd']],
- [re.sub('[T\st]+', '', x[::-1]) for x in [
- '0 ptXZ', '1T5i d', 'sTtJmb', 'rtN2Tb', 'sx WTY', 'ytT9mL', '=t=wTZ']],
- [re.sub('[o\sz]+', '', x[::-1]) for x in [
- '0zopXZ', '1z5oid', 'sJ mb', 'rNz2zb', 'uz QWZ', '0FGoob']],
- [re.sub('[k\sv]+', '', x[::-1]) for x in [
- 'Xk Z', '0kkp', 'ivvd', 'y k5', 'WkvZ', '= Q']],
]]]
self.url_vars = {'search': 'search/%s', 'browse': 'page_%s'}
self.url_tmpl = {'config_provider_home_uri': '%(home)s',
diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py
index c7db210e..893eb9a6 100644
--- a/sickbeard/providers/generic.py
+++ b/sickbeard/providers/generic.py
@@ -21,6 +21,7 @@ from __future__ import with_statement
import datetime
import itertools
+import json
import math
import os
import re
@@ -30,7 +31,7 @@ import threading
import socket
from urllib import quote_plus
import zlib
-from base64 import b16encode, b32decode
+from base64 import b16encode, b32decode, b64decode
import sickbeard
import requests
@@ -714,6 +715,16 @@ class GenericProvider(object):
except (StandardError, Exception):
logger.log(u'Failed to save magnet link to file, %s' % final_file)
elif not saved:
+ if 'torrent' == link_type and result.provider.get_id() in sickbeard.PROVIDER_HOMES:
+ # home var url can differ to current url if a url has changed, so exclude both on error
+ urls = list(set([sickbeard.PROVIDER_HOMES[result.provider.get_id()][0]]
+ + re.findall('^(https?://[^/]+/)', result.url)
+ + getattr(sickbeard, 'PROVIDER_EXCLUDE', [])))
+ sickbeard.PROVIDER_HOMES[result.provider.get_id()] = ('', None)
+ # noinspection PyProtectedMember
+ result.provider._valid_home(url_exclude=urls)
+ setattr(sickbeard, 'PROVIDER_EXCLUDE', ([], urls)[any([result.provider.url])])
+
logger.log(u'Server failed to return anything useful', logger.ERROR)
return saved
@@ -1446,7 +1457,58 @@ class TorrentProvider(GenericProvider):
return data and re.search(r'(?sim) max([len(x) for x in url_list]):
+ url_list = self._decode_urls(url_exclude)
+ if not url_list and getattr(self, 'url_edit', None) or not any(filter(lambda u: 10 < len(u), url_list)):
return None
- url_list = ['%s/' % x.rstrip('/') for x in url_list]
+ url_list = map(lambda u: '%s/' % u.rstrip('/'), url_list)
last_url, expire = sickbeard.PROVIDER_HOMES.get(self.get_id(), ('', None))
- url_drop = getattr(self, 'url_drop', [])
+ url_drop = (url_exclude or []) + getattr(self, 'url_drop', [])
if url_drop and any([url in last_url for url in url_drop]): # deprecate url
last_url = ''
diff --git a/sickbeard/providers/iptorrents.py b/sickbeard/providers/iptorrents.py
index 2cdf4785..2691cc92 100644
--- a/sickbeard/providers/iptorrents.py
+++ b/sickbeard/providers/iptorrents.py
@@ -31,23 +31,12 @@ class IPTorrentsProvider(generic.TorrentProvider):
def __init__(self):
generic.TorrentProvider.__init__(self, 'IPTorrents')
- self.url_home = (['https://iptorrents.%s/' % u for u in 'eu', 'com', 'me', 'ru'] +
- ['http://rss.workisboring.com/'] +
+ self.url_home = (['https://iptorrents.com/'] +
[base64.b64decode(x) for x in [''.join(x) for x in [
[re.sub('(?i)[q\s1]+', '', x[::-1]) for x in [
'c0RHa', 'vo1QD', 'hJ2L', 'GdhdXe', 'vdnLoN', 'J21cptmc', '5yZulmcv', '02bj', '=iq=']],
[re.sub('(?i)[q\seg]+', '', x[::-1]) for x in [
'RqHEa', 'LvEoDc0', 'Zvex2', 'LuF2', 'NXdu Vn', 'XZwQxeWY1', 'Yu42bzJ', 'tgG92']],
- [re.sub('(?i)[q\sek]+', '', x[::-1]) for x in [
- 'H qa', 'vQoDc0R', '2L ', 'bod', 'hNmLk0N3', 'WLlxemY', 'LtVGZv1', 'wZy9m', '=kQ=']],
- [re.sub('(?i)[q\seg1]+', '', x[::-1]) for x in [
- 'HGa', 'voDc0R', '21L', 'bucmbvt', 'ZyZWQ1L0Vm', 'ycrFW', '02bej5', 'e=gq']],
- [re.sub('(?i)[q\sei]+', '', x[::-1]) for x in [
- 'Q0RHa', 'voiQDc', 'asF2L', 'hVmLuVW', 'yZulGd', 'mbhdmcv1', 'Adl5mLjl', '==Qe']],
- [re.sub('[r\sh]+', '', x[::-1]) for x in [
- 'fzRh3re', 'ChdwhlW', 'FW Zyh5', 'vJWhrLk', 'Lhz t2b', 'wZyhh9m', '=rr=']],
- [re.sub('[S\sN]+', '', x[::-1]) for x in [
- 'zSSR3e', 'wNlWNf', 'zN 5Cd', '2SNJXZ', 'ySNAXZ', 'j5SSCc', '=S02 b']],
]]])
self.url_vars = {'login': 't', 'search': 't?%s;q=%s;qf=ti%s%s#torrents'}
diff --git a/sickbeard/providers/limetorrents.py b/sickbeard/providers/limetorrents.py
index fa827264..b9926588 100644
--- a/sickbeard/providers/limetorrents.py
+++ b/sickbeard/providers/limetorrents.py
@@ -38,34 +38,6 @@ class LimeTorrentsProvider(generic.TorrentProvider):
'XZFtlpGb', 'lJn pcvR', 'nFLpzRnb', 'v xpmYuV', 'CZlt F2Y', '=F QXYs5']],
[re.sub('[K\sP]+', '', x[::-1]) for x in [
'XZKtPlGb', 'lJncPPvR', 'nKLzRnKb', 'vxm Y uV', 'CZlPt2PY', '==wYK2P5']],
- [re.sub('[i\sQ]+', '', x[::-1]) for x in [
- 'X ZtlGQb', 'l Jn cvR', 'nLzQQRnb', 'vxmQYuiV', 'CZQlt2iY', '=ii=Aet5']],
- [re.sub('[q\sX]+', '', x[::-1]) for x in [
- 't lGqb', 'uXETqZ', 'i5WqXd', 'j 9Gqb', 'kqV2Xa', 'z1qm L']],
- [re.sub('[w\sF]+', '', x[::-1]) for x in [
- 'twlGFb', 'uEF TZ', 'i5W wd', 'j9 G b', 'kVw2 a', '0dnFFL', '==F gZ']],
- [re.sub('[Q\sy]+', '', x[::-1]) for x in [
- 'XZQtlGyb', 'lJQncyvR', 'nLzRyn b', 'vxmY uyV', 'icltQ2QY', '=4WaQ3y5']],
- [re.sub('[0\sp]+', '', x[::-1]) for x in [
- 'XZtlGp b', 'lJncppvR', 'n0LzR0nb', 'vx0mpYuV', 'icl0t2 Y', '==p0wYj5']],
- [re.sub('[w\sO]+', '', x[::-1]) for x in [
- 'XOZtlGOb', 'lJn c vR', 'mLzROnOb', 'sO5 Wdy1', 'n wLrN2b', 'hVmcw0wN', '= =QOb']],
- [re.sub('[K\sO]+', '', x[::-1]) for x in [
- 'XZtlK Gb', 'lJOncvKR', 'mLz RnKb', 'sK5W dy1', 'mLrKON2b', '=K8mZu l']],
- [re.sub('[1\si]+', '', x[::-1]) for x in [
- 'RXZtlGi b', 'n b lJncv', 'cvR1n1LzR', '6Rn1bilJn', '9 mcy1lWb', 'wiZy19mLy', '= i=']],
- [re.sub('[s\sg]+', '', x[::-1]) for x in [
- 'tlG sb', 'vR XsZ', 'lgJsnc', 'zR nb', 'hxgmsL', 'u8 G d', '=sc Hc']],
- [re.sub('[o\sS]+', '', x[::-1]) for x in [
- 'toSlGb', 'vR oXZ', 'lJSnoc', 'z Rnob', '4opnSL', 'uY3SSY', 'ul 2d']],
- [re.sub('[r\sS]+', '', x[::-1]) for x in [
- 'XrZtlSGb', 'lJn rcvR', 'mLzrRn b', 'zFSGc5SJ', 'mL kV2c', '=S=wSZy9']],
- [re.sub('[f\sQ]+', '', x[::-1]) for x in [
- 'Z tflGb', 'nQc vRX', 'RnQblQJ', '5 fJmLz', 'czfFGQc', 'm LfkV2', '1ffV']],
- [re.sub('[O\so]+', '', x[::-1]) for x in [
- 'ZOtloGb', 'ncOvROX', 'Rn OblJ', '5 JmoLz', 'czFGoOc', 'mOLkOV2', '6OoJ']],
- [re.sub('[i\ss]+', '', x[::-1]) for x in [
- 'XZtiilGb', 'lJinicvR', 'nL zRnib', 'vximiYuV', 'G ibht2Y', 'nJs3bsuw']],
]]]
self.url_vars = {'search': 'search/tv/%s/', 'browse': 'browse-torrents/TV-shows/'}
@@ -96,7 +68,7 @@ class LimeTorrentsProvider(generic.TorrentProvider):
search_url = self.urls['browse'] if 'Cache' == mode \
else self.urls['search'] % (urllib.quote_plus(search_string))
- html = self.get_url(search_url)
+ html = self.get_url(search_url, provider=self)
if self.should_skip():
return results
diff --git a/sickbeard/providers/skytorrents.py b/sickbeard/providers/skytorrents.py
index 53b1788d..0855a448 100644
--- a/sickbeard/providers/skytorrents.py
+++ b/sickbeard/providers/skytorrents.py
@@ -45,7 +45,7 @@ class SkytorrentsProvider(generic.TorrentProvider):
items = {'Cache': [], 'Season': [], 'Episode': [], 'Propers': []}
rc = dict((k, re.compile('(?i)' + v)) for (k, v) in {
- 'info': '^torrent/', 'get': '^magnet:'}.items())
+ 'info': '^(info|torrent)/', 'get': '^magnet:'}.items())
for mode in search_params.keys():
for search_string in search_params[mode]:
diff --git a/sickbeard/providers/thepiratebay.py b/sickbeard/providers/thepiratebay.py
index 66e04359..01b98b7b 100644
--- a/sickbeard/providers/thepiratebay.py
+++ b/sickbeard/providers/thepiratebay.py
@@ -37,32 +37,12 @@ class ThePirateBayProvider(generic.TorrentProvider):
def __init__(self):
generic.TorrentProvider.__init__(self, 'The Pirate Bay')
- self.url_home = ['https://thepiratebay.%s/' % u for u in 'se', 'org'] + \
+ self.url_home = ['https://thepiratebay.se/'] + \
['https://%s/' % base64.b64decode(x) for x in [''.join(x) for x in [
[re.sub('[h\sI]+', '', x[::-1]) for x in [
'm IY', '5 F', 'HhIc', 'vI J', 'HIhe', 'uI k', '2 d', 'uh l']],
[re.sub('[N\sQ]+', '', x[::-1]) for x in [
'lN Gc', 'X Yy', 'c lNR', 'vNJNH', 'kQNHe', 'GQdQu', 'wNN9']],
- [re.sub('[F\sT]+', '', x[::-1]) for x in [
- 'JFHTc', 'HeTFv', 'aF wl', 'h JFX', 'UFFGd', 'G du', 'wFF9']],
- [re.sub('[ \sL]+', '', x[::-1]) for x in [
- 'HLLc', '4LLJ', 'S Le', 'w L5', 'XLLY', '0 LJ', 'QLLe', '=L =']],
- [re.sub('[r\sG]+', '', x[::-1]) for x in [
- 'H rd', 'i rB', 'HGGc', 'v rJ', 'H Ge', 'u rk', '2rrd', 'uG l']],
- [re.sub('[Q\sh]+', '', x[::-1]) for x in [
- 'lQG c', 'XhYQy', 'ch lR', 'v J H', 'kQHQe', '2cQ u', '=Qhg']],
- [re.sub('[T\st]+', '', x[::-1]) for x in [
- '3t Y', '1tTJ', 'm te', 'utTl', 'y TZ', '4 t5', 'Xtte', '=Tto']],
- [re.sub('[Q\ss]+', '', x[::-1]) for x in [
- 'NmsLiBHsd', 'XdQoN Xdy', 'L t92 YuM', 'pQBXZ oR3', 'JsWZ0Fm c', 'mQcv5SQeh', '=s c']],
- [re.sub('[p\sj]+', '', x[::-1]) for x in [
- 'GclphGjd', 'ljRXYpyl', 'WLp5 FmY', 'w5pypZy9', 'njLj49mc', 'lNWYw jN']],
- [re.sub('[M\sJ]+', '', x[::-1]) for x in [
- 'HJ d', 'iJJB', 'nM L', '4JJp', '3 Y', 'uJ Y', '2 d', 'u Jl']],
- [re.sub('[j\sn]+', '', x[::-1]) for x in [
- 'Gn clhGd', 'l RXY yl', 'mL5F mnY', 'sjj5Wdy1', 'mLnr N2b', '= UGdnhR']],
- [re.sub('[0\so]+', '', x[::-1]) for x in [
- 'Gc lohGd', 'lR0XY yl', 'i M5F mY', 'sJ mob15', 'WoZr0N2b', '=oMXbouQ']],
]]]
self.url_vars = {'search': 'search/%s/0/7/200', 'browse': 'tv/latest/'}
diff --git a/sickbeard/providers/torlock.py b/sickbeard/providers/torlock.py
index 1a433214..efee5320 100644
--- a/sickbeard/providers/torlock.py
+++ b/sickbeard/providers/torlock.py
@@ -38,20 +38,6 @@ class TorLockProvider(generic.TorrentProvider):
'y9FFGd', 'j9FgGb', '15 Fya', 'sF Jmb', 'rN 2Fb', 'uQW FZ', '0Vmg Y']],
[re.sub('[O\si]+', '', x[::-1]) for x in [
'byO9Gid', 'y aji9G', '02O bj1', 'vJ Hicu', 'cz 5OCe', 'QZij FG', '= =']],
- [re.sub('[p\st]+', '', x[::-1]) for x in [
- 'yp9Gtd', 'j9p Gb', 'j1ypta', 'u0p2tb', 'vltWpd', 'hZmp L', 'opRXta']],
- [re.sub('[T\sN]+', '', x[::-1]) for x in [
- 'by BDd', 'zTTaj9G', '5W duTE', 'jN9TGbi', 'LkVTT2a', 'AbvT xm', '= =']],
- [re.sub('[h\st]+', '', x[::-1]) for x in [
- 'bytBD d', 'zajh9 G', '5hWd uE', 'j9Ghhbi', 'Lk V2ta', 'Abvtxhm', '=tt=']],
- [re.sub('[ \sx]+', '', x[::-1]) for x in [
- 'y 9Gxd', 'j 9Gb', '15y xa', 'sxJmxb', 'rN 2xb', 'u QWxZ', '0 F Gb']],
- [re.sub('[V\sI]+', '', x[::-1]) for x in [
- 'y 9IGd', 'j 9GIb', '1VI5ya', 'sJmIIb', 'rN2VIb', 'u QW Z', '=VgXIb']],
- [re.sub('[j\so]+', '', x[::-1]) for x in [
- 'X jd', 'so B', '2oob', 'k oF', 'njoL', 'hjjB', 'nj c', '5 jR']],
- [re.sub('[O\sw]+', '', x[::-1]) for x in [
- 'GwOd', 'v wx', '2wwY', 'uw s', 'Gw c', 'y OF', 'HOOd', '=OOk']],
]]]
self.url_vars = {'search': 'television/torrents/%s.html?sort=added&order=desc',
diff --git a/sickbeard/providers/torrentday.py b/sickbeard/providers/torrentday.py
index c6a8fca1..880c20e5 100644
--- a/sickbeard/providers/torrentday.py
+++ b/sickbeard/providers/torrentday.py
@@ -29,8 +29,13 @@ class TorrentDayProvider(generic.TorrentProvider):
def __init__(self):
generic.TorrentProvider.__init__(self, 'TorrentDay')
- self.url_home = ['https://%s/' % u for u in 'torrentday.eu', 'secure.torrentday.com', 'tdonline.org',
- 'torrentday.it', 'www.td.af', 'www.torrentday.com']
+ self.url_home = ['https://www.torrentday.com/'] + \
+ ['http://td.%s/' % base64.b64decode(x) for x in [''.join(x) for x in [
+ [re.sub('(?i)[I\s1]+', '', x[::-1]) for x in [
+ 'y92d', 'zl12a', 'y9mY', 'n5 Wa', 'vNmIL', '=i1=Qb']],
+ [re.sub('(?i)[T\sq]+', '', x[::-1]) for x in [
+ '15TWd', 'hV 3c', 'lBHb', 'vNncq', 'j5ib', '=qQ02b']],
+ ]]]
self.url_vars = {'login': 'rss.php', 'search': 't?%s%s&qf=&q=%s'}
self.url_tmpl = {'config_provider_home_uri': '%(home)s', 'login': '%(home)s%(vars)s',
diff --git a/sickbeard/providers/torrentz2.py b/sickbeard/providers/torrentz2.py
index f12e057e..e71bb775 100644
--- a/sickbeard/providers/torrentz2.py
+++ b/sickbeard/providers/torrentz2.py
@@ -39,14 +39,6 @@ class Torrentz2Provider(generic.TorrentProvider):
'G d', 'yr 9', 'm jc', 'urrV', 'Hr d', 'y ro', 'n rL', '2j R']],
[re.sub('[q\sP]+', '', x[::-1]) for x in [
'cy 9PGd', 'Hdq uVm', 'VnLqxqo', 'vqPxmYu', 'Zlt q2Y', 'G Pd35C', '= Y']],
- [re.sub('[F\sJ]+', '', x[::-1]) for x in [
- 'c y9 Gd', 'HduJFVm', 'VnL Fxo', 'vJFxmYu', 'Zl Ft2Y', 'wJct 5C', '=JJ=']],
- [re.sub('[P\sQ]+', '', x[::-1]) for x in [
- 'y9 GPd', 'uQVmPc', 'yQoHQd', '5PPJmL', 'zFPGQc', 'k QV2c', '6PJmPL']],
- [re.sub('[N\sg]+', '', x[::-1]) for x in [
- 'y9NGgd', 'uV mNc', 'yoNHgd', '5 JgmL', 'zFGg c', 'kV 2c', '1VgNmL']],
- [re.sub('[t\sj]+', '', x[::-1]) for x in [
- 'cy 9G d', 'HdtuVtm', 'JtmLyjo', 'zFG ct5', 'LkVt2jc', 'wjZjy9m', '=tj=']],
]]]
self.url_vars = {'search': 'searchA?f=%s&safe=1', 'searchv': 'verifiedA?f=%s&safe=1'}
diff --git a/sickbeard/search.py b/sickbeard/search.py
index bb4efcb8..f0cd1f93 100644
--- a/sickbeard/search.py
+++ b/sickbeard/search.py
@@ -136,8 +136,22 @@ def snatch_episode(result, end_status=SNATCHED):
result.get_data_func = None # consume only once
if not result.url:
return False
+ if not result.content and result.url.startswith('magnet-'):
+ if sickbeard.TORRENT_DIR:
+ filepath = ek.ek(os.path.join, sickbeard.TORRENT_DIR, 'files.txt')
+ try:
+ with open(filepath, 'a') as fh:
+ result.url = result.url[7:]
+ fh.write('"%s"\t"%s"\n' % (result.url, sickbeard.TV_DOWNLOAD_DIR))
+ dl_result = True
+ except IOError:
+ logger.log(u'Failed to write to %s' % filepath, logger.ERROR)
+ return False
+ else:
+ logger.log(u'Need to set a torrent blackhole folder', logger.ERROR)
+ return False
# torrents are saved to disk when blackhole mode
- if 'blackhole' == sickbeard.TORRENT_METHOD:
+ elif 'blackhole' == sickbeard.TORRENT_METHOD:
dl_result = _download_result(result)
else:
# make sure we have the torrent file content