itemsort.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from helper import console
  2. def smart(items, criteria):
  3. if '-' in criteria:
  4. _criteria = criteria.split('-', 1)
  5. artist = _criteria[0].split(' ')
  6. title = _criteria[1].split(' ')
  7. else:
  8. artist = title = criteria.split(' ')
  9. for item in items:
  10. # First do negative stuff, bad news comes always first
  11. if item.duration_seconds is not None and item.duration_seconds < 180:
  12. item.decrement_score(0.5)
  13. if item.duration_seconds is not None and item.duration_seconds > 600:
  14. item.decrement_score(1)
  15. if 'radio' in item.title.lower():
  16. item.decrement_score(1)
  17. if len(set(item.artist.lower().split(' ')).intersection(artist)) == 0:
  18. item.decrement_score(2)
  19. if len(set(item.title.lower().split(' ')).intersection(title)) == 0:
  20. item.decrement_score(2)
  21. # Now do the positive stuff
  22. # The following 2 rules are not always correct. Need more testing to evaluate
  23. # if 'original' in item.title.lower():
  24. # item.increment_score(0.5)
  25. # if 'extended' in item.title.lower():
  26. # item.increment_score(1)
  27. if ' '.join(title).strip().lower() == item.title.strip().lower():
  28. item.increment_score(1)
  29. if item.duration_seconds is not None:
  30. item.increment_score(0.1)
  31. if item.size is not None:
  32. item.increment_score(0.1)
  33. sortedlist = []
  34. for item in items:
  35. # We don't show negative scores
  36. if item.score > 0:
  37. sortedlist.append(item)
  38. else:
  39. console.output('Removing {x.artist} - {x.title} from list: Score to low ({x.score})'.format(x=item), console.DBG_INFO)
  40. sortedlist.sort(reverse=True, key=lambda x: (x.score, x.duration_seconds))
  41. return sortedlist