From bb7b4cbbed2e5c1f3dd59c232d7d04477b16f628 Mon Sep 17 00:00:00 2001 From: clinton-hall Date: Thu, 13 Dec 2012 19:45:13 -0800 Subject: [PATCH 1/6] Added try: except for two common errors Does not fix the errors, but prevents the renamer being stuck as "in progress" Allows next instance to run. --- couchpotato/core/plugins/renamer/main.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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'] = [] From b680d84cba9dc1bc998fceb61b5aab0af1c5fe66 Mon Sep 17 00:00:00 2001 From: Ruud Date: Mon, 17 Dec 2012 12:00:42 +0100 Subject: [PATCH 2/6] Don't use handler when in desktop build --- couchpotato/core/_base/_core/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 '' From 0fd49a2c6745dac4473200ddb4a4c23fce173a51 Mon Sep 17 00:00:00 2001 From: Ruud Date: Mon, 17 Dec 2012 13:03:33 +0100 Subject: [PATCH 3/6] FTDWorld returned wrong backup category --- couchpotato/core/providers/nzb/ftdworld/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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): From 5aa21466145b23c4b220e7516f7d09ebdd05a360 Mon Sep 17 00:00:00 2001 From: Ruud Date: Mon, 17 Dec 2012 13:07:01 +0100 Subject: [PATCH 4/6] OMGWTFNZBs support. closes #1130 ZOMG BBQ SAUCAGES NOMNOMNOM --- .../core/providers/nzb/omgwtfnzbs/__init__.py | 31 ++++++ .../core/providers/nzb/omgwtfnzbs/main.py | 94 +++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 couchpotato/core/providers/nzb/omgwtfnzbs/__init__.py create mode 100644 couchpotato/core/providers/nzb/omgwtfnzbs/main.py 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 From ea7904ed9a52b7dd5da56c9c9402ea0e9b03548b Mon Sep 17 00:00:00 2001 From: Ruud Date: Mon, 17 Dec 2012 13:56:11 +0100 Subject: [PATCH 5/6] Typo on seeders check. fix #1142 --- couchpotato/core/plugins/score/main.py | 4 ++-- couchpotato/core/plugins/searcher/main.py | 2 +- couchpotato/core/providers/torrent/kickasstorrents/main.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) 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..6cc80e9d 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 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) From 342d31b48a40465c68b63ded1714c16dbc91e368 Mon Sep 17 00:00:00 2001 From: Ruud Date: Mon, 17 Dec 2012 14:08:44 +0100 Subject: [PATCH 6/6] Remove ignored words which are part of title. close #1123 --- couchpotato/core/plugins/searcher/main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/couchpotato/core/plugins/searcher/main.py b/couchpotato/core/plugins/searcher/main.py index 6cc80e9d..c8188ac0 100644 --- a/couchpotato/core/plugins/searcher/main.py +++ b/couchpotato/core/plugins/searcher/main.py @@ -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)