From 4ade857f01b724350794e47496b869f5753d63ea Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 16 Nov 2013 23:23:10 +0100 Subject: [PATCH 1/5] Better string regex between brackets --- couchpotato/core/media/_base/searcher/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/media/_base/searcher/main.py b/couchpotato/core/media/_base/searcher/main.py index fdf09309..3c73eb27 100644 --- a/couchpotato/core/media/_base/searcher/main.py +++ b/couchpotato/core/media/_base/searcher/main.py @@ -147,7 +147,7 @@ class Searcher(SearcherBase): except: pass # Match longest name between [] - try: check_names.append(max(check_name.split('['), key = len)) + try: check_names.append(max(re.findall(r'[^[]*\[([^]]*)\]', check_name), key = len).strip()) except: pass for check_name in list(set(check_names)): From 003b78a66e8864bab8c8272f3df5b4fae91dc335 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 16 Nov 2013 23:24:05 +0100 Subject: [PATCH 2/5] Scene validation --- .../core/providers/info/couchpotatoapi/main.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/couchpotato/core/providers/info/couchpotatoapi/main.py b/couchpotato/core/providers/info/couchpotatoapi/main.py index 89eddc3c..4dd942e0 100644 --- a/couchpotato/core/providers/info/couchpotatoapi/main.py +++ b/couchpotato/core/providers/info/couchpotatoapi/main.py @@ -3,6 +3,7 @@ from couchpotato.core.helpers.encoding import tryUrlencode from couchpotato.core.logger import CPLog from couchpotato.core.providers.info.base import MovieProvider from couchpotato.environment import Env +import base64 import time log = CPLog(__name__) @@ -11,6 +12,7 @@ log = CPLog(__name__) class CouchPotatoApi(MovieProvider): urls = { + 'validate': 'https://api.couchpota.to/validate/%s/', 'search': 'https://api.couchpota.to/search/%s/', 'info': 'https://api.couchpota.to/info/%s/', 'is_movie': 'https://api.couchpota.to/ismovie/%s/', @@ -30,6 +32,8 @@ class CouchPotatoApi(MovieProvider): addEvent('movie.suggest', self.getSuggestions) addEvent('movie.is_movie', self.isMovie) + addEvent('release.validate', self.validate) + addEvent('cp.source_url', self.getSourceUrl) addEvent('cp.messages', self.getMessages) @@ -51,6 +55,14 @@ class CouchPotatoApi(MovieProvider): def search(self, q, limit = 5): return self.getJsonData(self.urls['search'] % tryUrlencode(q) + ('?limit=%s' % limit), headers = self.getRequestHeaders()) + def validate(self, name = None): + + if not name: + return + + name_enc = base64.b64encode(name) + return self.getJsonData(self.urls['validate'] % name_enc, headers = self.getRequestHeaders()) + def isMovie(self, identifier = None): if not identifier: From 0fafd83d76e3b222a971e758ccd9afd191b87abb Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 16 Nov 2013 23:26:46 +0100 Subject: [PATCH 3/5] Do some scoring with scene / nuked. fix #2009 --- couchpotato/core/plugins/score/main.py | 7 +++-- couchpotato/core/plugins/score/scores.py | 40 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/couchpotato/core/plugins/score/main.py b/couchpotato/core/plugins/score/main.py index 5f9da1a1..54b6ca31 100644 --- a/couchpotato/core/plugins/score/main.py +++ b/couchpotato/core/plugins/score/main.py @@ -1,11 +1,11 @@ -from couchpotato.core.event import addEvent +from couchpotato.core.event import addEvent, fireEvent from couchpotato.core.helpers.encoding import toUnicode from couchpotato.core.helpers.variable import getTitle, splitString from couchpotato.core.logger import CPLog from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.score.scores import nameScore, nameRatioScore, \ sizeScore, providerScore, duplicateScore, partialIgnoredScore, namePositionScore, \ - halfMultipartScore + halfMultipartScore, sceneScore from couchpotato.environment import Env log = CPLog(__name__) @@ -62,4 +62,7 @@ class Score(Plugin): if extra_score: score += extra_score(nzb) + # Scene / Nuke scoring + score += sceneScore(nzb['name']) + return score diff --git a/couchpotato/core/plugins/score/scores.py b/couchpotato/core/plugins/score/scores.py index 6aa0b465..895f5fc0 100644 --- a/couchpotato/core/plugins/score/scores.py +++ b/couchpotato/core/plugins/score/scores.py @@ -1,8 +1,13 @@ from couchpotato.core.event import fireEvent from couchpotato.core.helpers.encoding import simplifyString from couchpotato.core.helpers.variable import tryInt +from couchpotato.core.logger import CPLog from couchpotato.environment import Env import re +import traceback + +log = CPLog(__name__) + name_scores = [ # Tags @@ -160,3 +165,38 @@ def halfMultipartScore(nzb_name): return -30 return 0 + + +def sceneScore(nzb_name): + + check_names = [nzb_name] + + # Match names between " + try: check_names.append(re.search(r'([\'"])[^\1]*\1', nzb_name).group(0)) + except: pass + + # Match longest name between [] + try: check_names.append(max(re.findall(r'[^[]*\[([^]]*)\]', nzb_name), key = len).strip()) + except: pass + + for name in check_names: + + # Strip twice, remove possible file extensions + name = name.lower().strip(' "\'\.-_\[\]') + name = re.sub('\.([a-z0-9]{0,4})$', '', name) + name = name.strip(' "\'\.-_\[\]') + + # Make sure year and groupname is in there + year = re.findall('(?P19[0-9]{2}|20[0-9]{2})', name) + group = re.findall('\-([a-z0-9]+)$', name) + + if len(year) > 0 and len(group) > 0: + try: + validate = fireEvent('release.validate', name, single = True) + if validate and tryInt(validate.get('score')) != 0: + log.debug('Release "%s" scored %s, reason: %s', (nzb_name, validate['score'], validate['reasons'])) + return tryInt(validate.get('score')) + except: + log.error('Failed scoring scene: %s', traceback.format_exc()) + + return 0 From 731419b61f470d6c1e69d39ad9c71fd1ff991e7f Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 16 Nov 2013 23:33:23 +0100 Subject: [PATCH 4/5] Better error logging for syno downloader. close #2464 --- couchpotato/core/downloaders/synology/main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/couchpotato/core/downloaders/synology/main.py b/couchpotato/core/downloaders/synology/main.py index d5082c77..0721085c 100644 --- a/couchpotato/core/downloaders/synology/main.py +++ b/couchpotato/core/downloaders/synology/main.py @@ -3,6 +3,7 @@ from couchpotato.core.helpers.encoding import isInt from couchpotato.core.logger import CPLog import json import requests +import traceback log = CPLog(__name__) @@ -34,12 +35,12 @@ class Synology(Downloader): elif data['protocol'] in ['nzb', 'torrent']: log.info('Adding %s' % data['protocol']) if not filedata: - log.error('No %s data found' % data['protocol']) + log.error('No %s data found', data['protocol']) else: filename = data['name'] + '.' + data['protocol'] response = srpc.create_task(filename = filename, filedata = filedata) - except Exception, err: - log.error('Exception while adding torrent: %s', err) + except: + log.error('Exception while adding torrent: %s', traceback.format_exc()) finally: return response From af2a6bf0319b3514b2bffa0e81381abec5e2b0c4 Mon Sep 17 00:00:00 2001 From: Ruud Date: Sat, 16 Nov 2013 23:58:58 +0100 Subject: [PATCH 5/5] Force ETA data not to be to far in the future --- couchpotato/core/media/movie/library/movie/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/couchpotato/core/media/movie/library/movie/main.py b/couchpotato/core/media/movie/library/movie/main.py index 718e7390..b0d05202 100644 --- a/couchpotato/core/media/movie/library/movie/main.py +++ b/couchpotato/core/media/movie/library/movie/main.py @@ -151,7 +151,7 @@ class MovieLibraryPlugin(LibraryBase): else: dates = library.info.get('release_date') - if dates and dates.get('expires', 0) < time.time() or not dates: + if dates and (dates.get('expires', 0) < time.time() or dates.get('expires', 0) > time.time() + (604800 * 4)) or not dates: dates = fireEvent('movie.release_date', identifier = identifier, merge = True) library.info.update({'release_date': dates }) db.commit()