You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.4 KiB
155 lines
5.4 KiB
from couchpotato.core.event import fireEvent
|
|
from couchpotato.core.helpers.encoding import tryUrlencode
|
|
from couchpotato.core.helpers.rss import RSS
|
|
from couchpotato.core.logger import CPLog
|
|
from couchpotato.core.providers.nzb.base import NZBProvider
|
|
from dateutil.parser import parse
|
|
import base64
|
|
import time
|
|
import xml.etree.ElementTree as XMLTree
|
|
|
|
log = CPLog(__name__)
|
|
|
|
|
|
class Newzbin(NZBProvider, RSS):
|
|
|
|
urls = {
|
|
'download': 'https://www.newzbin2.es/api/dnzb/',
|
|
'search': 'https://www.newzbin2.es/search/',
|
|
}
|
|
|
|
format_ids = {
|
|
2: ['scr'],
|
|
1: ['cam'],
|
|
4: ['tc'],
|
|
8: ['ts'],
|
|
1024: ['r5'],
|
|
}
|
|
cat_ids = [
|
|
([262144], ['bd50']),
|
|
([2097152], ['1080p']),
|
|
([524288], ['720p']),
|
|
([262144], ['brrip']),
|
|
([2], ['dvdr']),
|
|
]
|
|
cat_backup_id = -1
|
|
|
|
http_time_between_calls = 3 # Seconds
|
|
|
|
def search(self, movie, quality):
|
|
|
|
results = []
|
|
if self.isDisabled():
|
|
return results
|
|
|
|
format_id = self.getFormatId(type)
|
|
cat_id = self.getCatId(type)
|
|
|
|
arguments = tryUrlencode({
|
|
'searchaction': 'Search',
|
|
'u_url_posts_only': '0',
|
|
'u_show_passworded': '0',
|
|
'q_url': 'imdb.com/title/' + movie['library']['identifier'],
|
|
'sort': 'ps_totalsize',
|
|
'order': 'asc',
|
|
'u_post_results_amt': '100',
|
|
'feed': 'rss',
|
|
'category': '6',
|
|
'ps_rb_video_format': str(cat_id),
|
|
'ps_rb_source': str(format_id),
|
|
})
|
|
|
|
url = "%s?%s" % (self.urls['search'], arguments)
|
|
cache_key = str('newzbin.%s.%s.%s' % (movie['library']['identifier'], str(format_id), str(cat_id)))
|
|
single_cat = True
|
|
|
|
data = self.getCache(cache_key)
|
|
if not data:
|
|
|
|
headers = {
|
|
'Authorization': "Basic %s" % base64.encodestring('%s:%s' % (self.conf('username'), self.conf('password')))[:-1]
|
|
}
|
|
try:
|
|
data = self.urlopen(url, headers = headers)
|
|
self.setCache(cache_key, data)
|
|
except:
|
|
return results
|
|
|
|
if data:
|
|
try:
|
|
try:
|
|
data = XMLTree.fromstring(data)
|
|
nzbs = self.getElements(data, 'channel/item')
|
|
except Exception, e:
|
|
log.debug('%s, %s' % (self.getName(), e))
|
|
return results
|
|
|
|
for nzb in nzbs:
|
|
|
|
title = self.getTextElement(nzb, "title")
|
|
if 'error' in title.lower(): continue
|
|
|
|
REPORT_NS = 'http://www.newzbin2.es/DTD/2007/feeds/report/';
|
|
|
|
# Add attributes to name
|
|
try:
|
|
for attr in nzb.find('{%s}attributes' % REPORT_NS):
|
|
title += ' ' + attr.text
|
|
except:
|
|
pass
|
|
|
|
id = int(self.getTextElement(nzb, '{%s}id' % REPORT_NS))
|
|
size = str(int(self.getTextElement(nzb, '{%s}size' % REPORT_NS)) / 1024 / 1024) + ' mb'
|
|
date = str(self.getTextElement(nzb, '{%s}postdate' % REPORT_NS))
|
|
|
|
new = {
|
|
'id': id,
|
|
'type': 'nzb',
|
|
'provider': self.getName(),
|
|
'name': title,
|
|
'age': self.calculateAge(int(time.mktime(parse(date).timetuple()))),
|
|
'size': self.parseSize(size),
|
|
'url': str(self.getTextElement(nzb, '{%s}nzb' % REPORT_NS)),
|
|
'download': self.download,
|
|
'detail_url': str(self.getTextElement(nzb, 'link')),
|
|
'description': self.getTextElement(nzb, "description"),
|
|
'check_nzb': False,
|
|
}
|
|
|
|
is_correct_movie = fireEvent('searcher.correct_movie',
|
|
nzb = new, movie = movie, quality = quality,
|
|
imdb_results = True, single_category = single_cat, single = True)
|
|
if is_correct_movie:
|
|
new['score'] = fireEvent('score.calculate', new, movie, single = True)
|
|
results.append(new)
|
|
self.found(new)
|
|
|
|
return results
|
|
except SyntaxError:
|
|
log.error('Failed to parse XML response from newzbin')
|
|
|
|
return results
|
|
|
|
def download(self, url = '', nzb_id = ''):
|
|
try:
|
|
log.info('Download nzb from newzbin, report id: %s ' % nzb_id)
|
|
|
|
return self.urlopen(self.urls['download'], params = {
|
|
'username' : self.conf('username'),
|
|
'password' : self.conf('password'),
|
|
'reportid' : nzb_id
|
|
}, show_error = False)
|
|
except Exception, e:
|
|
log.error('Failed downloading from newzbin, check credit: %s' % e)
|
|
return False
|
|
|
|
def getFormatId(self, format):
|
|
for id, quality in self.format_ids.iteritems():
|
|
for q in quality:
|
|
if q == format:
|
|
return id
|
|
|
|
return self.cat_backup_id
|
|
|
|
def isEnabled(self):
|
|
return NZBProvider.isEnabled(self) and self.conf('enabled') and self.conf('username') and self.conf('password')
|
|
|