diff --git a/couchpotato/core/media/_base/providers/base.py b/couchpotato/core/media/_base/providers/base.py old mode 100644 new mode 100755 index 587545c..33852a4 --- a/couchpotato/core/media/_base/providers/base.py +++ b/couchpotato/core/media/_base/providers/base.py @@ -259,8 +259,8 @@ class YarrProvider(Provider): if quality.get('custom'): want_3d = quality['custom'].get('3d') - for ids, qualities in self.cat_ids: - if identifier in qualities or (want_3d and '3d' in qualities): + for ids, value in self.cat_ids: + if self.categoryMatch(value, quality, identifier, want_3d): return ids if self.cat_backup_id: @@ -268,6 +268,38 @@ class YarrProvider(Provider): return [] + def categoryMatch(self, value, quality, identifier, want_3d): + if type(value) is list: + # Basic identifier matching + if identifier in value: + return True + + if want_3d and '3d' in value: + return True + + return False + + if type(value) is dict: + # Property matching + for key in ['codec', 'resolution', 'source']: + if key not in quality: + continue + + for required in quality.get(key): + # Ensure category contains property list + if key not in value: + return False + + # Ensure required property is in category + if required not in value[key]: + return False + + # Valid + return True + + # Unknown failure + return False + class ResultList(list): diff --git a/couchpotato/core/media/_base/quality/base.py b/couchpotato/core/media/_base/quality/base.py index 74caa64..ada1490 100755 --- a/couchpotato/core/media/_base/quality/base.py +++ b/couchpotato/core/media/_base/quality/base.py @@ -50,7 +50,10 @@ class QualityBase(Plugin): return self.pre_releases - def get(self, identifier): + def get(self, identifier, types = None): + if types and self.type not in types: + return + for q in self.qualities: if identifier == q.get('identifier'): return q diff --git a/couchpotato/core/media/_base/quality/main.py b/couchpotato/core/media/_base/quality/main.py index 23a8c12..950630b 100755 --- a/couchpotato/core/media/_base/quality/main.py +++ b/couchpotato/core/media/_base/quality/main.py @@ -31,13 +31,18 @@ class Quality(Plugin): addApiView('quality.size.save', self.saveSize) - def single(self, identifier = ''): + def single(self, identifier = '', types = None): db = get_db() quality = db.get('quality', identifier, with_doc = True)['doc'] if quality: return mergeDicts( - fireEvent('quality.get', quality['identifier'], single = True), + fireEvent( + 'quality.get', + quality['identifier'], + types = types, + single = True + ), quality ) diff --git a/couchpotato/core/media/_base/searcher/main.py b/couchpotato/core/media/_base/searcher/main.py index bf5410c..a7249d8 100755 --- a/couchpotato/core/media/_base/searcher/main.py +++ b/couchpotato/core/media/_base/searcher/main.py @@ -90,7 +90,14 @@ class Searcher(SearcherBase): found = {} # Try guessing via quality tags - guess = fireEvent('quality.guess', files = [nzb.get('name')], size = nzb.get('size', None), types = types, single = True) + guess = fireEvent( + 'quality.guess', + files = [nzb.get('name')], + size = nzb.get('size', None), + types = types, + single = True + ) + if guess: found[guess['identifier']] = True