ocarina/libsaria/sources/playlist/__init__.py
Bryan Schumaker 132a66271c libsaria: Move playlist load, save, and reset functions
I moved them to playlist.py so they can grab the lock and safely do
stuff.  I save after adding or removing song ids.  I also save after
resetting the playlist.
2011-05-12 22:34:36 -04:00

147 lines
3.0 KiB
Python

# Bryan Schumaker (11/07/2010)
import libsaria
import libsaria.path.files
import playlist
library = None
source = None
rand = None
filtered = False
visible = None
recent = None
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 = None
# Function pointers for convenience
add_ids = playlist.add_ids
rm_ids = playlist.rm_ids
load = playlist.load
reset = playlist.reset
def init():
global library
global rand
global source
from libsaria.sources import library
import random as rand
source = libsaria.sources.Source()
source.get_attrs = library.get_attrs
source.set_attr = library.set_attr
source.get_cur_id = get_cur_id
def init_bg():
init()
load()
def startup():
if cur_index >= 0:
load_id(playlist.song_list[cur_index])
def list():
for id in playlist.song_list:
yield id
def filter(text):
global visible
global song_set
global filtered
if len(text) > 0:
visible = playlist.as_set().intersection(library.test_filter(text))
filtered = True
else:
visible = playlist.as_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(playlist.song_list)
def get_cur_id():
return playlist.song_list[cur_index]
def seq_next():
global cur_index
cur_index += 1
max_index = len(playlist.song_list)
if cur_index == max_index:
cur_index = 0
while is_visible(playlist.song_list[cur_index]) == False:
cur_index += 1
if cur_index == max_index:
cur_index = 0
return playlist.song_list[cur_index]
def rand_candidate(list, max):
index = rand.randint(0, max-1)
return list[index]
def rand_next():
global cur_index
n = num_visible()
if n == 0:
return
get_attrs = library.get_attrs
if filtered == False:
selection = playlist.song_list
else:
selection = list(visible)
for i in xrange(15):
id = rand_candidate(selection, n)
(artist, title, like) = get_attrs(id, "artist", "title", "like")
if (artist, title) in recent:
print recent_msg % (artist, title)
continue
if like == False:
print skip_msg % (artist, title)
continue
if i > 0:
print "Picking a song took %s iterations" % i
cur_index = playlist.song_list.index(id)
return id
return id
def load_id(id):
global cur_index
cur_index = playlist.song_list.index(id)
save()
path = library.get_attrs(id, "filepath")
return source.load_file(path)
def play_id(id):
if load_id(id) == True:
print "playing..."
libsaria.controls.play()
return True
return False
def next():
id = None
if len(playlist.song_list) == 0:
return
if libsaria.prefs.get("libsaria.random") == True:
id = rand_next()
else:
id = seq_next()
if id != None:
artist, title, file = library.get_attrs(id, "artist", "title", "filepath")
recent.append((artist, title))
if len(recent) > 50:
recent.pop(0)
source.set_current()
save()
return id