ocarina/libsaria/sources/__init__.py

124 lines
2.4 KiB
Python

# Bryan Schumaker (8/8/2010)
import libsaria
from libsaria import callbacks
exists = libsaria.path.exists
expand = libsaria.path.expand
import library
import playlist
import queue
cur_source = None
cur_id = None
class Source:
def __init__(self):
self.get_attrs = None
self.set_attr = None
self.get_cur_id = None
self.save = None
def set_current(self):
global cur_source
cur_source = self
def load_file(self, path):
global cur_source
# I should probably get a lock here...
try:
self.set_current()
controls.load(path)
return True
except:
return False
def inc_count():
# This will eventually increment a play count...
pass
def find_attrs(file, *attrs):
if file == None:
return
track = library.track.Track(file)
if track == None:
return
get = track.__dict__.get
res = []
for attr in attrs:
if attr == "id":
res.append(library.update.song_id(file))
else:
res.append(get(attr))
return res
# Function pointer to avoid unnecessary lookups for a common function
get_attrs_id = library.get_attrs
def get_attrs(*attrs):
# I should probably get a lock here...
res = None
if cur_id:
res = get_attrs_id(cur_id, *attrs)
if res == None:
file = libsaria.audio.get_cur_file()
res = find_attrs(file, *attrs)
if res == None:
res = [None] * len(attrs)
return res
def filter(text):
visible = library.filter(text)
playlist.set_visible(visible)
queue.set_visible(visible)
callbacks.refilter()
def is_visible(id):
return library.is_visible(id)
def set_attr(attr, value):
if cur_source:
cur_source.set_attr(cur_id, attr, value)
cur_source.save()
def make_library(path):
path = expand(path)
if not exists(path):
return
library.add_path(path)
library.update_lib()
libsaria.callbacks.library_updated()
def play_id(id):
global cur_id
cur_id = id
file = get_attrs("filepath")[0]
queue.rm_ids([id])
libsaria.controls.load(file)
libsaria.controls.play()
def next():
global cur_id
id = queue.next()
if id == None:
id = playlist.get_next(cur_id)
if id != None:
cur_id = id
return get_attrs("filepath")[0]
def list_source(list_func, *attrs):
ret = []
append = ret.append
for id in list_func():
append(get_attrs_id(id, *attrs))
return ret
def list_library(*attrs):
return list_source(library.list_ids, *attrs)
def list_playlist(*attrs):
return list_source(playlist.list_ids, *attrs)
def list_queue(*attrs):
return list_source(queue.list_ids, *attrs)