Score system

The score system will help determine what users do and don't like.  When
the user chooses a song or listens to > 75% of a song, we increment the
score.  If the user selects a different song in the first 1/3 of
playback then we decrement the score.

Songs with a score >= 0 will always be played.  Songs with a score < 0
have a 50% chance of playing.
This commit is contained in:
Bryan Schumaker 2010-10-21 17:11:33 -04:00
parent 5835f55eb2
commit 50f7e1203d
4 changed files with 49 additions and 9 deletions

View File

@ -48,6 +48,13 @@ def lib_inc_count(id):
global library
if id >= 0:
library.inc_count(id)
library.save()
def lib_inc_score(id, amount=1):
global library
if id >= 0:
library.inc_score(id, amount)
library.save()
def lib_play_id(id):
global cur_lib_id
@ -116,13 +123,21 @@ def choose_next():
if next != None:
return call("NEXT", lib_play_id, next)
def plist_next():
def change_score():
prcnt = libsaria.music.get_progress()
if prcnt > 75:
if prcnt > 0.75:
lib_inc_count(cur_lib_id)
lib_inc_score(cur_lib_id)
if prcnt < 0.33:
lib_inc_score(cur_lib_id, -1)
def plist_next():
change_score()
choose_next()
def catch_eos(arg=None):
lib_inc_count(cur_lib_id)
lib_inc_score(cur_lib_id)
choose_next()
libsaria.event.invite("POSTEOS", catch_eos)

View File

@ -20,7 +20,7 @@ class TrackRecord:
self.lenstr = lenstr
self.count = 0
self.year = year
#self.like = None
self.score = 0
self.fs = None
self.tags = None
@ -112,6 +112,8 @@ class Collection:
return rec.year
if attr == "lenstr":
return rec.lenstr
if attr == "score":
return rec.score
tags = rec.tags.walk_backwards()
if attr == "artist":

View File

@ -42,6 +42,11 @@ class Library(collection.Collection):
if rec:
rec.count += 1
def inc_score(self, id, amount):
rec = self.records.get(id, None)
if rec:
rec.score += amount
def update(self, path):
global badfiles
FileRef = libsaria.collection.FileRef
@ -86,6 +91,19 @@ class Playlist(collection.Collection):
return None
def random(self):
if self.size == 0:
return
getattr = libsaria.collection.lib_get_attr
for i in xrange(5):
id = self.get_rand_candidate()
if getattr(id, "score") >= 0:
return id
play_anyway = rand.randint(0, 1)
if play_anyway == 1:
return id
return id
def get_rand_candidate(self):
num = self.num_visible()
next_idx = rand.randint(0, num-1)
func = self.visible

View File

@ -54,15 +54,14 @@ class Collection(gtk.ScrolledWindow):
row = row[0]
list_iter = list.get_iter(row)
list_row = list[list_iter]
string = self.mouse_motion(list_row)
list.set_value(list_iter, len(list_row)-1, "Played: %s"%string)
items = self.mouse_motion(list_row)
list.set_value(list_iter, len(list_row)-1,
"Played: %s Score: %s" % items)
def add_selected_to_playlist(self):
print "adding selected to playlist"
self.list.for_each_selected(collection.plist_add_libid)
collection.plist_save()
collection.plist_refresh()
print "done!"
class Library(Collection):
@ -91,10 +90,13 @@ class Library(Collection):
self.populate()
def mouse_motion(self, row):
return collection.lib_get_attr(row[0], "playcount")
return (collection.lib_get_attr(row[0], "playcount"),
collection.lib_get_attr(row[0], "score"))
def select_row(self, row):
collection.change_score()
collection.lib_play_id(row[0])
collection.lib_inc_score(row[0], 1)
def filter(self, text):
collection.lib_filter(text)
@ -128,10 +130,13 @@ class Playlist(Collection):
#print "Populating took: %s" % (after - before)
def mouse_motion(self, row):
return collection.lib_get_attr(row[0], "playcount")
return (collection.lib_get_attr(row[0], "playcount"),
collection.lib_get_attr(row[0], "score"))
def select_row(self, row):
collection.change_score()
collection.lib_play_id(row[0])
collection.lib_inc_score(row[0], 1)
def filter(self, text):
collection.plist_filter(text)