ocarina/libsaria/sources/playlist.py
Bryan Schumaker 558ee3dabe Remove from playlist
I can now remove songs from the playlist.
2010-12-03 08:35:13 -05:00

137 lines
2.6 KiB
Python

# Bryan Schumaker (11/07/2010)
import random as rand
import libsaria
import libsaria.path.files
from libsaria import threads
from libsaria.sources import library
call = libsaria.event.call
song_list = []
song_set = set(song_list)
filtered = False
visible = None
recent = []
recent_msg = "Skipping %s by %s because it has played recently"
skip_msg = "Skipping %s by %s because I don't think you like it"
cur_index = -1
def add_id(id):
global song_list
global song_set
if id not in song_set:
song_list.append(id)
song_set.add(id)
def rm_id(id):
song_list.remove(id)
song_set.remove(id)
def reset():
global song_list
global song_set
song_list = []
song_set = set()
def load():
global song_list
global song_set
global visible
song_list = libsaria.path.files.load("playlist", ".list")
if song_list == None:
reset()
else:
song_set = set(song_list)
def load_bg2(callback):
load()
while library.is_loaded() == False:
pass
callback()
def load_bg(callback):
thr = threads.BG_Thread(load_bg2, callback)
thr.start()
def save():
libsaria.path.files.save(song_list, "playlist", ".list")
def walk():
global song_list
for id in song_list:
yield id
def filter(text):
global visible
global song_set
global filtered
if len(text) > 0:
visible = song_set.intersection(library.test_filter(text))
filtered = True
else:
visible = song_set
filtered = False
def is_visible(id):
global visible
global filtered
if filtered == True:
return id in visible
return True
def num_visible():
if filtered == True:
return len(visible)
return len(song_list)
def seq_next():
global cur_index
global song_list
cur_index += 1
while is_visible(song_list[cur_index]) == False:
cur_index += 1
return song_list[cur_index]
def rand_candidate(list, max):
index = rand.randint(0, max-1)
return list[index]
def rand_next():
n = num_visible()
if n == 0:
return
get_attrs = library.get_attrs
if filtered == False:
selection = song_list
else:
selection = list(visible)
for i in xrange(15):
id = rand_candidate(selection, n)
(artist, title, score) = get_attrs(id, "artist", "title", "score")
if (artist, title) in recent:
print recent_msg % (artist, title)
continue
if score < 0:
do_play = rand.randint(0, 100)
if do_play < ((20 * score) + 100):
print skip_msg % (artist, title)
continue
recent.append((artist, title))
if len(recent) > 50:
recent.pop(0)
if i > 0:
print "Picking a song took %s iterations" % i
return id
def next():
if libsaria.prefs.get_pref("libsaria.random") == True:
id = rand_next()
else:
id = seq_next()
if id != None:
return call("NEXT", library.play_id, id)