|
@ -15,6 +15,10 @@ |
|
|
# You should have received a copy of the GNU General Public License |
|
|
# You should have received a copy of the GNU General Public License |
|
|
# along with SickGear. If not, see <http://www.gnu.org/licenses/>. |
|
|
# along with SickGear. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
import json |
|
|
|
|
|
except ImportError: |
|
|
|
|
|
from lib import simplejson as json |
|
|
import re |
|
|
import re |
|
|
import traceback |
|
|
import traceback |
|
|
|
|
|
|
|
@ -24,7 +28,7 @@ from ..helpers import try_int |
|
|
|
|
|
|
|
|
from bs4_parser import BS4Parser |
|
|
from bs4_parser import BS4Parser |
|
|
|
|
|
|
|
|
from _23 import filter_list, unidecode |
|
|
from _23 import filter_list, unidecode, unquote_plus |
|
|
from six import iteritems |
|
|
from six import iteritems |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -37,15 +41,18 @@ class NebulanceProvider(generic.TorrentProvider): |
|
|
self.urls = {'config_provider_home_uri': self.url_base, |
|
|
self.urls = {'config_provider_home_uri': self.url_base, |
|
|
'login_action': self.url_base + 'login.php', |
|
|
'login_action': self.url_base + 'login.php', |
|
|
'user': self.url_base + 'ajax.php?action=index', |
|
|
'user': self.url_base + 'ajax.php?action=index', |
|
|
|
|
|
'api_key': self.url_base + 'user.php?action=edit&userid=%s', |
|
|
|
|
|
'api': self.url_base + 'api.php', |
|
|
'browse': self.url_base + 'ajax.php?action=browse&auth=%s&passkey=%s', |
|
|
'browse': self.url_base + 'ajax.php?action=browse&auth=%s&passkey=%s', |
|
|
'search': '&searchstr=%s', |
|
|
'search': '&searchstr=%s', |
|
|
'get': self.url_base + 'torrents.php?action=download&authkey=%s&torrent_pass=%s&id=%s'} |
|
|
'get': self.url_base + 'torrents.php?action=download&authkey=%s&torrent_pass=%s&id=%s'} |
|
|
|
|
|
|
|
|
self.url = self.urls['config_provider_home_uri'] |
|
|
self.url = self.urls['config_provider_home_uri'] |
|
|
self.user_authkey, self.user_passkey = 2 * [None] |
|
|
self.user_authkey, self.user_passkey, self.uid = 3 * [None] |
|
|
self.chk_td = True |
|
|
self.chk_td = True |
|
|
|
|
|
|
|
|
self.username, self.password, self.freeleech, self.scene, self.minseed, self.minleech = 6 * [None] |
|
|
self.username, self.password, self.api_key, self.scene, self.minseed, self.minleech = 6 * [None] |
|
|
|
|
|
self.api_priority = False |
|
|
|
|
|
|
|
|
def _authorised(self, **kwargs): |
|
|
def _authorised(self, **kwargs): |
|
|
|
|
|
|
|
@ -58,11 +65,18 @@ class NebulanceProvider(generic.TorrentProvider): |
|
|
if self.should_skip(): |
|
|
if self.should_skip(): |
|
|
return False |
|
|
return False |
|
|
if 'response' in response: |
|
|
if 'response' in response: |
|
|
self.user_authkey, self.user_passkey = [response['response'].get(v) for v in ('authkey', 'passkey')] |
|
|
self.user_authkey, self.user_passkey, self.uid = [response['response'].get(v) |
|
|
|
|
|
for v in ('authkey', 'passkey', 'id')] |
|
|
return self.user_authkey |
|
|
return self.user_authkey |
|
|
|
|
|
|
|
|
def _search_provider(self, search_params, **kwargs): |
|
|
def _search_provider(self, search_params, **kwargs): |
|
|
|
|
|
|
|
|
|
|
|
if self.api_priority: |
|
|
|
|
|
return self.api_key and self._search_rpc(search_params) or self._search(search_params) |
|
|
|
|
|
return self._search(search_params) or self.api_key and self._search_rpc(search_params) or [] |
|
|
|
|
|
|
|
|
|
|
|
def _search(self, search_params): |
|
|
|
|
|
|
|
|
results = [] |
|
|
results = [] |
|
|
if not self._authorised(): |
|
|
if not self._authorised(): |
|
|
return results |
|
|
return results |
|
@ -85,14 +99,12 @@ class NebulanceProvider(generic.TorrentProvider): |
|
|
cnt = len(items[mode]) |
|
|
cnt = len(items[mode]) |
|
|
try: |
|
|
try: |
|
|
for item in data_json.get('response', {}).get('results', []): |
|
|
for item in data_json.get('response', {}).get('results', []): |
|
|
if self.freeleech and not item.get('isFreeleech'): |
|
|
seeders, leechers, group_name, torrent_id, size, title = [try_int(n, n) for n in [ |
|
|
continue |
|
|
item.get(x) for x in ['seeders', 'leechers', 'groupName', 'torrentId', 'size', 'rlsName']]] |
|
|
|
|
|
|
|
|
seeders, leechers, group_name, torrent_id, size = [try_int(n, n) for n in [ |
|
|
|
|
|
item.get(x) for x in ['seeders', 'leechers', 'groupName', 'torrentId', 'size']]] |
|
|
|
|
|
if self._reject_item(seeders, leechers): |
|
|
if self._reject_item(seeders, leechers): |
|
|
continue |
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
if None is title: |
|
|
try: |
|
|
try: |
|
|
title_parts = group_name.split('[') |
|
|
title_parts = group_name.split('[') |
|
|
maybe_res = re.findall(r'((?:72|108|216)0\w)', title_parts[1]) |
|
|
maybe_res = re.findall(r'((?:72|108|216)0\w)', title_parts[1]) |
|
@ -164,5 +176,59 @@ class NebulanceProvider(generic.TorrentProvider): |
|
|
title += + any(tags[4]) and ('.%s' % tags[4][0]) or '' |
|
|
title += + any(tags[4]) and ('.%s' % tags[4][0]) or '' |
|
|
return title |
|
|
return title |
|
|
|
|
|
|
|
|
|
|
|
def _search_rpc(self, search_params): |
|
|
|
|
|
|
|
|
|
|
|
results = [] |
|
|
|
|
|
|
|
|
|
|
|
items = {'Cache': [], 'Season': [], 'Episode': [], 'Propers': []} |
|
|
|
|
|
|
|
|
|
|
|
json_rpc = (lambda args: |
|
|
|
|
|
'{"jsonrpc": "2.0", "id": 1, "method": "getTorrents", "params": ["%s", %s, %s, %s, %s]}' % |
|
|
|
|
|
(self.api_key, json.dumps(args.get('params', '')), 100, args.get('page', 0), 0)) |
|
|
|
|
|
|
|
|
|
|
|
for mode in search_params: |
|
|
|
|
|
for search_string in search_params[mode]: |
|
|
|
|
|
search_string = unquote_plus(unidecode(search_string)) |
|
|
|
|
|
|
|
|
|
|
|
params = {'release': search_string} |
|
|
|
|
|
if 'Cache' == mode: |
|
|
|
|
|
params = {'age': '< %s' % (24 * 60 * 60)} |
|
|
|
|
|
elif 'Propers' == mode: |
|
|
|
|
|
params.update({'age': '< %s' % (4 * 24 * 60 * 60)}) |
|
|
|
|
|
|
|
|
|
|
|
response = self.get_url(self.urls['api'], post_data=json_rpc({'params': params}), parse_json=True) |
|
|
|
|
|
if self.should_skip(): |
|
|
|
|
|
return results |
|
|
|
|
|
|
|
|
|
|
|
data_json = response and response.get('result', {}).get('items') or [] |
|
|
|
|
|
|
|
|
|
|
|
cnt = len(items[mode]) |
|
|
|
|
|
for cur_item in data_json: |
|
|
|
|
|
seeders, leechers, size, download = [try_int(n, n) for n in [ |
|
|
|
|
|
cur_item.get(x) for x in ['seed', 'leech', 'size', 'download']]] |
|
|
|
|
|
if not self._reject_item(seeders, leechers): |
|
|
|
|
|
items[mode].append((cur_item.get('rls_name'), '%s%s' % (self.url_base.rstrip('/'), download), |
|
|
|
|
|
seeders, self._bytesizer(size))) |
|
|
|
|
|
|
|
|
|
|
|
self._log_search(mode, len(items[mode]) - cnt, |
|
|
|
|
|
('search_string: ' + str(search_string), self.name)['Cache' == mode]) |
|
|
|
|
|
|
|
|
|
|
|
results = self._sort_seeding(mode, results + items[mode]) |
|
|
|
|
|
|
|
|
|
|
|
return results |
|
|
|
|
|
|
|
|
|
|
|
def ui_string(self, key): |
|
|
|
|
|
profile_page = 'profile page' |
|
|
|
|
|
if self._authorised(): |
|
|
|
|
|
profile_page = '<a href="%s">%s</a>' % (self.urls['api_key'] % self.uid, profile_page) |
|
|
|
|
|
|
|
|
|
|
|
return ('%s_api_key' % self.get_id()) == key and 'API key' or \ |
|
|
|
|
|
('%s_api_key_tip' % self.get_id()) == key and \ |
|
|
|
|
|
'\'API key\' is at %s %s with "Download" enabled<br>' \ |
|
|
|
|
|
'%s has no result or is not set' \ |
|
|
|
|
|
% (self.name, profile_page, |
|
|
|
|
|
('and is used if Username/Password', 'Username/Password is used if API')[self.api_priority]) \ |
|
|
|
|
|
or '' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
provider = NebulanceProvider() |
|
|
provider = NebulanceProvider() |
|
|