5 changed files with 7 additions and 162 deletions
@ -1,126 +0,0 @@ |
|||
import re |
|||
import time |
|||
|
|||
from bs4 import BeautifulSoup |
|||
from couchpotato.core.helpers.encoding import toUnicode |
|||
from couchpotato.core.helpers.rss import RSS |
|||
from couchpotato.core.helpers.variable import tryInt |
|||
from couchpotato.core.logger import CPLog |
|||
from couchpotato.core.event import fireEvent |
|||
from couchpotato.core.media._base.providers.nzb.base import NZBProvider |
|||
from dateutil.parser import parse |
|||
|
|||
|
|||
log = CPLog(__name__) |
|||
|
|||
|
|||
class Base(NZBProvider, RSS): |
|||
|
|||
urls = { |
|||
'download': 'https://www.nzbindex.com/download/', |
|||
'search': 'https://www.nzbindex.com/rss/?%s', |
|||
} |
|||
|
|||
http_time_between_calls = 1 # Seconds |
|||
|
|||
def _search(self, media, quality, results): |
|||
|
|||
nzbs = self.getRSSData(self.urls['search'] % self.buildUrl(media, quality)) |
|||
|
|||
for nzb in nzbs: |
|||
|
|||
enclosure = self.getElement(nzb, 'enclosure').attrib |
|||
nzbindex_id = int(self.getTextElement(nzb, "link").split('/')[4]) |
|||
|
|||
title = self.getTextElement(nzb, "title") |
|||
|
|||
match = fireEvent('matcher.parse', title, parser='usenet', single = True) |
|||
if not match.chains: |
|||
log.info('Unable to parse release with title "%s"', title) |
|||
continue |
|||
|
|||
# TODO should we consider other lower-weight chains here? |
|||
info = fireEvent('matcher.flatten_info', match.chains[0].info, single = True) |
|||
|
|||
release_name = fireEvent('matcher.construct_from_raw', info.get('release_name'), single = True) |
|||
|
|||
file_name = info.get('detail', {}).get('file_name') |
|||
file_name = file_name[0] if file_name else None |
|||
|
|||
title = release_name or file_name |
|||
|
|||
# Strip extension from parsed title (if one exists) |
|||
ext_pos = title.rfind('.') |
|||
|
|||
# Assume extension if smaller than 4 characters |
|||
# TODO this should probably be done a better way |
|||
if len(title[ext_pos + 1:]) <= 4: |
|||
title = title[:ext_pos] |
|||
|
|||
if not title: |
|||
log.info('Unable to find release name from match') |
|||
continue |
|||
|
|||
try: |
|||
description = self.getTextElement(nzb, "description") |
|||
except: |
|||
description = '' |
|||
|
|||
def extra_check(item): |
|||
if '#c20000' in item['description'].lower(): |
|||
log.info('Wrong: Seems to be passworded: %s', item['name']) |
|||
return False |
|||
|
|||
return True |
|||
|
|||
results.append({ |
|||
'id': nzbindex_id, |
|||
'name': title, |
|||
'age': self.calculateAge(int(time.mktime(parse(self.getTextElement(nzb, "pubDate")).timetuple()))), |
|||
'size': tryInt(enclosure['length']) / 1024 / 1024, |
|||
'url': enclosure['url'], |
|||
'detail_url': enclosure['url'].replace('/download/', '/release/'), |
|||
'description': description, |
|||
'get_more_info': self.getMoreInfo, |
|||
'extra_check': extra_check, |
|||
}) |
|||
|
|||
def getMoreInfo(self, item): |
|||
try: |
|||
if '/nfo/' in item['description'].lower(): |
|||
nfo_url = re.search('href=\"(?P<nfo>.+)\" ', item['description']).group('nfo') |
|||
full_description = self.getCache('nzbindex.%s' % item['id'], url = nfo_url, cache_timeout = 25920000) |
|||
html = BeautifulSoup(full_description) |
|||
item['description'] = toUnicode(html.find('pre', attrs = {'id': 'nfo0'}).text) |
|||
except: |
|||
pass |
|||
|
|||
|
|||
config = [{ |
|||
'name': 'nzbindex', |
|||
'groups': [ |
|||
{ |
|||
'tab': 'searcher', |
|||
'list': 'nzb_providers', |
|||
'name': 'nzbindex', |
|||
'description': 'Free provider, less accurate. See <a href="https://www.nzbindex.com/">NZBIndex</a>', |
|||
'wizard': True, |
|||
'icon': 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVR42t2SQQ2AMBAEcUCwUAv94QMLfHliAQtYqIVawEItYAG6yZFMLkUANNlk79Kbbtp2P1j9uKxVV9VWFeStl+Wh3fWK9hNwEoADZkJtMD49AqS5AUjWGx6A+m+ARICGrM5W+wSTB0gETKzdHZwCEZAJ8PGZQN4AiQAmkR9s06EBAugJiBoAAPFfAQcBgZcIHzwA6TYP4JsXeSg3P9L31w3eksbH3zMb/wAAAABJRU5ErkJggg==', |
|||
'options': [ |
|||
{ |
|||
'name': 'enabled', |
|||
'type': 'enabler', |
|||
'default': True, |
|||
}, |
|||
{ |
|||
'name': 'extra_score', |
|||
'advanced': True, |
|||
'label': 'Extra Score', |
|||
'type': 'int', |
|||
'default': 0, |
|||
'description': 'Starting score for each release found via this provider.', |
|||
} |
|||
], |
|||
}, |
|||
], |
|||
}] |
@ -1,30 +0,0 @@ |
|||
from couchpotato.core.helpers.encoding import tryUrlencode |
|||
from couchpotato.core.logger import CPLog |
|||
from couchpotato.core.event import fireEvent |
|||
from couchpotato.core.media._base.providers.nzb.nzbindex import Base |
|||
from couchpotato.core.media.movie.providers.base import MovieProvider |
|||
from couchpotato.environment import Env |
|||
|
|||
log = CPLog(__name__) |
|||
|
|||
autoload = 'NzbIndex' |
|||
|
|||
|
|||
class NzbIndex(MovieProvider, Base): |
|||
|
|||
def buildUrl(self, media, quality): |
|||
title = fireEvent('library.query', media, include_year = False, single = True) |
|||
year = media['info']['year'] |
|||
|
|||
query = tryUrlencode({ |
|||
'q': '"%s %s" | "%s (%s)"' % (title, year, title, year), |
|||
'age': Env.setting('retention', 'nzb'), |
|||
'sort': 'agedesc', |
|||
'minsize': quality.get('size_min'), |
|||
'maxsize': quality.get('size_max'), |
|||
'rating': 1, |
|||
'max': 250, |
|||
'more': 1, |
|||
'complete': 1, |
|||
}) |
|||
return query |
Loading…
Reference in new issue