You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.6 KiB
71 lines
2.6 KiB
from couchpotato.core.event import addEvent, fireEvent
|
|
from couchpotato.core.helpers.encoding import toUnicode
|
|
from couchpotato.core.helpers.variable import getTitle, splitString, removeDuplicate
|
|
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, sceneScore
|
|
from couchpotato.environment import Env
|
|
|
|
log = CPLog(__name__)
|
|
|
|
|
|
class Score(Plugin):
|
|
|
|
def __init__(self):
|
|
addEvent('score.calculate', self.calculate)
|
|
|
|
def calculate(self, nzb, media):
|
|
""" Calculate the score of a NZB, used for sorting later """
|
|
|
|
# Fetch root media item (movie, show)
|
|
root = fireEvent('library.root', media, single = True)
|
|
|
|
# Merge global and category
|
|
preferred_words = splitString(Env.setting('preferred_words', section = 'searcher').lower())
|
|
try: preferred_words = removeDuplicate(preferred_words + splitString(media['category']['preferred'].lower()))
|
|
except: pass
|
|
|
|
score = nameScore(toUnicode(nzb['name']), root['info'].get('year'), preferred_words)
|
|
|
|
for movie_title in root['info']['titles']:
|
|
score += nameRatioScore(toUnicode(nzb['name']), toUnicode(movie_title))
|
|
score += namePositionScore(toUnicode(nzb['name']), toUnicode(movie_title))
|
|
|
|
score += sizeScore(nzb['size'])
|
|
|
|
# Torrents only
|
|
if nzb.get('seeders'):
|
|
try:
|
|
score += nzb.get('seeders') * 100 / 15
|
|
score += nzb.get('leechers') * 100 / 30
|
|
except:
|
|
pass
|
|
|
|
# Provider score
|
|
score += providerScore(nzb['provider'])
|
|
|
|
# Duplicates in name
|
|
score += duplicateScore(nzb['name'], getTitle(root))
|
|
|
|
# Merge global and category
|
|
ignored_words = splitString(Env.setting('ignored_words', section = 'searcher').lower())
|
|
try: ignored_words = removeDuplicate(ignored_words + splitString(media['category']['ignored'].lower()))
|
|
except: pass
|
|
|
|
# Partial ignored words
|
|
score += partialIgnoredScore(nzb['name'], getTitle(root), ignored_words)
|
|
|
|
# Ignore single downloads from multipart
|
|
score += halfMultipartScore(nzb['name'])
|
|
|
|
# Extra provider specific check
|
|
extra_score = nzb.get('extra_score')
|
|
if extra_score:
|
|
score += extra_score(nzb)
|
|
|
|
# Scene / Nuke scoring
|
|
score += sceneScore(nzb['name'])
|
|
|
|
return score
|
|
|