from helper import console def smart(items, criteria): if '-' in criteria: _criteria = criteria.split('-') artist = _criteria[0].split(' ') title = _criteria[1].split(' ') else: artist = title = criteria.split(' ') for item in items: # First do negative stuff, bad news comes always first if item.duration_seconds is not None and item.duration_seconds < 180: item.decrement_score(0.5) if item.duration_seconds is not None and item.duration_seconds > 600: item.decrement_score(1) if 'radio' in item.title.lower(): item.decrement_score(1) if len(set(item.artist.lower().split(' ')).intersection(artist)) == 0: item.decrement_score(2) if len(set(item.title.lower().split(' ')).intersection(title)) == 0: item.decrement_score(2) # Now do the positive stuff # The following 2 rules are not always correct. Need more testing to evaluate # if 'original' in item.title.lower(): # item.increment_score(0.5) # if 'extended' in item.title.lower(): # item.increment_score(1) if ' '.join(title).strip().lower() == item.title.strip().lower(): item.increment_score(1) if item.duration_seconds is not None: item.increment_score(0.1) if item.size is not None: item.increment_score(0.1) sortedlist = [] for item in items: # We don't show negative scores if item.score > 0: sortedlist.append(item) else: console.output('Removing {x.artist} - {x.title} from list: Score to low ({x.score})'.format(x=item), console.DBG_INFO) sortedlist.sort(reverse=True, key=lambda x: (x.score, x.duration_seconds)) return sortedlist