diff --git a/couchpotato/core/_base/_core/main.py b/couchpotato/core/_base/_core/main.py index 9c400d11..c5ce39ad 100644 --- a/couchpotato/core/_base/_core/main.py +++ b/couchpotato/core/_base/_core/main.py @@ -53,7 +53,8 @@ class Core(Plugin): addEvent('setting.save.core.api_key', self.checkApikey) # Make sure we can close-down with ctrl+c properly - self.signalHandler() + if not Env.get('desktop'): + self.signalHandler() def md5Password(self, value): return md5(value.encode(Env.get('encoding'))) if value else '' diff --git a/couchpotato/core/plugins/renamer/main.py b/couchpotato/core/plugins/renamer/main.py index 8f0fa7ec..1adf6592 100644 --- a/couchpotato/core/plugins/renamer/main.py +++ b/couchpotato/core/plugins/renamer/main.py @@ -313,7 +313,10 @@ class Renamer(Plugin): elif release.status_id is snatched_status.get('id'): if release.quality.id is group['meta_data']['quality']['id']: 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() # Remove leftover files @@ -350,7 +353,10 @@ class Renamer(Plugin): # Delete leftover folder from older releases 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 group['renamed_files'] = [] diff --git a/couchpotato/core/plugins/score/main.py b/couchpotato/core/plugins/score/main.py index f6f3232c..f853be95 100644 --- a/couchpotato/core/plugins/score/main.py +++ b/couchpotato/core/plugins/score/main.py @@ -27,9 +27,9 @@ class Score(Plugin): score += sizeScore(nzb['size']) # Torrents only - if nzb.get('seeds'): + if nzb.get('seeders'): try: - score += nzb.get('seeds') / 5 + score += nzb.get('seeders') / 5 score += nzb.get('leechers') / 10 except: pass diff --git a/couchpotato/core/plugins/searcher/main.py b/couchpotato/core/plugins/searcher/main.py index 26f9eeab..c8188ac0 100644 --- a/couchpotato/core/plugins/searcher/main.py +++ b/couchpotato/core/plugins/searcher/main.py @@ -297,7 +297,7 @@ class Searcher(Plugin): imdb_results = kwargs.get('imdb_results', False) 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'])) return False @@ -317,16 +317,16 @@ class Searcher(Plugin): return False 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: log.info2("Wrong: '%s' blacklisted words: %s" % (nzb['name'], ", ".join(blacklisted))) return False pron_tags = ['xxx', 'sex', 'anal', 'tits', 'fuck', 'porn', 'orgy', 'milf', 'boobs', 'erotica', 'erotic'] - for p_tag in pron_tags: - if p_tag in nzb_words and p_tag not in movie_words: - log.info('Wrong: %s, probably pr0n', (nzb['name'])) - return False + pron_words = list(set(nzb_words) & set(pron_tags) - set(movie_words)) + if pron_words: + log.info('Wrong: %s, probably pr0n', (nzb['name'])) + return False #qualities = fireEvent('quality.all', single = True) preferred_quality = fireEvent('quality.single', identifier = quality['identifier'], single = True) diff --git a/couchpotato/core/providers/nzb/ftdworld/main.py b/couchpotato/core/providers/nzb/ftdworld/main.py index 8b27e00b..57486718 100644 --- a/couchpotato/core/providers/nzb/ftdworld/main.py +++ b/couchpotato/core/providers/nzb/ftdworld/main.py @@ -29,7 +29,7 @@ class FTDWorld(NZBProvider): ([1], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr', 'brrip']), ([10, 13, 14], ['bd50', '720p', '1080p']), ] - cat_backup_id = [1] + cat_backup_id = 1 def search(self, movie, quality): diff --git a/couchpotato/core/providers/nzb/omgwtfnzbs/__init__.py b/couchpotato/core/providers/nzb/omgwtfnzbs/__init__.py new file mode 100644 index 00000000..8e8af499 --- /dev/null +++ b/couchpotato/core/providers/nzb/omgwtfnzbs/__init__.py @@ -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 OMGWTFNZBs', + 'options': [ + { + 'name': 'enabled', + 'type': 'enabler', + }, + { + 'name': 'username', + 'default': '', + }, + { + 'name': 'api_key', + 'label': 'Api Key', + 'default': '', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/nzb/omgwtfnzbs/main.py b/couchpotato/core/providers/nzb/omgwtfnzbs/main.py new file mode 100644 index 00000000..a6ea831b --- /dev/null +++ b/couchpotato/core/providers/nzb/omgwtfnzbs/main.py @@ -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 diff --git a/couchpotato/core/providers/torrent/kickasstorrents/main.py b/couchpotato/core/providers/torrent/kickasstorrents/main.py index e8c3cd16..f639cdd3 100644 --- a/couchpotato/core/providers/torrent/kickasstorrents/main.py +++ b/couchpotato/core/providers/torrent/kickasstorrents/main.py @@ -84,7 +84,7 @@ class KickAssTorrents(TorrentProvider): elif column_name is 'age': new['age'] = self.ageToDays(td.text) elif column_name is 'seeds': - new['seeds'] = tryInt(td.text) + new['seeders'] = tryInt(td.text) elif column_name is 'leechers': new['leechers'] = tryInt(td.text)