Merge branch 'refs/heads/develop'
This commit is contained in:
@@ -53,7 +53,8 @@ class Core(Plugin):
|
|||||||
addEvent('setting.save.core.api_key', self.checkApikey)
|
addEvent('setting.save.core.api_key', self.checkApikey)
|
||||||
|
|
||||||
# Make sure we can close-down with ctrl+c properly
|
# Make sure we can close-down with ctrl+c properly
|
||||||
self.signalHandler()
|
if not Env.get('desktop'):
|
||||||
|
self.signalHandler()
|
||||||
|
|
||||||
def md5Password(self, value):
|
def md5Password(self, value):
|
||||||
return md5(value.encode(Env.get('encoding'))) if value else ''
|
return md5(value.encode(Env.get('encoding'))) if value else ''
|
||||||
|
|||||||
@@ -313,7 +313,10 @@ class Renamer(Plugin):
|
|||||||
elif release.status_id is snatched_status.get('id'):
|
elif release.status_id is snatched_status.get('id'):
|
||||||
if release.quality.id is group['meta_data']['quality']['id']:
|
if release.quality.id is group['meta_data']['quality']['id']:
|
||||||
log.debug('Marking release as downloaded')
|
log.debug('Marking release as downloaded')
|
||||||
release.status_id = downloaded_status.get('id')
|
try:
|
||||||
|
release.status_id = downloaded_status.get('id')
|
||||||
|
except Exception, e:
|
||||||
|
log.error('Failed marking release as finished: %s %s', (e, traceback.format_exc()))
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
# Remove leftover files
|
# Remove leftover files
|
||||||
@@ -350,7 +353,10 @@ class Renamer(Plugin):
|
|||||||
|
|
||||||
# Delete leftover folder from older releases
|
# Delete leftover folder from older releases
|
||||||
for delete_folder in delete_folders:
|
for delete_folder in delete_folders:
|
||||||
self.deleteEmptyFolder(delete_folder, show_error = False)
|
try:
|
||||||
|
self.deleteEmptyFolder(delete_folder, show_error = False)
|
||||||
|
except Exception, e:
|
||||||
|
log.error('Failed to delete folder: %s %s', (e, traceback.format_exc()))
|
||||||
|
|
||||||
# Rename all files marked
|
# Rename all files marked
|
||||||
group['renamed_files'] = []
|
group['renamed_files'] = []
|
||||||
|
|||||||
@@ -27,9 +27,9 @@ class Score(Plugin):
|
|||||||
score += sizeScore(nzb['size'])
|
score += sizeScore(nzb['size'])
|
||||||
|
|
||||||
# Torrents only
|
# Torrents only
|
||||||
if nzb.get('seeds'):
|
if nzb.get('seeders'):
|
||||||
try:
|
try:
|
||||||
score += nzb.get('seeds') / 5
|
score += nzb.get('seeders') / 5
|
||||||
score += nzb.get('leechers') / 10
|
score += nzb.get('leechers') / 10
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ class Searcher(Plugin):
|
|||||||
imdb_results = kwargs.get('imdb_results', False)
|
imdb_results = kwargs.get('imdb_results', False)
|
||||||
retention = Env.setting('retention', section = 'nzb')
|
retention = Env.setting('retention', section = 'nzb')
|
||||||
|
|
||||||
if nzb.get('seeds') is None and 0 < retention < nzb.get('age', 0):
|
if nzb.get('seeders') is None and 0 < retention < nzb.get('age', 0):
|
||||||
log.info2('Wrong: Outside retention, age is %s, needs %s or lower: %s', (nzb['age'], retention, nzb['name']))
|
log.info2('Wrong: Outside retention, age is %s, needs %s or lower: %s', (nzb['age'], retention, nzb['name']))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -317,16 +317,16 @@ class Searcher(Plugin):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
ignored_words = splitString(self.conf('ignored_words').lower())
|
ignored_words = splitString(self.conf('ignored_words').lower())
|
||||||
blacklisted = list(set(nzb_words) & set(ignored_words))
|
blacklisted = list(set(nzb_words) & set(ignored_words) - set(movie_words))
|
||||||
if self.conf('ignored_words') and blacklisted:
|
if self.conf('ignored_words') and blacklisted:
|
||||||
log.info2("Wrong: '%s' blacklisted words: %s" % (nzb['name'], ", ".join(blacklisted)))
|
log.info2("Wrong: '%s' blacklisted words: %s" % (nzb['name'], ", ".join(blacklisted)))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
pron_tags = ['xxx', 'sex', 'anal', 'tits', 'fuck', 'porn', 'orgy', 'milf', 'boobs', 'erotica', 'erotic']
|
pron_tags = ['xxx', 'sex', 'anal', 'tits', 'fuck', 'porn', 'orgy', 'milf', 'boobs', 'erotica', 'erotic']
|
||||||
for p_tag in pron_tags:
|
pron_words = list(set(nzb_words) & set(pron_tags) - set(movie_words))
|
||||||
if p_tag in nzb_words and p_tag not in movie_words:
|
if pron_words:
|
||||||
log.info('Wrong: %s, probably pr0n', (nzb['name']))
|
log.info('Wrong: %s, probably pr0n', (nzb['name']))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
#qualities = fireEvent('quality.all', single = True)
|
#qualities = fireEvent('quality.all', single = True)
|
||||||
preferred_quality = fireEvent('quality.single', identifier = quality['identifier'], single = True)
|
preferred_quality = fireEvent('quality.single', identifier = quality['identifier'], single = True)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class FTDWorld(NZBProvider):
|
|||||||
([1], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr', 'brrip']),
|
([1], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr', 'brrip']),
|
||||||
([10, 13, 14], ['bd50', '720p', '1080p']),
|
([10, 13, 14], ['bd50', '720p', '1080p']),
|
||||||
]
|
]
|
||||||
cat_backup_id = [1]
|
cat_backup_id = 1
|
||||||
|
|
||||||
def search(self, movie, quality):
|
def search(self, movie, quality):
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
from .main import OMGWTFNZBs
|
||||||
|
|
||||||
|
def start():
|
||||||
|
return OMGWTFNZBs()
|
||||||
|
|
||||||
|
config = [{
|
||||||
|
'name': 'omgwtfnzbs',
|
||||||
|
'groups': [
|
||||||
|
{
|
||||||
|
'tab': 'searcher',
|
||||||
|
'subtab': 'nzb_providers',
|
||||||
|
'name': 'OMGWTFNZBs',
|
||||||
|
'description': 'See <a href="http://www.omgwtfnzbs.com/">OMGWTFNZBs</a>',
|
||||||
|
'options': [
|
||||||
|
{
|
||||||
|
'name': 'enabled',
|
||||||
|
'type': 'enabler',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'username',
|
||||||
|
'default': '',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name': 'api_key',
|
||||||
|
'label': 'Api Key',
|
||||||
|
'default': '',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}]
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
from bs4 import BeautifulSoup
|
||||||
|
from couchpotato.core.event import fireEvent
|
||||||
|
from couchpotato.core.helpers.encoding import toUnicode, tryUrlencode, \
|
||||||
|
simplifyString
|
||||||
|
from couchpotato.core.helpers.rss import RSS
|
||||||
|
from couchpotato.core.helpers.variable import tryInt, getTitle
|
||||||
|
from couchpotato.core.logger import CPLog
|
||||||
|
from couchpotato.core.providers.nzb.base import NZBProvider
|
||||||
|
from dateutil.parser import parse
|
||||||
|
from urlparse import urlparse, parse_qs
|
||||||
|
import time
|
||||||
|
import xml.etree.ElementTree as XMLTree
|
||||||
|
|
||||||
|
log = CPLog(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class OMGWTFNZBs(NZBProvider, RSS):
|
||||||
|
|
||||||
|
urls = {
|
||||||
|
'search': 'http://rss.omgwtfnzbs.com/rss-search.php?%s',
|
||||||
|
}
|
||||||
|
|
||||||
|
http_time_between_calls = 1 #seconds
|
||||||
|
|
||||||
|
cat_ids = [
|
||||||
|
([15], ['dvdrip']),
|
||||||
|
([15, 16], ['brrip']),
|
||||||
|
([16], ['720p', '1080p', 'bd50']),
|
||||||
|
([17], ['dvdr']),
|
||||||
|
]
|
||||||
|
cat_backup_id = 'movie'
|
||||||
|
|
||||||
|
def search(self, movie, quality):
|
||||||
|
|
||||||
|
pre_releases = fireEvent('quality.pre_releases', single = True)
|
||||||
|
|
||||||
|
results = []
|
||||||
|
if self.isDisabled() or quality['identifier'] in pre_releases:
|
||||||
|
return results
|
||||||
|
|
||||||
|
q = '%s %s' % (simplifyString(getTitle(movie['library'])), movie['library']['year'])
|
||||||
|
|
||||||
|
params = {
|
||||||
|
'search': q,
|
||||||
|
'catid': ','.join([str(x) for x in self.getCatId(quality['identifier'])]),
|
||||||
|
'user': self.conf('username', default = ''),
|
||||||
|
'api': self.conf('api_key', default = ''),
|
||||||
|
}
|
||||||
|
|
||||||
|
cache_key = 'omgwtfnzbs.%s.%s' % (movie['library']['identifier'], q)
|
||||||
|
data = self.getCache(cache_key, self.urls['search'] % tryUrlencode(params))
|
||||||
|
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:
|
||||||
|
|
||||||
|
nzb_id = parse_qs(urlparse(self.getTextElement(nzb, "link")).query).get('id')[0]
|
||||||
|
enclosure = self.getElement(nzb, "enclosure").attrib
|
||||||
|
size = enclosure['length']
|
||||||
|
date = self.getTextElement(nzb, "pubDate")
|
||||||
|
|
||||||
|
new = {
|
||||||
|
'id': nzb_id,
|
||||||
|
'type': 'nzb',
|
||||||
|
'provider': self.getName(),
|
||||||
|
'name': toUnicode(self.getTextElement(nzb, "title")),
|
||||||
|
'age': self.calculateAge(int(time.mktime(parse(date).timetuple()))),
|
||||||
|
'size': tryInt(size) / 1024 / 1024,
|
||||||
|
'url': enclosure['url'],
|
||||||
|
'download': self.download,
|
||||||
|
'detail_url': self.getTextElement(nzb, "link"),
|
||||||
|
'description': self.getTextElement(nzb, 'description')
|
||||||
|
}
|
||||||
|
|
||||||
|
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 SyntaxError:
|
||||||
|
log.error('Failed to parse XML response from omgwtfnzbs')
|
||||||
|
|
||||||
|
return results
|
||||||
@@ -84,7 +84,7 @@ class KickAssTorrents(TorrentProvider):
|
|||||||
elif column_name is 'age':
|
elif column_name is 'age':
|
||||||
new['age'] = self.ageToDays(td.text)
|
new['age'] = self.ageToDays(td.text)
|
||||||
elif column_name is 'seeds':
|
elif column_name is 'seeds':
|
||||||
new['seeds'] = tryInt(td.text)
|
new['seeders'] = tryInt(td.text)
|
||||||
elif column_name is 'leechers':
|
elif column_name is 'leechers':
|
||||||
new['leechers'] = tryInt(td.text)
|
new['leechers'] = tryInt(td.text)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user