2 changed files with 114 additions and 0 deletions
@ -0,0 +1,23 @@ |
|||||
|
from .main import Nzbx |
||||
|
|
||||
|
def start(): |
||||
|
return Nzbx() |
||||
|
|
||||
|
config = [{ |
||||
|
'name': 'nzbx', |
||||
|
'groups': [ |
||||
|
{ |
||||
|
'tab': 'searcher', |
||||
|
'subtab': 'nzb_providers', |
||||
|
'name': 'nzbX', |
||||
|
'description': 'Free provider, less accurate. See <a href="https://www.nzbx.co/">nzbX</a>', |
||||
|
'options': [ |
||||
|
{ |
||||
|
'name': 'enabled', |
||||
|
'type': 'enabler', |
||||
|
'default': True, |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
], |
||||
|
}] |
@ -0,0 +1,91 @@ |
|||||
|
from couchpotato.core.event import fireEvent |
||||
|
from couchpotato.core.helpers.encoding import tryUrlencode |
||||
|
from couchpotato.core.helpers.rss import RSS |
||||
|
from couchpotato.core.helpers.variable import tryInt |
||||
|
from couchpotato.core.logger import CPLog |
||||
|
from couchpotato.core.providers.nzb.base import NZBProvider |
||||
|
import json |
||||
|
import traceback |
||||
|
|
||||
|
log = CPLog(__name__) |
||||
|
|
||||
|
|
||||
|
class Nzbx(NZBProvider, RSS): |
||||
|
endpoint = 'https://nzbx.co/api/' |
||||
|
|
||||
|
urls = { |
||||
|
'search': 'https://nzbx.co/api/search', |
||||
|
'details': 'https://nzbx.co/api/details?guid=%s', |
||||
|
'comments': 'https://nzbx.co/api/get-comments?guid=%s', |
||||
|
'ratings': 'https://nzbx.co/api/get-votes?guid=%s', |
||||
|
'downloads': 'https://nzbx.co/api/get-downloads-count?guid=%s', |
||||
|
'categories': 'https://nzbx.co/api/categories', |
||||
|
'groups': 'https://nzbx.co/api/groups', |
||||
|
} |
||||
|
|
||||
|
http_time_between_calls = 1 # Seconds |
||||
|
|
||||
|
def search(self, movie, quality): |
||||
|
results = [] |
||||
|
|
||||
|
if self.isDisabled(): |
||||
|
return results |
||||
|
|
||||
|
arguments = tryUrlencode({ |
||||
|
'q': movie['library']['identifier'].replace('tt', ''), |
||||
|
'sf': quality.get('size_min'), |
||||
|
}) |
||||
|
url = "%s?%s" % (self.urls['search'], arguments) |
||||
|
|
||||
|
cache_key = 'nzbx.%s.%s' % (movie['library']['identifier'], quality.get('identifier')) |
||||
|
|
||||
|
data = self.getCache(cache_key, url) |
||||
|
|
||||
|
if data: |
||||
|
try: |
||||
|
try: |
||||
|
nzbs = json.loads(data) |
||||
|
except Exception, e: |
||||
|
log.debug('%s, %s', (self.getName(), e)) |
||||
|
return results |
||||
|
|
||||
|
for nzb in nzbs: |
||||
|
|
||||
|
nzbx_guid = nzb['guid'] |
||||
|
|
||||
|
def extra_score(item): |
||||
|
score = 0 |
||||
|
if item['votes']['upvotes'] > item['votes']['downvotes']: |
||||
|
score += 5 |
||||
|
return score |
||||
|
|
||||
|
new = { |
||||
|
'guid': nzbx_guid, |
||||
|
'type': 'nzb', |
||||
|
'provider': self.getName(), |
||||
|
'download': self.download, |
||||
|
'url': nzb['nzb'], |
||||
|
'name': nzb['name'], |
||||
|
'age': self.calculateAge(int(nzb['postdate'])), |
||||
|
'size': tryInt(nzb['size']) / 1024 / 1024, |
||||
|
'description': '', |
||||
|
'extra_score': extra_score, |
||||
|
'votes': nzb['votes'], |
||||
|
'check_nzb': True, |
||||
|
} |
||||
|
|
||||
|
is_correct_movie = fireEvent('searcher.correct_movie', |
||||
|
nzb = new, movie = movie, quality = quality, |
||||
|
imdb_results = False, single = True) |
||||
|
|
||||
|
if is_correct_movie: |
||||
|
new['score'] = fireEvent('score.calculate', new, movie, single = True) |
||||
|
results.append(new) |
||||
|
self.found(new) |
||||
|
|
||||
|
return results |
||||
|
except: |
||||
|
log.error('Failed to parsing %s: %s', (self.getName(), traceback.format_exc())) |
||||
|
|
||||
|
return results |
||||
|
|
Loading…
Reference in new issue