-
-
-
-
-
-
-
-
diff --git a/libsaria/__init__.py b/libsaria/__init__.py
deleted file mode 100644
index 4560c606..00000000
--- a/libsaria/__init__.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Bryan Schumaker (8/7/2010)
-
-import version
-import prefs
-import audio
-import path
-
-import sources
-import controls
-import server
-
-from path import lastfm
-#plugin = None
-
-
-def startup():
-# global plugin
-# import plugin
-
-# plugin.load_all()
- prefs.enable_save()
- parse_user_input()
-
-
-def shutdown():
- audio.shutdown()
- server.shutdown()
-## import plugin
-## plugin.quit()
-
-
-def parse_user_input():
- import sys
- for item in sys.argv[1:]:
- path.files.universal_open(item)
diff --git a/libsaria/audio/__init__.py b/libsaria/audio/__init__.py
deleted file mode 100644
index 8050f4c3..00000000
--- a/libsaria/audio/__init__.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Bryan Schumake (8/7/2010)
-
-import gst
-import datetime
-import threading
-import pipeline
-from libsaria import callbacks
-from libsaria import prefs
-from libsaria import controls
-
-timedelta = datetime.timedelta
-audio_lock = threading.Lock()
-lock_audio = audio_lock.acquire
-unlock_audio = audio_lock.release
-
-def shutdown():
- lock_audio()
- pipeline.reset()
- unlock_audio()
-
-def load_file(file):
- lock_audio()
- pipeline.load_file("file", file)
- unlock_audio()
- callbacks.load_file(file)
-
-def get_cur_file():
- lock_audio()
- file = pipeline.get_cur_file()
- unlock_audio()
- return file
-
-def get_state():
- lock_audio()
- state = pipeline.get_state()
- unlock_audio()
- return state
-
-def is_playing():
- return get_state() == gst.STATE_PLAYING
-
-def do_notify_playing():
- if get_state() == gst.STATE_PLAYING:
- callbacks.play()
-
-def play():
- lock_audio()
- pipeline.play()
- unlock_audio()
- do_notify_playing()
-
-def do_notify_paused():
- if get_state() == gst.STATE_PAUSED:
- callbacks.pause()
-
-def pause():
- lock_audio()
- pipeline.pause()
- unlock_audio()
- do_notify_paused()
-
-def stop():
- lock_audio()
- pipeline.stop()
- unlock_audio()
- do_notify_paused()
-
-def seek(amount):
- lock_audio()
- pipeline.seek(amount)
- unlock_audio()
-
-def seek_prcnt(prcnt):
- lock_audio()
- pipeline.seek_prcnt(prcnt)
- unlock_audio()
-
-def set_volume(prcnt):
- lock_audio()
- pipeline.set_volume(prcnt)
- unlock_audio()
- prefs.set("libsaria.audio.volume", prcnt)
-set_volume(prefs.init("libsaria.audio.volume", 1.0))
-
-def position():
- lock_audio()
- pos = pipeline.position()
- unlock_audio()
- return pos
-
-def duration():
- lock_audio()
- dur = pipeline.duration()
- unlock_audio()
- return dur
-
-def make_progstr(spot):
- sec = spot / 1000000000
- lenstr = "%s" % timedelta(seconds=sec)
- if lenstr[0] == "0" and lenstr[1] == ":":
- lenstr = lenstr[2:]
- else:
- lenstr = lenstr
- return lenstr.split(".")[0]
-
-def get_progstr():
- return make_progstr(position())
-
-def get_time_at(prcnt):
- return make_progstr(duration() * prcnt)
-
-def get_progress():
- dur = duration()
- if dur > 0.0:
- return position() / dur
- return 0.0
-
-def bus_message(bus, message):
- if message.type == gst.MESSAGE_EOS:
- controls.catch_eos()
-pipeline.bus.connect("message", bus_message)
diff --git a/libsaria/audio/pipeline.py b/libsaria/audio/pipeline.py
deleted file mode 100644
index 5b8b3790..00000000
--- a/libsaria/audio/pipeline.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Bryan Schumaker (2 / 6 / 2011)
-# NOTE: DO NOT CALL FUNCTIONS IN THIS FILE DIRECTLY
-# USE THE FUNCTIONS IN __init__.py INSTEAD. THIS
-# WILL ENSURE THAT THE AUDIO LOCK IS HELD :-)
-
-import gst
-
-player = gst.element_factory_make("playbin2", "player")
-time = gst.Format(gst.FORMAT_TIME)
-bus = player.get_bus()
-bus.add_signal_watch()
-
-cur_file = None
-
-def reset():
- global cur_file
- cur_file = None
- player.set_state(gst.STATE_NULL)
-
-def load_file(type, file):
- global cur_file
- reset()
- cur_file = file
- player.set_property("uri", "%s://%s" % (type, file))
-
-def get_cur_file():
- return cur_file
-
-def has_file():
- return cur_file != None
-
-def change_state(state):
- if has_file() == True:
- player.set_state(state)
- else:
- player.set_state(gst.STATE_NULL)
-
-def play():
- change_state(gst.STATE_PLAYING)
-
-def pause():
- change_state(gst.STATE_PAUSED)
-
-def stop():
- pause()
- seek_to(0)
-
-def get_state():
- return player.get_state()[1]
-
-def position():
- if get_state() == gst.STATE_NULL:
- pos = 0.0
- else:
- pos = player.query_position(time)[0]
- return float(pos)
-
-def duration():
- if get_state() == gst.STATE_NULL:
- dur = 0.0
- else:
- dur = player.query_duration(time)[0]
- return float(dur)
-
-def seek_to(new_spot):
- if new_spot < 0:
- new_spot = 0
- player.seek_simple(time, gst.SEEK_FLAG_FLUSH, new_spot)
-
-def seek(amount):
- pos = position()
- if pos == 0.0:
- return
- seek_to( pos + (amount * 1000000000) )
-
-def seek_prcnt(prcnt):
- seek_to(prcnt * duration())
-
-def set_volume(prcnt):
- player.set_property("volume", prcnt)
diff --git a/libsaria/callbacks.py b/libsaria/callbacks.py
deleted file mode 100644
index 2960b878..00000000
--- a/libsaria/callbacks.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Bryan Schumaker (4 / 30 / 2011)
-
-import libsaria
-
-def null_cb(*args):
- pass
-
-on_play = null_cb
-def play():
- on_play()
-
-on_pause = null_cb
-def pause():
- on_pause()
-
-on_load = null_cb
-def load_file(file):
- attrs = libsaria.sources.all_attrs()
- on_load(file, attrs)
-
-on_like = null_cb
-def like_song(like):
- on_like(like)
-
-on_set_volume = null_cb
-def set_volume(prcnt):
- on_set_volume(prcnt)
-
-on_get_art = null_cb
-def get_art(file, id):
- on_get_art(file, id)
-
-on_load_playlist = null_cb
-def load_playlist():
- on_load_playlist()
-
-on_library_updated = null_cb
-def library_updated():
- on_library_updated()
-
-on_queue_changed = null_cb
-def queue_changed():
- on_queue_changed()
-
-on_filter = null_cb
-def refilter():
- on_refilter()
diff --git a/libsaria/controls.py b/libsaria/controls.py
deleted file mode 100644
index be0b6641..00000000
--- a/libsaria/controls.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Bryan Schumaker (11/23/2010)
-
-import prefs
-import audio
-import libsaria
-from libsaria import path
-from libsaria import sources
-from libsaria import callbacks
-
-expand = path.expand
-exists = path.exists
-
-pause_after = False
-prefs.init("libsaria.random", False)
-
-def pick_next():
- global pause_after
- file = sources.next()
- if file != None:
- load(file)
- if pause_after == True:
- pause()
- else:
- play()
- pause_after = False
-
-def catch_eos(*args):
- libsaria.sources.inc_count()
- pick_next()
-
-def next():
- pick_next()
-
-def play():
- audio.play()
-
-def pause():
- audio.pause()
-
-def playing():
- return audio.get_state() == audio.gst.STATE_PLAYING
-
-def do_pause_after(*args):
- global pause_after
- pause_after = True
-
-def toggle_play():
- if audio.get_state() == audio.gst.STATE_PAUSED:
- play()
- else:
- pause()
-
-def stop():
- audio.stop()
-
-def seek_forward():
- libsaria.audio.seek(5)
-
-def seek_backward():
- libsaria.audio.seek(-5)
-
-def set_volume(prcnt):
- audio.set_volume(prcnt)
- callbacks.set_volume(prcnt)
-
-def set_rand(rand):
- prefs.set("libsaria.random", rand)
-
-def set_like(like=None):
- sources.set_attr("like", like)
- callbacks.like_song(like)
-
-def get_like():
- return sources.all_attrs()["like"]
-
-def load(file):
- file = expand(file)
- if not exists(file):
- return False
- audio.load_file(file)
diff --git a/libsaria/path/__init__.py b/libsaria/path/__init__.py
deleted file mode 100644
index c4c245b1..00000000
--- a/libsaria/path/__init__.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Bryan Schumaker (8/7/2010)
-
-import libsaria
-import os
-
-exists = os.path.exists
-is_dir = os.path.isdir
-expand = os.path.expanduser
-splitext = os.path.splitext
-basename = os.path.basename
-join = os.path.join
-makedir = os.mkdir
-rm = os.remove
-ls = os.listdir
-walk = os.walk
-sep = os.sep
-cwd = os.getcwd
-stat = os.stat
-
-cp = None
-saria_dir = None
-plugin_dir = None
-
-shutil = None
-FSTree = None
-s_dir = None
-p_dir = None
-
-def file_id(path):
- if exists(path):
- return stat(path).st_ino
- return -1
-
-def saria_dir_once():
- global s_dir
- global saria_dir
- s_dir = join(expand("~"), ".saria")
- if exists(s_dir) == False:
- mkdir(s_dir)
- saria_dir = saria_dir_rest
- return s_dir
-def saria_dir_rest():
- global s_dir
- return s_dir
-saria_dir = saria_dir_once
-
-def cp_once(src, dest):
- global cp
- global shutil
- import shutil
- cp = shutil.copy
- cp(src, dest)
-cp = cp_once
-
-def mkdir(path):
- if not exists(path):
- makedir(path)
diff --git a/libsaria/path/export.py b/libsaria/path/export.py
deleted file mode 100644
index 7857268f..00000000
--- a/libsaria/path/export.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# Bryan Schumaker (11/12/2010)
-
-import libsaria
-from libsaria import path
-from libsaria.sources import playlist
-from libsaria import version
-from libsaria import callbacks
-import libsaria.xm as xml
-
-add_child = xml.add_child
-add_text = xml.add_text
-get_attrs = libsaria.sources.library.get_attrs
-file_id = path.file_id
-lib_file = "library"
-vers = "%s.%s" % (version.__major__, version.__minor__)
-if version.__dev__ == True:
- lib_file = lib_file + "-dev"
-lib_file += ".xml"
-lib_file = path.join(path.saria_dir(), lib_file)
-
-xml_children = xml.children
-xml_child = xml.child
-xml_attrs = xml.attributes
-
-#######################################
-# Generic encode and decode functions #
-#######################################
-
-def decode_attr(attr):
- child = xml.child(attr)
- return (attr.nodeName, child.data.strip())
-
-def encode_attr(doc, node, attr, value):
- child = add_child(doc, node, attr)
- add_text(doc, child, value)
-
-def encode_track(doc, node, id):
- filepath, like, count = get_attrs(id, "filepath", "like", "count")
- if (like == None) and (count == 0):
- return
- child = add_child(doc, node, "track", {"like":like, "count":count})
- add_text(doc, child, filepath)
-
-##################################
-# xspf encode / decode functions #
-##################################
-
-def decode_xspf_track(location):
- file = xml.child(location).data.strip()
- if file[:7] == "file://":
- id = path.file_id(file[7:])
- playlist.add_ids([id])
-
-def decode_xspf(child):
- tlist = xml.child(child)
- playlist.reset()
- for node in xml.children(tlist):
- try:
- loc = xml.get_elements(node, "location")[0]
- decode_xspf_track(loc)
- except:
- pass
- playlist.save()
- callbacks.load_playlist()
-
-def encode_xspf(doc, node, id):
- filepath = get_attrs(id, "filepath")[0]
- track = add_child(doc, node, "track")
- location = add_child(doc, track, "location")
- add_text(doc, location, "file://%s" % filepath)
-
-
-#############################################
-# Control will enter the export module here #
-#############################################
-
-def save_playlist(filepath):
- file, ext = path.splitext(filepath)
- if ext != ".xml":
- filepath+=".xml"
-
- doc = xml.new()
- child = add_child(doc, doc, "playlist", {"version":1, "xmlns":"http://xspf.org/ns/0/"})
- tlist = add_child(doc, child, "trackList")
-
- for id in playlist.list_ids():
- encode_xspf(doc, tlist, id)
-
- fout = open(filepath, 'w')
- fout.write(doc.toprettyxml())
- fout.close()
- print "Wrote playlist to: %s" % filepath
-
-def import_xml(file):
- fin = open(file)
- doc = xml.parse(fin)
- child = xml.child(doc)
- if child.nodeName == "playlist":
- decode_xspf(child)
diff --git a/libsaria/path/files.py b/libsaria/path/files.py
deleted file mode 100644
index 272aca28..00000000
--- a/libsaria/path/files.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Bryan Schumaker (8/7/2010)
-
-import libsaria
-from libsaria import path
-from libsaria import version
-plugin = None
-export = None
-
-dev = ""
-if version.__dev__ == True:
- dev = "-dev"
-
-def open_plugin(file):
- global plugin
- if plugin == None:
- from libsaria import plugin
- plugin.install(file)
-
-def open_xml(file):
- global export
- if export == None:
- import export
- export.import_xml(file)
-
-def open_music(file):
- try:
- libsaria.sources.cur_id = None
- libsaria.controls.load(file)
- libsaria.controls.play()
- except Exception, e:
- print e
-
-mapping = {".py":open_plugin, ".xml":open_xml}
-def universal_open(file):
- file = file.replace("%20", " ")
- file = file.replace("%22", "\"")
- if path.is_dir(file):
- libsaria.sources.make_library(file)
- return
- base, ext = path.splitext(file)
- func = mapping.get(ext, open_music)
- func(file)
diff --git a/libsaria/path/lastfm.py b/libsaria/path/lastfm.py
deleted file mode 100644
index 984226b4..00000000
--- a/libsaria/path/lastfm.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# Bryan Schumaker (10/24/2010)
-
-import libsaria
-from libsaria import sources
-from libsaria import web
-from libsaria import xm
-from libsaria import callbacks
-from libsaria import storage
-from libsaria.storage import cache
-import threading
-
-file_id = libsaria.path.file_id
-pref_attr = xm.find_preferred_attribute
-
-pref_sizes = ["extralarge", "large", "medium", "small"]
-
-APIROOT = "http://ws.audioscrobbler.com/2.0/"
-APIKEY = "2c76f85a6704efd74b5a358821284ef9"
-SECRET = "3a6012bfb627b60a884cf33fc044885c"
-
-
-class LastFmRequest(dict):
- def __init__(self, method):
- self.method = method
-
- def print_file(self, file):
- for line in file:
- print line.strip()
- file.seek(0)
-
- def place(self, printfile=False):
- url = web.Url(APIROOT + "?method=" + self.method)
- url["api_key"] = APIKEY
- for param in self:
- url[param] = self[param]
- try:
- file = url.open()
- except:
- return None
- if file == None:
- return None
- if printfile==True:
- self.print_file(file)
- doc = xm.parse( file )
- lfm = xm.child(doc)
- if xm.attributes(lfm)["status"] == "ok":
- return xm.child(lfm)
- else:
- return None
-
-def lfm_cache_album(artist, album, title):
- req = LastFmRequest("album.getInfo")
- req["album"] = album
- req["artist"] = artist
- doc = req.place()
- if doc == None:
- return False
- node = pref_attr(doc, "image", "size", pref_sizes)
- node = xm.child(node)
- if node == None:
- return
- try:
- url = web.Url(node.data)
- text = url.open().read()
- return text
- except:
- pass
- return None
-
-def get_album_art(attrs):
- file = cache.get_item(attrs["artist"], attrs["album"], attrs["title"], "Folder.jpg", lfm_cache_album, "images/ocarina.png")
- if file != None:
- callbacks.get_art(file, attrs["id"])
-
-def get_artwork(attrs):
- threading.Thread(target=get_album_art, args=(attrs,)).start()
-
-def test_artwork(attrs):
- path = cache.test_item(attrs["artist"], attrs["album"], "Folder.jpg", "images/ocarina.png")
- if path == "images/ocarina.png":
- get_artwork(attrs)
- return path
-
-def set_artwork(artist, album, img_path):
- cache.copy_in_file(artist, album, "Folder.jpg", img_path)
diff --git a/libsaria/plugin.py b/libsaria/plugin.py
deleted file mode 100644
index 9cf99f03..00000000
--- a/libsaria/plugin.py
+++ /dev/null
@@ -1,106 +0,0 @@
-# Bryan Schumaker (8/15/2010)
-
-# Lazy loaded modules
-path = None
-imp = None
-
-# Runtime variables
-p_dir = None
-loaded = dict()
-
-# Function variables
-install = None
-load_all = None
-load_plugin = None
-
-
-def init():
- global path
- global p_dir
- if path == None:
- from libsaria import path
- if p_dir == None:
- p_dir = path.plugin_dir()
-
-def quit():
- global loaded
- for mod in loaded:
- try:
- loaded[mod].stop()
- except:
- pass
-
-
-def install_once(filepath):
- global install
- init()
- install = install_rest
- install(filepath)
-def install_rest(filepath):
- global p_dir
- global path
- split = filepath.rsplit(path.sep, 1)
- file = split[len(split)-1]
- dest = path.join(p_dir, file)
- path.cp(filepath, dest)
- split = path.splitext(file)
- if split[len(split)-1] == ".py":
- name = split[0]
- load_plugin(name, dest)
-install = install_once
-
-
-def load_all_once():
- global load_all
- init()
- load_all = load_all_rest
- load_all()
-def load_all_rest():
- global load_plugin
- global path
- global p_dir
- for file in path.ls(p_dir):
- split = path.splitext(file)
- if split[len(split)-1] == ".py":
- load_plugin(split[0], path.join(p_dir, file))
-load_all = load_all_once
-
-
-def load_plugin_once(name, file):
- global load_plugin
- global imp
- import imp
- load_plugin = load_plugin_rest
- load_plugin(name, file)
-def load_plugin_rest(name, file):
- global imp
- global path
- global loaded
-
- if name in loaded:
- mod = loaded[name]
- if hasattr(mod, "stop"):
- loaded[name].stop()
- del globals()[name]
-
- try:
- mod = imp.load_source(name, file)
- except Exception, e:
- print "Error loading plugin: %s" % file
- print e
-
- try:
- if mod.check_version() == False:
- print "Error: plugin %s requires a different version" % name
- return
- except:
- print "Warning: plugin %s doesn't check versions" % name
-
- try:
- globals()[name] = mod
- loaded[name] = mod
- mod.start()
- except Exception, e:
- print "Error starting plugin: %s" % file
- print e
-load_plugin = load_plugin_once
diff --git a/libsaria/prefs.py b/libsaria/prefs.py
deleted file mode 100644
index dec2fcbf..00000000
--- a/libsaria/prefs.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Bryan Schumaker (4 / 28 / 2011)
-
-import storage
-
-FILE = "preferences"
-prefs = storage.load_obj(FILE, dict)
-save_enable = False
-
-def save():
- if save_enable == True:
- storage.save_obj(FILE, prefs)
-
-def enable_save():
- global save_enable
- save_enable = True
- save()
-
-def get(key):
- return prefs.get(key, None)
-
-def set(key, value):
- prefs[key] = value
- save()
-
-def init(key, value):
- val = prefs.setdefault(key, value)
- save()
- return val
diff --git a/libsaria/server/__init__.py b/libsaria/server/__init__.py
deleted file mode 100644
index de383f9c..00000000
--- a/libsaria/server/__init__.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Bryan Schumaker (5 / 15 / 2011)
-
-from BaseHTTPServer import HTTPServer
-import threading
-
-from libsaria import prefs
-import request
-
-server = None
-PREF_KEY="libsaria.server.enabled"
-prefs.init(PREF_KEY, False)
-
-def setup_server():
- global server
- if prefs.get(PREF_KEY) == False:
- return
- try:
- server = HTTPServer(('', 4242), request.Handler)
- server.serve_forever()
- except Exception,e:
- print "Error starting server:", e
-
-def startup():
- threading.Thread(target=setup_server).start()
-startup()
-
-def shutdown():
- global server
- if server != None:
- server.shutdown()
- server = None
-
-def get_state():
- return prefs.get(PREF_KEY)
-
-def toggle_state(active):
- prefs.set(PREF_KEY, active)
- if active == True:
- startup()
- else:
- shutdown()
diff --git a/libsaria/server/files.py b/libsaria/server/files.py
deleted file mode 100644
index 5e1d60be..00000000
--- a/libsaria/server/files.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Bryan Schumaker (5 / 15 / 2011)
-
-import pages
-
-def format_path(path):
- if path == "/":
- path = "/index.html"
- path = path.split("/")
- return [cmp for cmp in path if cmp != '']
-
-def find_file(path):
- return pages.has_file(path)
-
-def get_type(path):
- return pages.file_type(path)
-
-def send_file(write, path):
- pages.page_text(write, path)
diff --git a/libsaria/server/pages/__init__.py b/libsaria/server/pages/__init__.py
deleted file mode 100644
index 801639b3..00000000
--- a/libsaria/server/pages/__init__.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Bryan Schumaker (5 / 15 / 2011)
-
-import root
-import rpc
-
-docs = {}
-docs.update(root.docs)
-docs.update(rpc.docs)
-
-types = {
- "html":"text/html",
- "js":"text/javascript",
-}
-
-def lookup(file):
- doc = docs
- for i, cmp in enumerate(file):
- doc = doc.get(cmp, None)
- if doc == None:
- break
- elif len(doc) == 2:
- break
- return doc, i + 1
-
-def has_file(file):
- doc, index = lookup(file)
- return doc != None
-
-def file_type(file):
- (func, type), index = lookup(file)
- return type
-
-def page_text(write, file):
- (func, type), index = lookup(file)
- if len(file) > index:
- res = func(write, file[index:])
- else:
- res = func(write)
diff --git a/libsaria/server/pages/root.py b/libsaria/server/pages/root.py
deleted file mode 100644
index 5870a242..00000000
--- a/libsaria/server/pages/root.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Bryan Schumaker (5 / 15 / 2011)
-
-from libsaria import sources
-
-SCRIPT = ""
-
-def write_file(write, file):
- f = open(file)
- write(f.read())
- f.close()
-
-def index(write):
- write_file(write, "html/index.html")
-
-def library(write):
- write("")
- write(SCRIPT % "controls.js")
- write(SCRIPT % "utils.js")
- write("\n")
- color = "white"
- get_attrs = sources.library.get_attrs
- for id in sources.library.list_ids():
- title, artist, album = get_attrs(id, "title", "artist", "album")
- write("" % (color, id))
- write("%s | " % (id, id, title))
- write("%s | %s | \n" % (artist, album))
- if color == "white":
- color = "aliceblue"
- else:
- color = "white"
- write(" ")
-
-def controls(write):
- write_file(write, "html/controls.js")
-
-def utils(write):
- write_file(write, "html/utils.js")
-
-docs = {
- "index.html":(index, "html"),
- "library.html":(library, "html"),
- "controls.js":(controls, "js"),
- "utils.js":(utils, "js"),
-}
diff --git a/libsaria/server/pages/rpc.py b/libsaria/server/pages/rpc.py
deleted file mode 100644
index 3ce557f6..00000000
--- a/libsaria/server/pages/rpc.py
+++ /dev/null
@@ -1,23 +0,0 @@
-# Bryan Schumaker (5 / 15 / 2011)
-
-from libsaria import sources
-from libsaria import controls
-
-def play(write):
- controls.play()
-
-def pause(write):
- controls.pause()
-
-def play_id(write, id):
- sources.play_id(long(id[0]))
-
-rpc = {
- "play.html":(play, "html"),
- "pause.html":(pause, "html"),
- "play_id":(play_id, "html"),
-}
-
-docs = {
- "RPC":rpc,
-}
diff --git a/libsaria/server/request.py b/libsaria/server/request.py
deleted file mode 100644
index 12a67cdf..00000000
--- a/libsaria/server/request.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# Bryan Schumaker (5 / 15 / 2011)
-
-from BaseHTTPServer import BaseHTTPRequestHandler
-import files
-
-class Handler(BaseHTTPRequestHandler):
- def do_GET(self):
- path = files.format_path(self.path)
- if not files.find_file(path):
- self.send_error(404, "File Not Found: %s" % path)
- return
-
- type = files.get_type(path)
- self.send_response(200)
- self.send_header('Content-type', type)
- self.end_headers()
-
- files.send_file(self.wfile.write, path)
- self.wfile.close()
diff --git a/libsaria/sources/__init__.py b/libsaria/sources/__init__.py
deleted file mode 100644
index 8aed06d7..00000000
--- a/libsaria/sources/__init__.py
+++ /dev/null
@@ -1,137 +0,0 @@
-# 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
-import attrs
-
-attrs.load_dattrs()
-cur_id = None
-
-def get_cur_id():
- return cur_id
-
-def inc_count():
- attrs.inc_count(get_cur_id())
-
-def find_attrs(file, *attr_list):
- if file == None:
- return
- track = library.track.Track(file)
- if track == None:
- return
- id = library.update.song_id(file)
- get = track.__dict__.get
- res = []
- for attr in attr_list:
- if attr == "id":
- res.append(id)
- elif attr == "like":
- res.append(attrs.get_dattr(id, "like"))
- elif attr == "count":
- res.append(attrs.get_count(id))
- else:
- res.append(get(attr))
- return res
-
-def find_all_attrs(file, attrs):
- if file == None:
- return False
- track = library.track.Track(file)
- if track == None:
- return False
- id = library.update.song_id(file)
- attrs.update(track.__dict__)
- attrs["id"] = id
-
-# 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...
- global cur_id
- res = None
- if cur_id:
- res = get_attrs_id(cur_id, *attrs)
- if res == None:
- cur_id = None
- file = libsaria.audio.get_cur_file()
- res = find_attrs(file, *attrs)
- if res == None:
- res = [None] * len(attrs)
- return res
-
-def all_attrs():
- global cur_id
- res = {}
- found = False
- if cur_id:
- found = library.all_attrs(cur_id, res)
- if found == False:
- cur_id = None
- file = libsaria.audio.get_cur_file()
- found = find_all_attrs(file, res)
- if found != False:
- res["like"] = attrs.get_like(res["id"])
- res["count"] = attrs.get_count(res["id"])
- res["art"] = libsaria.path.lastfm.test_artwork(res)
- 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):
- id = get_cur_id()
- if id:
- attrs.set_dattr(id, attr, value)
-
-def make_library(path):
- path = expand(path)
- if not exists(path):
- return
- library.add_path(path)
- library.update_lib()
-
-def play_id(id):
- global cur_id
- cur_id = id
- file = all_attrs()["filepath"]
- 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 all_attrs()["filepath"]
-
-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)
diff --git a/libsaria/sources/attrs.py b/libsaria/sources/attrs.py
deleted file mode 100644
index f53a3e30..00000000
--- a/libsaria/sources/attrs.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Bryan Schumaker (5 / 28 / 2011)
-
-import threading
-from libsaria import storage
-dattrs_lock = threading.Lock()
-lock_dattrs = dattrs_lock.acquire
-unlock_dattrs = dattrs_lock.release
-
-# dynamic attributes
-dattrs = dict()
-
-def load_dattrs():
- global dattrs
- dattrs_dict = storage.load_obj("dattrs", dict)
- lock_dattrs()
- dattrs = dattrs_dict
- unlock_dattrs()
-
-def save_dattrs():
- storage.save_obj("dattrs", dattrs)
-
-def get_dattr(id, attribute):
- lock_dattrs()
- attrs = dattrs.get(id, None)
- if attrs == None:
- unlock_dattrs()
- return None
- attr = attrs.get(attribute, None)
- unlock_dattrs()
- return attr
-
-def set_dattr(id, attribute, value):
- lock_dattrs()
- attrs = dattrs.setdefault(id, dict())
- attrs[attribute] = value
- save_dattrs()
- unlock_dattrs()
-
-def get_like(id):
- return get_dattr(id, "like")
-
-def get_count(id):
- count = get_dattr(id, "count")
- if count != None:
- return count
- return 0
-
-def inc_count(id):
- count = get_count(id)
- set_dattr(id, "count", count + 1)
diff --git a/libsaria/sources/library/__init__.py b/libsaria/sources/library/__init__.py
deleted file mode 100644
index 0a81ab14..00000000
--- a/libsaria/sources/library/__init__.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Bryan Schumaker (5 / 20 / 2011)
-
-import libsaria
-import library
-import update
-import tree
-import index
-
-# Function pointers for conveniance
-add_path = library.add_path
-list_paths = library.list_paths
-get_attrs = library.get_attrs
-all_attrs = library.all_attrs
-list_ids = tree.list_ids
-filter = index.filter
-is_visible = index.is_visible
-num_visible = index.num_visible
-
-library.load()
-tree.make_tree()
-index.reindex()
-
-def refresh():
- tree.make_tree()
- index.reindex()
- libsaria.callbacks.library_updated()
-
-def update_lib():
- update.update()
- refresh()
-
-def rm_path(path):
- library.rm_path(path)
- refresh()
-
-def reset():
- library.reset()
- refresh()
diff --git a/libsaria/sources/library/index.py b/libsaria/sources/library/index.py
deleted file mode 100644
index 08109c64..00000000
--- a/libsaria/sources/library/index.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Bryan Schumaker (5 / 21 / 2011)
-
-import re
-import string
-import library
-
-lib_index = dict()
-all_ids = set()
-matching = set()
-search = re.search
-
-space_ord = ord(" ")
-stripc = u"\"#$%&'*+<=>@[]^`{|}~.?!"
-splitc = u"-\/,:;()_~+"
-upper = string.uppercase
-lower = string.lowercase
-
-# Create a translation table for formatting text
-ttable = dict((ord(c), None) for c in stripc)
-splitt = dict((ord(c), space_ord) for c in splitc)
-lowert = dict((ord(c), ord(lower[i])) for i, c in enumerate(upper))
-for t in (splitt, lowert):
- for c in t:
- ttable[c] = t[c]
-
-def reset():
- global lib_index
- global all_ids
- lib_index = dict()
- all_ids = set()
-
-def format(text):
- return text.translate(ttable).split()
-
-def add_to_index(id, text):
- for word in format(text):
- if lib_index.get(word) == None:
- lib_index[word] = set([id])
- else:
- lib_index[word].add(id)
-
-def add_tracks(tracks):
- for id, track in tracks.iteritems():
- all_ids.add(id)
- add_to_index(id, track.artist)
- add_to_index(id, track.album)
- add_to_index(id, track.title)
-
-def reindex():
- global matching
- reset()
- for src, tracks in library.lib_dict.iteritems():
- add_tracks(tracks)
- matching = all_ids
-
-def is_visible(id):
- return id in matching
-
-def num_visible():
- return len(matching)
-
-def do_filter(terms):
- if len(terms) == 0:
- return all_ids
-
- get = lib_index.get
- results = dict((t, set()) for t in terms)
- for key in lib_index.keys():
- for term in terms:
- if search(term, key):
- results[term].update(get(key))
-
- visible = set()
- for i, t in enumerate(terms):
- if i == 0:
- visible.update(results[t])
- else:
- visible.intersection_update(results[t])
- return visible
-
-def filter(text):
- global matching
- text = unicode(text)
- terms = format(text)
- matching = do_filter(terms)
- return matching
diff --git a/libsaria/sources/library/library.py b/libsaria/sources/library/library.py
deleted file mode 100644
index 0b1a5009..00000000
--- a/libsaria/sources/library/library.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# Bryan Schumaker (5 / 20 / 2011)
-
-import threading
-from libsaria import storage
-from libsaria.sources import attrs
-
-library_lock = threading.Lock()
-lock_library = library_lock.acquire
-unlock_library = library_lock.release
-get_dattr = attrs.get_dattr
-get_count = attrs.get_count
-
-# Map directory -> dict()
-lib_dict = None
-LIB_FILE = "library"
-
-def load():
- global lib_dict
- saved_lib = storage.load_obj(LIB_FILE, dict)
- if saved_lib.__class__ != dict:
- saved_lib = dict()
- lock_library()
- lib_dict = saved_lib
- unlock_library()
-
-# NOTE: You should already be holding the lock when you call this
-def save():
- storage.save_obj(LIB_FILE, lib_dict)
-
-def reset():
- global lib_dict
- lock_library()
- lib_dict = {}
- save()
- unlock_library()
-
-def add_path(path):
- lock_library()
- lib_dict.setdefault(path, dict())
- unlock_library()
-
-def rm_path(path):
- lock_library()
- del lib_dict[path]
- save()
- unlock_library()
-
-def list_paths():
- res = []
- lock_library()
- for path, lib in lib_dict.iteritems():
- res.append((path, lib))
- unlock_library()
- return res
-
-def find_id(id):
- for src, tracks in lib_dict.iteritems():
- track = tracks.get(id, None)
- if track != None:
- return track
-
-def size():
- res = 0
- lock_library()
- for src, tracks in lib_dict.iteritems():
- res += len(tracks)
- unlock_library()
- return res
-
-def get_attrs(id, *attrs):
- lock_library()
- track = find_id(id)
- if track == None:
- unlock_library()
- return None
-
- get = track.__dict__.get
- res = []
- for attr in attrs:
- if attr == "id":
- res.append(id)
- elif attr == "like":
- res.append(get_dattr(id, attr))
- elif attr == "count":
- res.append(get_count(id))
- else:
- res.append(get(attr))
- unlock_library()
- return res
-
-def all_attrs(id, attrs):
- lock_library()
- found = False
- track = find_id(id)
- if track != None:
- attrs.update(track.__dict__)
- attrs["id"] = id
- found = True
- unlock_library()
- return found
diff --git a/libsaria/sources/library/track.py b/libsaria/sources/library/track.py
deleted file mode 100644
index d685fa4c..00000000
--- a/libsaria/sources/library/track.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Bryan Schumaker (5 / 21 / 2011)
-
-import tagpy
-import datetime
-
-FileRef = tagpy.FileRef
-timedelta = datetime.timedelta
-
-class Track:
- def __init__(self, filepath):
- ref = FileRef(filepath)
- tags = ref.tag()
- audio = ref.audioProperties()
-
- self.artist = tags.artist or u"Unknown Artist"
- self.album = tags.album or u"Unknown Album"
- self.title = tags.title or u"Unknown Title"
- self.track = tags.track
- self.genre = tags.genre
- self.year = tags.year
- self.seconds = audio.length
- self.filepath = filepath
-
- lenstr = "%s" % timedelta(seconds=self.seconds)
- if lenstr[:2] == "0:":
- self.lenstr = lenstr[2:]
- else:
- self.lenstr = lenstr
diff --git a/libsaria/sources/library/tree.py b/libsaria/sources/library/tree.py
deleted file mode 100644
index 5ce5d73a..00000000
--- a/libsaria/sources/library/tree.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Bryan Schumaker (2 / 12 / 2011)
-
-import string
-import library
-ttable = dict()
-for s in string.punctuation:
- ttable[ord(s)] = u""
-for s in string.lowercase:
- ttable[ord(s)] = ord(s) - 32
-
-class Tree(dict):
- def __init__(self):
- dict.__init__(self)
-
- def walk(self):
- keys = self.keys()
- keys.sort()
-
- for key in keys:
- child = self[key]
- if len(child.keys()) == 0:
- yield key
- continue
- for res in child.walk():
- yield res
-
- def __insert__(self, path):
- path_part = path[0]
- child = self.get(path_part, None)
- if child == None:
- child = self.__class__()
- self[path_part] = child
- return child
-
- def insert(self, path):
- child = self.__insert__(path)
- if len(path) > 1:
- child.insert(path[1:])
-
-
-lib_tree = None
-
-def list_ids():
- for id in lib_tree.walk():
- yield id
-
-def add_tracks(tracks):
- for id, track in tracks.iteritems():
- artist = track.artist.translate(ttable)
- album = track.album.translate(ttable)
- lib_tree.insert([artist, album, track.track, id])
-
-def make_tree():
- global lib_tree
- lib_tree = Tree()
- for src, tracks in library.lib_dict.iteritems():
- add_tracks(tracks)
diff --git a/libsaria/sources/library/update.py b/libsaria/sources/library/update.py
deleted file mode 100644
index deccb2a7..00000000
--- a/libsaria/sources/library/update.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Bryan Schumaker (5 / 21 / 2011)
-
-import os
-
-import library
-import track
-
-stat = os.stat
-walk = os.walk
-join = os.path.join
-
-Track = track.Track
-
-def song_id(path):
- return stat(path).st_ino
-
-def scan_path(path):
- file_map = dict()
- for root, dir, files in walk(path):
- for file in files:
- file = join(root, file)
- file_map[song_id(file)] = file
- return file_map
-
-def rm_old_ids(old_ids, new_ids, tracks):
- to_remove = old_ids - new_ids
- for id in to_remove:
- del tracks[id]
-
-def add_new_ids(old_ids, new_ids, tracks, file_map):
- to_add = new_ids - old_ids
- for id in to_add:
- try:
- fpath = file_map[id]
- tracks[id] = Track(fpath)
- except Exception, e:
- pass
-
-def update_path(path, tracks):
- file_map = scan_path(path)
- old_ids = set(tracks.keys())
- new_ids = set(file_map.keys())
-
- rm_old_ids(old_ids, new_ids, tracks)
- add_new_ids(old_ids, new_ids, tracks, file_map)
-
-def update():
- library.lock_library()
- for path, lib in library.lib_dict.iteritems():
- print "Updating path:", path
- update_path(path, lib)
- print "Done!"
- library.save()
- library.unlock_library()
diff --git a/libsaria/sources/playlist/__init__.py b/libsaria/sources/playlist/__init__.py
deleted file mode 100644
index 869ef96a..00000000
--- a/libsaria/sources/playlist/__init__.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Bryan Schumaker (11/07/2010)
-
-import libsaria
-import playlist
-import next
-
-# Function pointers for convenience
-add_ids = playlist.add_ids
-
-playlist.load()
-visible = playlist.as_set()
-
-def add_ids(ids):
- for id in ids:
- if libsaria.sources.is_visible(id):
- visible.add(id)
- playlist.add_ids(ids)
-
-def rm_ids(ids):
- global visible
- visible = visible - set(ids)
- playlist.rm_ids(ids)
-
-def reset():
- global visible
- visible = set()
- playlist.reset()
-
-def list_ids():
- for id in playlist.song_list:
- yield id
-
-def set_visible(vset):
- global visible
- visible = playlist.as_set().intersection(vset)
-
-def num_visible():
- return len(visible)
-
-def get_next(cur_id):
- id = None
- if libsaria.prefs.get("libsaria.random") == True:
- index = next.rand_next(list(visible))
- else:
- index = next.seq_next(cur_id)
- if index != None:
- id = playlist.get(index)
- if id != None:
- artist, title = libsaria.sources.get_attrs_id(id, "artist", "title")
- next.track_recent(artist, title)
- return id
diff --git a/libsaria/sources/playlist/next.py b/libsaria/sources/playlist/next.py
deleted file mode 100644
index 6003e83f..00000000
--- a/libsaria/sources/playlist/next.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Bryan Schumaker (5 / 14 / 2011)
-
-import random
-import playlist
-import libsaria
-
-recent = []
-
-def track_recent(artist, title):
- recent.append((artist, title))
- if len(recent) > 50:
- recent.pop(0)
-
-def incr_index(cur_index, max_index):
- cur_index += 1
- if cur_index == max_index:
- cur_index = 0
- return cur_index
-
-def seq_next(cur_id):
- is_visible = libsaria.sources.is_visible
-
- max = playlist.size()
- if max == 0: # List is empty
- return
-
- index = playlist.index(cur_id)
- index = incr_index(index, max)
- while not is_visible(playlist.get(index)):
- index = incr_index(index, max)
- return index
-
-def check_candidate(id):
- (artist, title, like) = libsaria.sources.get_attrs_id(id, "artist", "title", "like")
- if (artist, title) in recent:
- return False
- if like == False:
- return False
- return True
-
-def rand_next(list):
- max = len(list) - 1
- if max == -1: # List is empty
- return
- for i in xrange(15):
- index = random.randint(0, max)
- id = list[index]
- if check_candidate(id) == True:
- break
- return playlist.index(id)
diff --git a/libsaria/sources/playlist/playlist.py b/libsaria/sources/playlist/playlist.py
deleted file mode 100644
index a69dd2f7..00000000
--- a/libsaria/sources/playlist/playlist.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# Bryan Schumaker (5 / 11 / 2011)
-# TODO: Split this file into two files, similiar to how audio is broken up
-
-import threading
-from libsaria import storage
-plist_lock = threading.Lock()
-lock_plist = plist_lock.acquire
-unlock_plist = plist_lock.release
-
-# Playlist
-song_list = []
-song_set = set()
-
-def load():
- global song_list
- plist_list = storage.load_obj("playlist", list)
- # TODO: Can I do this check during load_obj???
- if plist_list.__class__ != list:
- plist_list = []
- lock_plist()
- song_list = plist_list
- unlock_plist()
-
-# NOTE: You should already be holding the lock when you call this
-def save():
- storage.save_obj("playlist", song_list)
-
-def reset():
- global song_list
- lock_plist()
- song_list = []
- save()
- unlock_plist()
-
-def add_ids(id_list):
- lock_plist()
- song_list.extend(id_list)
- save()
- unlock_plist()
-
-def rm_ids(id_list):
- lock_plist()
- for id in id_list:
- if id in song_list:
- song_list.remove(id)
- save()
- unlock_plist()
-
-def as_set():
- lock_plist()
- song_set = set(song_list)
- unlock_plist()
- return song_set
-
-def size():
- lock_plist()
- sz = len(song_list)
- unlock_plist()
- return sz
-
-def index(item):
- lock_plist()
- try:
- idx = song_list.index(item)
- except:
- idx = -1
- unlock_plist()
- return idx
-
-def get(index):
- lock_plist()
- try:
- item = song_list[index]
- except:
- item = None
- unlock_plist()
- return item
diff --git a/libsaria/sources/queue/__init__.py b/libsaria/sources/queue/__init__.py
deleted file mode 100644
index baa26689..00000000
--- a/libsaria/sources/queue/__init__.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# Bryan Schumaker (12/12/2010)
-
-import libsaria
-from libsaria import callbacks
-import queue
-
-visible = set()
-
-def rm_ids(ids):
- global visible
- visible = visible - set(ids)
- queue.rm_ids(ids)
-
-def reset():
- global visible
- visible = set()
- queue.reset()
-
-def list_ids():
- for id in queue.queue_list:
- yield id
-
-def add_ids(id_list):
- queue.add_ids(id_list)
- for id in id_list:
- if libsaria.sources.is_visible(id):
- visible.add(id)
- callbacks.queue_changed()
-
-def set_visible(vset):
- global visible
- visible = queue.as_set().intersection(vset)
-
-def num_visible():
- return len(visible)
-
-def next():
- id = queue.pop()
- if id != None:
- visible.remove(id)
- return id
-
diff --git a/libsaria/sources/queue/queue.py b/libsaria/sources/queue/queue.py
deleted file mode 100644
index 839643c6..00000000
--- a/libsaria/sources/queue/queue.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Bryan Schumaker (5 / 7 / 2011)
-
-import threading
-from libsaria import callbacks
-queue_lock = threading.Lock()
-lock_queue = queue_lock.acquire
-unlock_queue = queue_lock.release
-
-# List of queued songs
-queue_list = []
-
-def add_ids(id_list):
- lock_queue()
- queue_list.extend(id_list)
- unlock_queue()
-
-def rm_ids(id_list):
- lock_queue()
- for id in id_list:
- if id in queue_list:
- queue_list.remove(id)
- unlock_queue()
- callbacks.queue_changed()
-
-def pop():
- lock_queue()
- id = None
- if len(queue_list) > 0:
- id = queue_list.pop(0)
- unlock_queue()
- callbacks.queue_changed()
- return id
-
-def reset():
- global queue_list
- lock_queue()
- queue_list = []
- unlock_queue()
-
-def as_set():
- lock_queue()
- song_set = set(queue_list)
- unlock_queue()
- return song_set
diff --git a/libsaria/storage/__init__.py b/libsaria/storage/__init__.py
deleted file mode 100644
index 80645877..00000000
--- a/libsaria/storage/__init__.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Bryan Schumaker (4 / 28 / 2011)
-
-import os
-from os import path
-import cPickle as pickle
-from libsaria import version
-import cache
-
-USER_DIR = path.expanduser("~")
-PROTO = pickle.HIGHEST_PROTOCOL
-
-saria = ".saria"
-if version.__dev__ == True:
- saria = ".saria-dev"
-SARIA_DIR = path.join(USER_DIR, saria)
-if path.exists(SARIA_DIR) == False:
- os.mkdir(SARIA_DIR)
-cache.set_basedir(SARIA_DIR)
-
-def full_path(filename):
- return path.join(SARIA_DIR, filename)
-
-def save_obj(filename, object):
- f = open(full_path(filename), 'w')
- p = pickle.Pickler(f, PROTO)
- p.dump(object)
- f.close()
-
-def load_obj(filename, default):
- file = full_path(filename)
- if path.exists(file) == False:
- return default()
- f = open(file)
- try:
- object = pickle.loads(f.read())
- except:
- object = default()
- f.close()
- return object
diff --git a/libsaria/storage/cache.py b/libsaria/storage/cache.py
deleted file mode 100644
index 4f9128f8..00000000
--- a/libsaria/storage/cache.py
+++ /dev/null
@@ -1,59 +0,0 @@
-# Bryan Schumaker (5 / 6 / 2011)
-
-import os
-join = os.path.join
-sep = os.path.sep
-isfile = os.path.isfile
-isdir = os.path.isdir
-getsize = os.path.getsize
-CACHE_DIR = None
-
-def set_basedir(saria_dir):
- global CACHE_DIR
- CACHE_DIR = join(saria_dir, "cache")
-
-def file_exists(cache_path):
- if not isfile(cache_path):
- return False
- return getsize(cache_path) != 0
-
-def make_cache_path(artist, album, file):
- cache_file = "%s%s%s%s" % (artist, sep, album, sep)
- cache_path = join(CACHE_DIR, cache_file)
- if not isdir(cache_path):
- os.makedirs(cache_path)
- return join(cache_path, file)
-
-def fill_cache(artist, album, title, cache_func, cache_path):
- text = cache_func(artist, album, title)
- if text != None:
- try:
- f = open(cache_path, 'w')
- f.write(text)
- f.close()
- except:
- pass
- return True
- return False
-
-def get_item(artist, album, title, file, cache_func, default):
- cache_path = make_cache_path(artist, album, file)
- filled = True
- if not file_exists(cache_path):
- filled = fill_cache(artist, album, title, cache_func, cache_path)
- if filled == False:
- return default
- return cache_path
-
-def test_item(artist, album, file, default):
- cache_path = make_cache_path(artist, album, file)
- if not file_exists(cache_path):
- return default
- return cache_path
-
-def copy_in_file(artist, album, file, orig_file):
- cache_path = make_cache_path(artist, album, file)
- orig = open(orig_file)
- f = open(cache_path, 'w')
- f.write(orig.read())
- f.close()
diff --git a/libsaria/trees.py b/libsaria/trees.py
deleted file mode 100644
index 1add8047..00000000
--- a/libsaria/trees.py
+++ /dev/null
@@ -1,192 +0,0 @@
-# Bryan Schumaker (11/06/2010)
-
-from libsaria.path import files
-from libsaria.path import sep
-
-class Tree(dict):
- def __init__(self):
- dict.__init__(self)
-
- def __len__(self):
- count = 0;
- for path in self.walk():
- count += 1
- return count
-
- def __disp__(self, child, level):
- return "%s", child
-
- def disp(self, level = 0):
- for child in self:
- space = " " * level
- fmt, vals = self.__disp__(child, level)
- print space, fmt % vals
- self[child].disp(level + 1)
-
- def walk(self):
- keys = self.keys()
- keys.sort()
-
- for key in keys:
- child = self[key]
- if len(child.keys()) == 0:
- yield [key]
- continue
- for res in child.walk():
- yield [key] + res
-
- def __insert__(self, path):
- path_part = path[0]
- child = self.get(path_part, None)
- if child == None:
- child = self.__class__()
- self[path_part] = child
- return child
-
- def insert(self, path):
- child = self.__insert__(path)
- if len(path) > 1:
- child.insert(path[1:])
-
- def lookup(self, path):
- child = self.get(path[0], None)
- if child == None:
- return child
- if len(path) > 1:
- return child.lookup(path[1:])
- return child.keys()
-
- def lookup_child(self, path):
- child = self.get(path[0], None)
- if child == None:
- return child
- if len(path) > 1:
- return child.lookup_child(path[1:])
- return child
-
-
-class DLTree(Tree):
- def __init__(self):
- Tree.__init__(self)
- self.parent = None
-
- def walk_backwards(self, child = None):
- key = None
- if child != None:
- idc = id(child)
- key = [i[0] for i in self.items() if id(i[1]) == idc]
- if self.parent == None:
- return key
- ret = self.parent.walk_backwards(self)
- if key:
- return ret + key
- else:
- return ret
-
- def insert(self, path):
- child = self.__insert__(path)
- child.parent = self
- if len(path) > 1:
- return child.insert(path[1:])
- return child
-
-
-class FSTree(Tree):
- def __init__(self):
- Tree.__init__(self)
-
- def walk_paths(self):
- for path in self.walk():
- yield sep.join(path)
-
- def insert_path(self, base, file = None):
- path = base.split(sep)
- self.insert_path_split(path, file)
-
- def insert_path_split(self, base, file = None):
- if file == None:
- self.insert(base)
- else:
- self.insert(base + [file])
-
-
-class DLFSTree(DLTree, FSTree):
- def __init__(self):
- DLTree.__init__(self)
- FSTree.__init__(self)
-
- def walk_path_backwards(self):
- return sep.join( self.walk_backwards() )
-
- def insert_path(self, base, file = None):
- path = base.split(sep)
- return self.insert_path_split(path, file)
-
- def insert_path_split(self, base, file = None):
- if file == None:
- child = self.insert(base)
- else:
- child = self.insert(base + [file])
- return child
-
-
-class ValTree(Tree):
- def __init__(self):
- Tree.__init__(self)
- self.value = None
-
- def __disp__(self, child, level):
- return "%s (%s)", (child, self[child].value)
-
- def __walk_vals__(self, path):
- node = self
- res = []
- for key in path:
- node = node[key]
- res.append(node.value)
- return res
-
- def walk_vals(self):
- for path in self.walk():
- yield self.__walk_vals__(path)
-
- def insert(self, path, values):
- child = self.__insert__(path)
- if len(values) > 0:
- child.value = values[0]
- vals = values[1:]
- else:
- vals = values
- if len(path) > 1:
- child.insert(path[1:], values[1:])
-
-
-class DLValTree(DLTree, ValTree):
- def __init__(self):
- DLTree.__init__(self)
- ValTree.__init__(self)
-
- def walk_vals_backwards(self, child = None):
- key = None
- if child != None:
- idc = id(child)
- key = [i[0] for i in self.items() if id(i[1]) == idc]
- if self.parent == None:
- return [self[key[0]].value]
- ret = self.parent.walk_vals_backwards(self)
- if key:
- return ret + [self[key[0]].value]
- else:
- return ret
-
- def insert(self, path, values):
- child = self.__insert__(path)
- child.parent = self
- if len(values) > 0:
- child.value = values[0]
- vals = values[1:]
- else:
- vals = values
- if len(path) > 1:
- return child.insert(path[1:], vals)
- return child
diff --git a/libsaria/version.py b/libsaria/version.py
deleted file mode 100644
index 21f3d889..00000000
--- a/libsaria/version.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# Bryan Schumaker (5 / 6 / 2011)
-
-__major__ = 4
-__minor__ = 9
-__bug__ = 0
-__dev__ = False
-
-__vstr__ = "%s.%s" % (__major__, __minor__)
-if __bug__ > 0:
- __vstr__ = "%s.%s" % (__vstr__, __bug__)
-if __dev__ == True:
- __vstr__ += "-dev"
-__vers__ = "Libsaria %s" % __vstr__
diff --git a/libsaria/web.py b/libsaria/web.py
deleted file mode 100644
index e3bd9d36..00000000
--- a/libsaria/web.py
+++ /dev/null
@@ -1,38 +0,0 @@
-# Bryan Schumaker (10/24/2010)
-
-from libsaria import version
-import urllib2
-import string
-
-HEADER = version.__vers__
-
-#vals = [ ('%','25'), (' ','20'), ('&','26'), ('<','3C'), ('>','3E'),
-# ('"','22'), ('#','23'), ('$','24'), ('+', '2B'), ('\'','27'), #('+','2B'),
-# (',','2C'), ('/','2F'), (':','3A'), ('[','5B'), (']','5D')]
-vals = [ (' ','20'), ('&','26'), ('\'', '27') ]
-
-
-class Url:
- def __init__(self, url):
- self.url = url
-
- def __setitem__(self, key, value):
- value = escape(value)
- self.url += "&" + key + "=" + value
-
- def open(self):
- print self.url
- try:
- req = urllib2.Request(self.url)
- req.add_header('User-Agent', HEADER)
- return urllib2.urlopen(req)
- except Exception, e:
- print e
- return None
-
-
-def escape(string):
- for l in vals:
- string = string.replace(l[0], "%s%s" % ('%', l[1]))
- return string
-
diff --git a/libsaria/xm.py b/libsaria/xm.py
deleted file mode 100644
index 742bb679..00000000
--- a/libsaria/xm.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# Bryan Schumaker (10/24/2010)
-
-import xml.dom.minidom as xml
-
-def attributes(node):
- attrs = dict()
- for i in range(node.attributes.length):
- item = node.attributes.item(i)
- attrs[item.name] = item.nodeValue
- return attrs
-
-def children(doc):
- list = []
- for node in doc.childNodes:
- if node.nodeType == node.TEXT_NODE:
- if node.data.strip() == "":
- continue
- list += [node]
- return list
-
-def child(doc):
- list = children(doc)
- if len(list) > 0:
- return list[0]
- return None
-
-def check_type(value):
- if value.__class__ == unicode:
- return value.encode("utf-8")
- return str(value)
-
-def add_child(doc, node, name, attrs = {}):
- child = doc.createElement(name)
- for attr in attrs:
- value = check_type(attrs[attr])
- child.setAttribute(attr, value)
- node.appendChild(child)
- return child
-
-def add_text(doc, node, value):
- value = check_type(value)
- try:
- child = doc.createTextNode( value )
- node.appendChild(child)
- return value
- except Exception, e:
- print e
- print value, value.__class__
-
-def get_elements(doc, tag):
- return doc.getElementsByTagName(tag)
-
-def find_attribute(doc, tag, attr, value):
- for node in get_elements(doc, tag):
- if attributes(node)[attr] == value:
- return node
- return None
-
-def find_preferred_attribute(doc, tag, attr, values):
- for value in values:
- attr = find_attribute(doc, tag, attr, value)
- if attr:
- return attr
- None
-
-def new():
- return xml.Document()
-
-def parse(xml_file):
- return xml.parse(xml_file)
diff --git a/ocarina/__init__.py b/ocarina/__init__.py
deleted file mode 100644
index 0044fba9..00000000
--- a/ocarina/__init__.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Bryan Schumaker (8/13/2010)
-
-import datetime
-now = datetime.datetime.now
-__start__ = now()
-
-import gtk
-import gobject
-gobject.threads_init()
-
-import libsaria
-__vers__ = "Ocarina %s" % libsaria.version.__vstr__
-
-def uptime():
- return now() - __start__
-
-def quit(window, event):
- gtk.main_quit()
- libsaria.shutdown()
- print "Ocarina ran for:", uptime()
-
-import window
-import playlist
-import queue
-import library
-import settings
-import callbacks
-
-def run():
- import body
- body.footer.set_art("images/ocarina.png")
- libsaria.startup()
- print "Startup took:", uptime()
- gtk.main()
diff --git a/ocarina/body/__init__.py b/ocarina/body/__init__.py
deleted file mode 100644
index 579f15a6..00000000
--- a/ocarina/body/__init__.py
+++ /dev/null
@@ -1,62 +0,0 @@
-# Bryan Schumaker (11/24/2010)
-
-import gtk
-from page import OcarinaPage
-from ocarina import shortcuts
-
-body = gtk.Notebook()
-body.show()
-body.set_tab_pos(gtk.POS_LEFT)
-page_num = body.page_num
-
-def add_page(content, page_name):
- label = gtk.Label(page_name)
- label.set_angle(90)
- page = OcarinaPage(content, label)
- body.append_page(page, label)
- body.set_tab_label_packing(page, True, True, gtk.PACK_START)
- n = body.get_n_pages()
- if n == 1:
- page.visible()
- elif n == 2:
- body.connect("switch-page", switch_page)
- return page
-
-def remove_page(page):
- page.invisible()
- page.rm_content()
- body.remove_page(page_num(page))
-
-def current_page():
- cur_num = body.get_current_page()
- return body.get_nth_page(cur_num)
-
-def switch_to_page_n(n):
- body.set_current_page(n)
-
-def switch_to_page(page):
- switch_to_page_n(page_num(page))
-
-def switch_page(notebook, page, pagenum):
- cur_pg = current_page()
- next_pg = body.get_nth_page(pagenum)
- cur_pg.invisible()
- next_pg.visible()
-
-def hide_page(page):
- n = page_num(page)
- if n > 0:
- switch_to_page_n(n - 1)
- page.hide()
-
-def show_page(page, switch = False):
- page.show()
- if switch == True:
- switch_to_page(page)
-
-def cur_page_goto():
- current_page().goto()
-shortcuts.register_shortcut("g", cur_page_goto)
-
-def cur_page_clear():
- current_page().clear()
diff --git a/ocarina/body/button.py b/ocarina/body/button.py
deleted file mode 100644
index af4e23ad..00000000
--- a/ocarina/body/button.py
+++ /dev/null
@@ -1,161 +0,0 @@
-# Bryan Schumaker (2 / 20 / 2011)
-
-import gtk
-from libsaria.path import files
-from libsaria import controls
-from libsaria import sources
-from ocarina import fsselect
-
-SIZE = gtk.ICON_SIZE_MENU
-
-def on_click(button, func):
- func()
-
-def on_toggle(button, func):
- func(button.get_active())
-
-def stock_image(stock_item):
- img = gtk.image_new_from_stock(stock_item, SIZE)
- return img
-
-def file_image(file):
- img = gtk.image_new_from_file(file)
- return img
-
-def make_text(text):
- lbl = gtk.Label(text)
- lbl.show()
- return lbl
-
-def default_button_attrs(button, img, tooltip, show):
- button.set_relief(gtk.RELIEF_NONE)
- if img != None:
- img.show()
- button.add(img)
- if tooltip != None:
- button.set_tooltip_text(tooltip)
- if show == True:
- button.show()
-
-def make_button(stock_item, func, tooltip, show):
- b = gtk.Button()
- b.connect("clicked", on_click, func)
- default_button_attrs(b, stock_image(stock_item), tooltip, show)
- return b
-
-def toggle_connect(button, func):
- button.t_id = button.connect("toggled", on_toggle, func)
- button.t_func = func
-
-def toggle_call_unconnected(button, func, *args):
- button.disconnect(button.t_id)
- func(*args)
- toggle_connect(button, button.t_func)
-
-def make_toggle(img_file, func, tooltip, is_active, show):
- b = gtk.ToggleButton()
- b.set_active(is_active)
- toggle_connect(b, func)
- default_button_attrs(b, file_image(img_file), tooltip, show)
- return b
-
-
-def rewind_button(show):
- return make_button(gtk.STOCK_MEDIA_REWIND, controls.seek_backward, "Rewind", show)
-
-def forward_button(show):
- return make_button(gtk.STOCK_MEDIA_FORWARD, controls.seek_forward, "Fast Forward", show)
-
-def play_button(show):
- return make_button(gtk.STOCK_MEDIA_PLAY, controls.play, "Play", show)
-
-def pause_button(show):
- return make_button(gtk.STOCK_MEDIA_PAUSE, controls.pause, "Pause", show)
-
-def stop_button(show):
- return make_button(gtk.STOCK_MEDIA_STOP, controls.stop, "Stop", show)
-
-def next_button(show):
- return make_button(gtk.STOCK_MEDIA_NEXT, controls.next, "Next", show)
-
-def update_button(show):
- return make_button(gtk.STOCK_REFRESH, sources.library.update_lib, "Update Library", show)
-
-def open_button(show):
- def open_func():
- fsselect.run_chooser2(files.universal_open)
- return make_button(gtk.STOCK_OPEN, open_func, "Open Anything", show)
-
-def save_button(show):
- def save_func():
- loc = fsselect.select_save()
- if loc != None:
- from libsaria.path import export
- export.save_playlist(loc)
- return make_button(gtk.STOCK_SAVE, save_func, "Save Current Playlist", show)
-
-def prefs_button(show):
- def prefs_func():
- from ocarina import settings
- settings.show_page()
- return make_button(gtk.STOCK_PREFERENCES, prefs_func, "Modify Settings", show)
-
-def up_button(show):
- def up_func():
- from ocarina.body import footer
- footer.show_more()
- return make_button(gtk.STOCK_GO_UP, up_func, "Show More Information", show)
-
-def down_button(show):
- def down_func():
- from ocarina.body import footer
- footer.show_less()
- return make_button(gtk.STOCK_GO_DOWN, down_func, "Show Less Information", show)
-
-def goto_button(show):
- def goto_func():
- from ocarina import body
- body.cur_page_goto()
- return make_button(gtk.STOCK_JUMP_TO, goto_func, "Go To Current Song", show)
-
-def clear_button(show):
- def clear_func():
- from ocarina import body
- body.cur_page_clear()
- return make_button(gtk.STOCK_CLEAR, clear_func, "Clear Current Source", show)
-
-def random_button(is_active, show):
- return make_toggle("images/random.png", controls.set_rand, "Random", is_active, show)
-
-def like_button(show):
- def set_like(like):
- if like == False:
- like = None
- controls.set_like(like)
- return make_toggle("images/thumbs_up.png", set_like, "I like this", False, show)
-
-def dislike_button(show):
- def set_dislike(like):
- like = not like
- if like == True:
- like = None
- controls.set_like(like)
- return make_toggle("images/thumbs_down.png", set_dislike, "I don't like this", False, show)
-
-def volume_button(volume, show):
- b = gtk.VolumeButton()
- default_button_attrs(b, None, None, show)
- b.get_adjustment().set_page_increment(0.05)
- b.set_value(volume)
-
- def resize(button):
- image = b.get_children()[0]
- icon = image.get_icon_name()[0]
- image.set_from_icon_name(icon, gtk.ICON_SIZE_MENU)
-
- def changed(button, value):
- controls.set_volume(value)
- resize(button)
- b.connect("value-changed", changed)
- resize(b)
- return b
diff --git a/ocarina/body/footer/__init__.py b/ocarina/body/footer/__init__.py
deleted file mode 100644
index 7e639b3f..00000000
--- a/ocarina/body/footer/__init__.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Bryan Schumaker (11/25/2010)
-
-import gtk
-import gobject
-
-import tiny
-import detailed
-import libsaria
-from libsaria import audio
-from ocarina import shortcuts
-
-footer = gtk.VBox()
-hsep = gtk.HSeparator()
-hsep.show()
-
-footer.pack_start(hsep, True, True)
-footer.pack_start(tiny.tiny, True, True)
-footer.pack_start(detailed.detailed, True, True)
-footer.show()
-
-def update_pos():
- time = audio.get_progstr()
- tiny.update_pos(time)
- detailed.update_pos(time)
- return True
-gobject.timeout_add(500, update_pos)
-
-def show_more():
- tiny.hide()
- detailed.show()
- libsaria.prefs.set("ocarina.footer.up", True)
-
-def show_less():
- tiny.show()
- detailed.hide()
- libsaria.prefs.set("ocarina.footer.up", False)
-
-def toggle_footer():
- up = libsaria.prefs.get("ocarina.footer.up")
- if up == True:
- show_less()
- else:
- show_more()
-shortcuts.register_shortcut("f", toggle_footer)
-
-up = libsaria.prefs.init("ocarina.footer.up", False)
-if up == True:
- show_more()
-else:
- show_less()
-
-def set_art(path):
- tiny.set_art(path)
- detailed.set_art(path)
-
-def on_play():
- tiny.on_play()
- detailed.on_play()
-
-def on_pause():
- tiny.on_pause()
- detailed.on_pause()
-
-def on_load(attrs):
- tiny.on_load(attrs)
- detailed.on_load(attrs)
-
-def on_like(like):
- detailed.nowplaying.on_like(like)
diff --git a/ocarina/body/footer/detailed.py b/ocarina/body/footer/detailed.py
deleted file mode 100644
index 1674e790..00000000
--- a/ocarina/body/footer/detailed.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# Bryan Schumaker (4 / 21 / 2011)
-
-import gtk
-from ocarina.body import button
-import libsaria
-from libsaria import audio
-import nowplaying
-
-detailed = gtk.Notebook()
-hide = detailed.hide
-show = detailed.show
-
-action = gtk.HBox()
-
-cur_pos = gtk.Label()
-cur_pos.show()
-action.pack_start(cur_pos, False, False)
-
-def slider_update(slider):
- slider.set_value(audio.get_progress() * 100)
-
-def slider_scrolled(slider, type, value):
- audio.seek_prcnt(value / 100.0)
-
-def slider_clicked(slider, event):
- prcnt = event.x / float(slider.get_allocation().width)
- audio.seek_prcnt(prcnt)
- slider_update(slider)
-
-def slider_tooltip(slider, event):
- prcnt = event.x / float(slider.get_allocation().width)
- slider.set_tooltip_text(audio.get_time_at(prcnt))
-
-slider = gtk.HScale( gtk.Adjustment(0.0, 0.0, 100.0, 0.1, 1.0, 1.0) )
-slider.set_size_request(150, 20)
-slider.set_draw_value(False)
-slider.set_range(0, 101)
-slider.set_update_policy(gtk.UPDATE_DISCONTINUOUS)
-slider.connect("change-value", slider_scrolled)
-slider.connect("button-press-event", slider_clicked)
-slider.connect("motion-notify-event", slider_tooltip)
-slider.show()
-action.pack_start(slider, True, True)
-
-def add_button(name, button_func, show = True):
- b = button_func(show)
- globals()[name] = b
- action.pack_start(b, False, False)
-
-add_button( "PLAY", button.play_button)
-add_button( "PAUSE", button.pause_button, False)
-add_button( "STOP", button.stop_button)
-add_button( "NEXT", button.next_button)
-add_button( "DOWN", button.down_button)
-action.show()
-
-detailed.set_action_widget(action, gtk.PACK_END)
-detailed.append_page(nowplaying.page, nowplaying.label)
-
-def set_art(path):
- nowplaying.set_art(path)
-
-def update_pos(time):
- slider_update(slider)
- cur_pos.set_text(time)
-
-def on_play():
- PLAY.hide()
- PAUSE.show()
-
-def on_pause():
- PLAY.show()
- PAUSE.hide()
-
-load_attrs = ("title", "artist", "album", "year", "lenstr", "count", "like")
-def on_load(attrs):
- nowplaying.on_load(attrs)
diff --git a/ocarina/body/footer/nowplaying.py b/ocarina/body/footer/nowplaying.py
deleted file mode 100644
index 3865c4e1..00000000
--- a/ocarina/body/footer/nowplaying.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# Bryan Schumaker (4 / 21 / 2011)
-
-import gtk
-from libsaria import controls
-from ocarina.body import button
-from ocarina.body import image
-
-page = gtk.HBox(False, 5)
-label = gtk.Label("Now Playing")
-
-ARTWORK = image.Image()
-page.pack_start(ARTWORK, False, False)
-
-def pack_label(box, label):
- a = gtk.Alignment(0, 0.5, 0, 0)
- a.add(label)
- box.pack_start(a)
-
-TITLE = gtk.Label()
-ARTIST = gtk.Label("by")
-ALBUM = gtk.Label("from")
-tag_box = gtk.VBox(True)
-view = gtk.Viewport()
-tags = gtk.ScrolledWindow()
-view.set_shadow_type(gtk.SHADOW_NONE)
-tags.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-pack_label(tag_box, TITLE)
-pack_label(tag_box, ARTIST)
-pack_label(tag_box, ALBUM)
-view.add(tag_box)
-tags.add(view)
-page.pack_start(tags)
-
-YEAR = gtk.Label("Year:")
-LENGTH = gtk.Label("Length:")
-COUNT = gtk.Label("Play count:")
-attr_box = gtk.VBox(True)
-pack_label(attr_box, YEAR)
-pack_label(attr_box, LENGTH)
-pack_label(attr_box, COUNT)
-page.pack_start(attr_box)
-
-LIKE = button.like_button(True)
-DISLIKE = button.dislike_button(True)
-buttons = gtk.HBox(True)
-buttons.pack_start( LIKE, False, False)
-buttons.pack_start(DISLIKE, False, False)
-page.pack_start(buttons, False, False)
-
-page.show_all()
-label.show()
-
-sa_id = None
-def resize_art(*args):
- set_art(ARTWORK.get_file())
- page.disconnect(sa_id)
-sa_id = page.connect("size-allocate", resize_art)
-
-def set_art(path):
- ARTWORK.set_image(path, 64)
-
-def on_like(like):
- def _on_like1(like):
- LIKE.set_active(like == True)
- DISLIKE.set_active(like == False)
- def _on_like0(like):
- button.toggle_call_unconnected(DISLIKE, _on_like1, like)
- button.toggle_call_unconnected(LIKE, _on_like0, like)
-
-def on_load(attrs):
- TITLE.set_text(attrs["title"])
- ARTIST.set_text("by %s" % attrs["artist"])
- ALBUM.set_text("from %s" % attrs["album"])
- YEAR.set_text("Year: %s" % attrs["year"])
- LENGTH.set_text("Length: %s" % attrs["lenstr"])
- COUNT.set_text("Play count: %s" % attrs["count"])
- set_art(attrs["art"])
- on_like(attrs["like"])
diff --git a/ocarina/body/footer/tiny.py b/ocarina/body/footer/tiny.py
deleted file mode 100644
index 199e15c6..00000000
--- a/ocarina/body/footer/tiny.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# Bryan Schumaker (2 / 17 / 2011)
-
-import gtk
-import pango
-import ocarina
-import libsaria
-from ocarina.body import button
-from ocarina.body import image
-
-tiny = gtk.HBox()
-hide = tiny.hide
-show = tiny.show
-
-ARTWORK = image.Image()
-tiny.pack_start(ARTWORK, False, False)
-
-now_playing = gtk.Label(ocarina.__vers__)
-now_playing.set_ellipsize(pango.ELLIPSIZE_END)
-now_playing.show()
-
-cur_pos = gtk.Label()
-duration = gtk.Label()
-cur_pos.show()
-duration.show()
-
-def add_button(name, button_func, show = True):
- b = button_func(show)
- globals()[name] = b
- tiny.pack_start(b, False, False)
-
-tiny.pack_start(now_playing, True, True)
-tiny.pack_start( cur_pos, False, False)
-tiny.pack_start( duration, False, False)
-add_button( "REWIND", button.rewind_button)
-add_button("FORWARD", button.forward_button)
-add_button( "PLAY", button.play_button)
-add_button( "PAUSE", button.pause_button, False)
-add_button( "STOP", button.stop_button)
-add_button( "NEXT", button.next_button)
-add_button( "UP", button.up_button)
-
-sa_id = None
-def resize_art(*args):
- set_art(ARTWORK.get_file())
- tiny.disconnect(sa_id)
-sa_id = tiny.connect("size-allocate", resize_art)
-
-def set_art(path):
- ARTWORK.set_image(path, 24)
-
-def update_pos(pos):
- cur_pos.set_text(pos)
-
-def on_play():
- PLAY.hide()
- PAUSE.show()
-
-def on_pause():
- PLAY.show()
- PAUSE.hide()
-
-def on_load(attrs):
- now_playing.set_text("%s by %s" % (attrs["title"], attrs["artist"]))
- duration.set_text(" / %s" % attrs["lenstr"])
- set_art(attrs["art"])
diff --git a/ocarina/body/header/__init__.py b/ocarina/body/header/__init__.py
deleted file mode 100644
index 281b6d7a..00000000
--- a/ocarina/body/header/__init__.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# Bryan Schumaker (11/25/2010)
-
-import gtk
-from libsaria import prefs
-from ocarina.body import button
-import entry
-
-header = gtk.VBox()
-header_body = gtk.HBox()
-header_sep = gtk.HSeparator()
-
-header.pack_start(header_body)
-header.pack_start(header_sep)
-header.show_all()
-
-def add_button(name, button):
- globals()[name] = button
- header_body.pack_start(button, False, False)
-
-header_body.pack_start(entry.entry)
-add_button( "OPEN", button.open_button(True))
-add_button( "SAVE", button.save_button(True))
-add_button( "PREFS", button.prefs_button(True))
-
-sep = gtk.VSeparator()
-sep.show()
-header_body.pack_start(sep, False, False)
-
-add_button("UPDATE", button.update_button(True))
-add_button( "CLEAR", button.clear_button(True))
-add_button( "GOTO", button.goto_button(True))
-add_button("RANDOM", button.random_button(prefs.get("libsaria.random"), True))
-add_button("VOLUME", button.volume_button(prefs.get("libsaria.audio.volume"), True))
-
-#import ocarina
-#from ocarina.components import button
-#from ocarina.components import entry
-
-#gtk = ocarina.gtk
-#header = None
-#bar = None
-
-
-#def bar_add(widget, expand = False, fill = False):
- #bar.pack_start(widget, expand, fill)
-
-#def init():
- #global header
- #global bar
-
- #header = gtk.VBox()
- #bar = gtk.HBox()
- #sep = gtk.HSeparator()
- #vsep = gtk.VSeparator()
- #vsep.show()
- #header.pack_start(bar)
- #header.pack_start(sep)
- #header.show_all()
-
- #bar_add(entry.FilterEntry(), True, True)
- #bar_add(button.OpenButton())
- #bar_add(button.SaveButton())
- #bar_add(button.ExportButton())
- #bar_add(button.SettingsButton())
- #bar_add(vsep)
- #bar_add(button.UpdateButton())
- #bar_add(button.ClearButton())
- #bar_add(button.GotoButton())
- #bar_add(button.RandomButton())
- #bar_add(button.VolumeButton())
-#init()
diff --git a/ocarina/body/header/entry.py b/ocarina/body/header/entry.py
deleted file mode 100644
index d225c474..00000000
--- a/ocarina/body/header/entry.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Bryan Schumaker (4 / 18 / 2011)
-
-import gtk
-import ocarina
-from ocarina import shortcuts
-from libsaria import sources
-
-entry = gtk.Entry()
-entry.show()
-
-has_focus = entry.is_focus
-
-def do_filter(entry):
- sources.filter(entry.get_text())
-entry.connect("changed", do_filter)
-
-shortcuts.register_shortcut("slash", entry.grab_focus)
diff --git a/ocarina/body/image.py b/ocarina/body/image.py
deleted file mode 100644
index 4ea99eed..00000000
--- a/ocarina/body/image.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# Bryan Schumaker (04 / 23 / 2011)
-
-import gtk
-from ocarina import fsselect
-from libsaria import sources
-
-def find_new_width(buf, new_h):
- w = buf.get_width()
- h = buf.get_height()
- if h == 0:
- h = 1
- return int( (float(w) / float(h)) * new_h )
-
-def _resize(img, new_h):
- buf = img.get_pixbuf()
- if buf == None:
- return
- new_w = find_new_width(buf, new_h)
- buf = buf.scale_simple(new_w, new_h, gtk.gdk.INTERP_HYPER)
- if buf == None:
- return
- img.clear()
- img.set_from_pixbuf(buf)
-
-def resize(img, new_h):
- if new_h == 0:
- return
- new_h = int(new_h)
- try:
- _resize(img, new_h)
- except Exception, e:
- print e
-
-
-class FileImage(gtk.Image):
- def __init__(self):
- gtk.Image.__init__(self)
- self.path = None
- self.height = 0
- self.set_has_tooltip(True)
- self.connect("query-tooltip", self.tooltip)
- self.show()
-
- def get_file(self):
- return self.path
-
- def set_image(self, path, height):
- if path != self.path:
- self.path = path
- self.height = height
- self.set_from_file(path)
- resize(self, height)
-
- def tooltip(self, image, x, y, keyboard, tip):
- image = gtk.Image()
- image.set_from_file(self.path)
- tip.set_icon(image.get_pixbuf())
- return True
-
-
-class Image(gtk.EventBox):
- def __init__(self):
- gtk.EventBox.__init__(self)
- self.image = FileImage()
- self.add(self.image)
- self.connect("button-press-event", self.clicked)
- self.show()
-
- self.get_file = self.image.get_file
- self.set_image = self.image.set_image
-
- def clicked(self, widget, event):
- if event.button != 1:
- return
- id = sources.get_cur_id()
- if id == -1:
- return
- path = fsselect.select_file("Select an image")
- if path == None:
- return
- try:
- self.set_image(path, self.image.height)
- sources.set_attr("art", path)
- except Exception, e:
- print e
diff --git a/ocarina/body/page.py b/ocarina/body/page.py
deleted file mode 100644
index 40aa5587..00000000
--- a/ocarina/body/page.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Bryan Schumaker (4 / 17 / 2011)
-
-import gtk
-import header
-import footer
-SHRINK = gtk.SHRINK
-GROW = gtk.FILL | gtk.EXPAND
-
-class OcarinaPage(gtk.Table):
- def __init__(self, content, label):
- gtk.Table.__init__(self, 3, 1, False)
- self.content = content
- self.label = label
- self.block_shortcuts = False
- self.attach_center(content)
- self.show()
-
- def visible(self):
- self.attach_top(header.header)
- self.attach_bottom(footer.footer)
-
- def invisible(self):
- if header.header.get_parent() == self:
- self.remove(header.header)
- if footer.footer.get_parent() == self:
- self.remove(footer.footer)
-
- def attach_top(self, content):
- self.attach(content, 0, 1, 0, 1, GROW, SHRINK)
-
- def attach_center(self, content):
- self.attach(content, 0, 1, 1, 2)
-
- def attach_bottom(self, content):
- self.attach(content, 0, 1, 2, 3, GROW, SHRINK)
-
- def filter(self, text):
- pass
-
- def goto(self):
- pass
-
- def clear(self):
- pass
diff --git a/ocarina/callbacks.py b/ocarina/callbacks.py
deleted file mode 100644
index c1212b31..00000000
--- a/ocarina/callbacks.py
+++ /dev/null
@@ -1,69 +0,0 @@
-# Bryan Schumaker (4 / 20 / 2011)
-
-import gtk
-import gobject
-
-import libsaria
-import queue
-from ocarina import body
-from ocarina import settings
-from ocarina.body import footer
-from libsaria import callbacks
-import playlist
-import library
-
-def on_play():
- footer.on_play()
-callbacks.on_play = on_play
-
-def on_pause():
- footer.on_pause()
-callbacks.on_pause = on_pause
-
-def on_load(file, attrs):
- footer.on_load(attrs)
- queue.refresh()
- body.cur_page_goto()
-callbacks.on_load = on_load
-
-def on_like(like):
- footer.on_like(like)
-callbacks.on_like = on_like
-
-
-# A bit of a hack to force setting album art in the main thread
-# Basically, I create a new signal and trigger it when new album
-# art arrives
-gobject.signal_new("get_art", gobject.GObject, gobject.SIGNAL_RUN_LAST,
- gobject.TYPE_NONE,
- (gobject.TYPE_INT, gobject.TYPE_STRING))
-
-def on_get_art_helper(obj, id, path):
- if id == libsaria.sources.get_cur_id():
- footer.set_art(path)
-
-on_get_art_obj = gobject.GObject()
-on_get_art_obj.connect("get_art", on_get_art_helper)
-
-def on_get_art(path, id):
- on_get_art_obj.emit("get_art", id, path)
-callbacks.on_get_art = on_get_art
-
-def on_load_playlist():
- playlist.refresh()
-callbacks.on_load_playlist = on_load_playlist
-
-def library_updated():
- library.refresh()
- settings.library.refresh()
-callbacks.on_library_updated = library_updated
-
-def on_queue_changed():
- queue.refresh()
-callbacks.on_queue_changed = on_queue_changed
-
-def on_refilter():
- queue.refilter()
- playlist.refilter()
- library.refilter()
-callbacks.on_refilter = on_refilter
diff --git a/ocarina/fsselect.py b/ocarina/fsselect.py
deleted file mode 100644
index f3807ff3..00000000
--- a/ocarina/fsselect.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Bryan Schumaker (June 2010)
-
-import ocarina
-import gobject
-import os
-
-gtk = ocarina.gtk
-libsaria = ocarina.libsaria
-
-#FS_OK = gobject.signal_new("filesystem_ok", gtk.FileChooserDialog,
-# gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
-# (gtk.Dialog, int))
-#print FS_OK
-
-#print gobject.signal_query(FS_OK)
-#print gobject.signal_query(gtk.RESPONSE_OK)
-chooser_window = None
-chooser_widget = None
-
-def make_chooser(title, action):
- buttons = (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OK, gtk.RESPONSE_OK)
- chooser = gtk.FileChooserDialog(title, action=action, buttons=buttons)
- return chooser
-
-def make_chooser2(title, callback):
- global chooser_window
- global chooser_widget
- chooser_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-
- chooser_box = gtk.VBox(spacing = 0)
- button_box = gtk.HBox()
- chooser_widget = gtk.FileChooserWidget()
- open_button = gtk.Button(stock=gtk.STOCK_OK)
- close_button = gtk.Button(stock=gtk.STOCK_CANCEL)
- button_box.pack_end(open_button, False, False, 10)
- button_box.pack_end(close_button, False, False)
- chooser_box.pack_start(chooser_widget, True, True, 10)
- chooser_box.pack_start(button_box, False, False, 10)
-
- size = close_button.size_request()
- open_button.set_size_request(size[0], size[1])
- chooser_widget.connect("file-activated", select_path, callback)
- open_button.connect("clicked", select_path, callback)
- close_button.connect("clicked", hide_chooser)
-
- chooser_window.add(chooser_box)
- chooser_window.resize(800, 600)
- chooser_window.show_all()
-
-def hide_chooser(button):
- global chooser_window
- chooser_window.hide()
-
-def select_path(widget, callback):
- global chooser_widget
- global chooser_window
- chooser_window.hide()
- uri = chooser_widget.get_uri()
- if uri[:7] == "file://":
- uri = uri[7:]
- uri = uri.replace("%20", " ")
- callback(uri)
-
-def run_chooser2(callback):
- make_chooser2("title", callback)
-
-def run_chooser(chooser):
- file = None
- if chooser.run() == gtk.RESPONSE_OK:
- file = chooser.get_filename()
- chooser.hide()
- return file
-
-# Use for selecting a file through the GUI
-def select_file(title = "Select a song"):
- chooser = make_chooser(title, gtk.FILE_CHOOSER_ACTION_OPEN)
- return run_chooser(chooser)
-
-# Use for selecting a directory through the GUI
-def select_dir(title = "Select a directory"):
- chooser = make_chooser(title, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
- return run_chooser(chooser)
-
-def select_save(title = "Select a location"):
- chooser = make_chooser(title, gtk.FILE_CHOOSER_ACTION_SAVE)
- return run_chooser(chooser)
diff --git a/ocarina/library.py b/ocarina/library.py
deleted file mode 100644
index 2f7f774f..00000000
--- a/ocarina/library.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Bryan Schumaker (5 / 20 / 2011)
-
-import libsaria
-import sources
-import body
-
-library = libsaria.sources.library
-lib_page = sources.Source()
-LIB_PAGE = body.add_page(lib_page, "Library")
-LIB_PAGE.goto = lib_page.goto
-
-def set_label_text():
- LIB_PAGE.label.set_text("Library (%s)" % library.num_visible())
-
-def fill_library():
- songs = libsaria.sources.list_library(*sources.column.attrs)
- lib_page.insert(songs)
- set_label_text()
-fill_library()
-
-def refresh():
- lib_page.clear()
- fill_library()
-
-def refilter():
- lib_page.refilter()
- set_label_text()
-
-import playlist
-import queue
-
-def clear():
- queue.clear()
- playlist.clear()
- library.reset()
- lib_page.clear()
- refresh()
-LIB_PAGE.clear = clear
-
-menu_items = [
- ("Add to Queue", queue.add_to_queue),
- ("Add to Playlist", playlist.add_to_playlist),
-]
-def show_menu(event):
- m = sources.Menu(lib_page, menu_items)
- m.show(event)
-lib_page.set_right_click(show_menu)
diff --git a/ocarina/playlist.py b/ocarina/playlist.py
deleted file mode 100644
index 9b53ed99..00000000
--- a/ocarina/playlist.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Bryan Schumaker (11/26/2010)
-
-import libsaria
-import sources
-import body
-
-playlist = libsaria.sources.playlist
-playlist_page = sources.Source()
-PLAYLIST_PAGE = body.add_page(playlist_page, "Playlist")
-PLAYLIST_PAGE.goto = playlist_page.goto
-
-def set_label_text():
- PLAYLIST_PAGE.label.set_text("Playlist (%s)" % playlist.num_visible())
-
-def fill_playlist():
- songs = libsaria.sources.list_playlist(*sources.column.attrs)
- playlist_page.insert(songs)
- set_label_text()
-fill_playlist()
-
-def refresh():
- playlist_page.clear()
- fill_playlist()
-
-def refilter():
- playlist_page.refilter()
- playlist_page.goto()
- set_label_text()
-
-def clear():
- playlist_page.clear()
- playlist.reset()
- refresh()
-PLAYLIST_PAGE.clear = clear
-
-def add_to_playlist(menu):
- ids = menu.source.get_selected_ids()
- playlist.add_ids(ids)
- refresh()
-
-def rm_from_playlist(menu):
- ids = menu.source.get_selected_ids()
- playlist.rm_ids(ids)
- refresh()
-
-import queue
-menu_items = [
- ("Add to Queue", queue.add_to_queue),
- ("Remove from Playlist", rm_from_playlist),
-]
-def show_menu(event):
- m = sources.Menu(playlist_page, menu_items)
- m.show(event)
-playlist_page.set_right_click(show_menu)
diff --git a/ocarina/queue.py b/ocarina/queue.py
deleted file mode 100644
index 1f4785d5..00000000
--- a/ocarina/queue.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# Bryan Schumaker (12/12/2010)
-
-import libsaria
-import sources
-import body
-
-queue = libsaria.sources.queue
-queue_page = sources.Source()
-QUEUE_PAGE = body.add_page(queue_page, "Queue")
-QUEUE_PAGE.goto = queue_page.goto
-
-def set_label_text():
- QUEUE_PAGE.label.set_text("Queue (%s)" % queue.num_visible())
-
-def set_visible():
- if queue.num_visible() == 0:
- body.hide_page(QUEUE_PAGE)
- else:
- body.show_page(QUEUE_PAGE)
-
-def fill_queue():
- songs = libsaria.sources.list_queue(*sources.column.attrs)
- queue_page.insert(songs)
- set_label_text()
- set_visible()
-fill_queue()
-
-def refresh():
- queue_page.clear()
- fill_queue()
-
-def refilter():
- queue_page.refilter()
- set_label_text()
-
-def clear():
- queue_page.clear()
- queue.reset()
- refresh()
-QUEUE_PAGE.clear = clear
-
-def add_to_queue(menu):
- ids = menu.source.get_selected_ids()
- queue.add_ids(ids)
- refresh()
-
-def rm_from_queue(menu):
- ids = menu.source.get_selected_ids()
- queue.rm_ids(ids)
- refresh()
-
-menu_items = [
- ("Remove from Queue", rm_from_queue),
-]
-def show_menu(event):
- m = sources.Menu(queue_page, menu_items)
- m.show(event)
-queue_page.set_right_click(show_menu)
diff --git a/ocarina/settings/__init__.py b/ocarina/settings/__init__.py
deleted file mode 100644
index 278a7983..00000000
--- a/ocarina/settings/__init__.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Bryan Schumaker (6 / 18 / 2011)
-
-import gtk
-
-from ocarina import sources
-from ocarina import body
-
-settings_page = gtk.VBox()
-settings_page.show()
-SETTINGS_PAGE = body.add_page(settings_page, "Settings")
-
-categories = gtk.Notebook()
-settings_page.pack_start(categories, True, True)
-settings_page.show_all()
-
-close_button = gtk.Button("Close", gtk.STOCK_CLOSE)
-close_button.set_relief(gtk.RELIEF_NONE)
-categories.set_action_widget(close_button, gtk.PACK_END)
-close_button.show()
-
-def hide_settings(*args):
- body.hide_page(SETTINGS_PAGE)
- body.switch_to_page_n(0)
-close_button.connect("clicked", hide_settings)
-hide_settings()
-
-def show_settings():
- body.show_page(SETTINGS_PAGE)
-
-def show_page():
- show_settings()
- body.switch_to_page(SETTINGS_PAGE)
-
-def add_category(module):
- label = gtk.Label(module.text)
- label.show()
- categories.append_page(module.page, label)
- module.page.show()
-
-import library
-add_category(library)
-
-import experimental
-add_category(experimental)
diff --git a/ocarina/settings/experimental.py b/ocarina/settings/experimental.py
deleted file mode 100644
index 7595d95f..00000000
--- a/ocarina/settings/experimental.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# Bryan Schumaker (6 / 18 / 2011)
-
-import gtk
-import libsaria
-
-page = gtk.VBox()
-text = "Experimental"
-
-def toggled(button, func):
- func(button.get_active())
-
-def make_check_button(text, func, active):
- button = gtk.CheckButton(text)
- button.set_active(active)
- button.connect("toggled", toggled, func)
- return button
-
-SERVER = make_check_button("Enable web server", libsaria.server.toggle_state, libsaria.server.get_state())
-
-page.pack_start(SERVER, False, False)
-page.show_all()
diff --git a/ocarina/settings/library.py b/ocarina/settings/library.py
deleted file mode 100644
index 0ab27533..00000000
--- a/ocarina/settings/library.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Bryan Schumaker (6 / 18 / 2011)
-
-import gtk
-import libsaria
-
-page = gtk.VBox()
-text = "Library"
-panels = {}
-
-def remove_path(button, path):
- page.remove(panels[path])
- del panels[path]
- libsaria.sources.library.rm_path(path)
-
-def add_panel(panel, path):
- full_box = gtk.VBox()
- full_box.pack_start(panel)
- full_box.pack_start(gtk.HSeparator())
- full_box.show_all()
- panels[path] = full_box
- page.pack_start(full_box, False, False)
-
-def show_source(path, lib):
- panel = gtk.HBox()
- info_box = gtk.VBox()
-
- path_lbl = gtk.Label()
- path_lbl.set_markup("%s" % path)
- count_lbl = gtk.Label()
- count_lbl.set_markup("%s files" % len(lib))
- remove_button = gtk.Button("Remove", gtk.STOCK_REMOVE)
- remove_button.connect("clicked", remove_path, path)
-
- info_box.pack_start(path_lbl)
- info_box.pack_start(count_lbl)
- panel.pack_start(info_box)
- panel.pack_start(remove_button, False, False)
- add_panel(panel, path)
-
-def refresh():
- for path in panels:
- page.remove(panels[path])
-
- for path, lib in libsaria.sources.library.list_paths():
- show_source(path, lib)
-refresh()
-
diff --git a/ocarina/shortcuts.py b/ocarina/shortcuts.py
deleted file mode 100644
index eea6f26b..00000000
--- a/ocarina/shortcuts.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# Bryan Schumaker (3 / 11 / 2011)
-
-import gtk
-from libsaria import controls
-
-keyval_name = gtk.gdk.keyval_name
-shortcut_map = {}
-
-def null_shortcut():
- return False
-
-# Setting allow_filter_focus to True means that the
-# registered shortcut will always run, even if the
-# filter entry currently has focus
-def register_shortcut(key, func, allow_filter_focus = False):
- shortcut_map[key] = (func, allow_filter_focus)
-
-def key_pressed(widget, event):
- from ocarina import body
- from ocarina.body.header import entry
-
- name = keyval_name(event.keyval)
- func, allow_filter_focus = shortcut_map.get(name, (null_shortcut, False))
- if (entry.has_focus() and not allow_filter_focus):
- return
- if func() == False:
- return False
- widget.emit_stop_by_name("key-press-event")
- return True
-
-register_shortcut("space", controls.toggle_play)
-register_shortcut( "Left", controls.seek_backward)
-register_shortcut("Right", controls.seek_forward)
-register_shortcut( "n", controls.next)
-register_shortcut( "s", controls.stop)
diff --git a/ocarina/sources/__init__.py b/ocarina/sources/__init__.py
deleted file mode 100644
index 777fe33b..00000000
--- a/ocarina/sources/__init__.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# Bryan Schumaker (2 / 11 / 2011)
-
-import gtk
-
-import listview
-import menu
-
-Menu = menu.Menu
-
-class Source(gtk.ScrolledWindow):
- def __init__(self):
- gtk.ScrolledWindow.__init__(self)
- self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-
- self.listview = listview.ListView()
- self.add(self.listview)
- self.show()
-
- # Function pointer declarations
- self.get_selected_ids = self.listview.get_selected_ids
- self.set_right_click = self.listview.set_right_click
- self.set_filter_func = self.listview.set_filter_func
- self.refilter = self.listview.refilter
- self.insert = self.listview.insert_rows
- self.clear = self.listview.clear
- self.goto = self.listview.goto
diff --git a/ocarina/sources/column.py b/ocarina/sources/column.py
deleted file mode 100644
index 15e79785..00000000
--- a/ocarina/sources/column.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Bryan Schumaker (2 / 12 / 2011)
-
-import gtk
-
-attrs = ("id", "track", "title", "lenstr", "artist", "album", "year")
-columns = ["Id", "#", "Title", "Length", "Artist", "Album", "Year"]
-col_width = [ 2, 20, 300, 60, 125, 125, 50]
-
-cell = gtk.CellRendererText()
-cell.set_fixed_height_from_font(1)
-
-class Column(gtk.TreeViewColumn):
- def __init__(self, index, label):
- gtk.TreeViewColumn.__init__(self, label, cell)
- self.add_attribute(cell, 'text', index)
- self.set_resizable(True)
- self.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
- self.set_min_width(2)
- self.set_max_width(700)
- self.set_fixed_width(col_width[index])
diff --git a/ocarina/sources/list.py b/ocarina/sources/list.py
deleted file mode 100644
index 45b7ed8f..00000000
--- a/ocarina/sources/list.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Bryan Schumaker (2 / 12 / 2011)
-
-import gtk
-
-class List(gtk.ListStore):
- def __init__(self):
- gtk.ListStore.__init__(self, int, str, str, str, str, str, int)
diff --git a/ocarina/sources/listview.py b/ocarina/sources/listview.py
deleted file mode 100644
index 3923b702..00000000
--- a/ocarina/sources/listview.py
+++ /dev/null
@@ -1,142 +0,0 @@
-# Bryan Schumaker (2 / 12 / 2011)
-
-import gtk
-import list
-import column
-import libsaria
-
-BUTTON_RIGHT = 3
-is_visible = libsaria.sources.is_visible
-
-class ListView(gtk.TreeView):
- def __init__(self):
- gtk.TreeView.__init__(self)
- self.list = list.List()
-
- for index, label in enumerate(column.columns):
- col = column.Column(index, label)
- if index != 0:
- self.append_column(col)
-
- self.set_rules_hint(True)
- #self.set_has_tooltip(True)
- self.set_fixed_height_mode(True)
-
- self.filter_model = self.list.filter_new()
- self.set_model(self.filter_model)
-
- self.selection = self.get_selection()
- self.selection.set_mode(gtk.SELECTION_MULTIPLE)
-
- self.connect("row-activated", self.double_click)
- self.connect("button-release-event", self.button_click)
- #self.connect("query-tooltip", self.query_tooltip)
-
- self.set_filter_func(self.song_is_visible)
- self.insert = self.list.insert
- self.show()
-
- def freeze(self):
- self.freeze_child_notify()
- self.set_model(None)
- self.hide()
-
- def thaw(self):
- self.show()
- self.set_model(self.filter_model)
- self.thaw_child_notify()
-
- def clear(self):
- self.freeze()
- self.list.clear()
- self.thaw()
-
- def insert_rows(self, rows):
- self.freeze()
- ins_next = 0
- insert = self.insert
- for row in rows:
- insert(ins_next, row)
- ins_next += 1
- self.thaw()
-
- def right_click(self, event):
- pass
-
- def set_right_click(self, func):
- self.right_click = func
-
- def double_click(self, widget, path, column):
- model = self.get_model()
- iter = model.get_iter(path)
- row = model[iter]
- libsaria.sources.play_id(row[0])
-
- def button_click(self, widget, event):
- if event.button == BUTTON_RIGHT:
- self.right_click(event)
-
- def get_selected_ids(self):
- res = []
- def insert_func(tree, path, iter, func):
- func(tree[iter][0])
- self.selection.selected_foreach(insert_func, res.append)
- return res
-
- def song_is_visible(self, list, iter):
- return is_visible(list[iter][0])
-
- def set_filter_func(self, func):
- self.filter_model.set_visible_func(func)
-
- def refilter(self):
- self.freeze()
- self.filter_model.refilter()
- self.thaw()
-
- def goto(self, *args):
- id = libsaria.sources.get_cur_id()
- if id == -1: # Bad id
- return
- vis = self.get_visible_rect()
- if vis[3] == 0: # The widget hasn't been realized yet
- return
- for index, row in enumerate(self.filter_model):
- if row[0] == id:
- col = self.get_column(0)
- row_vis = self.get_cell_area(index, col)
- if row_vis[3] > 0:
- n = vis[3] / row_vis[3]
- path = index - (n / 2)
- if path < 0:
- path = 0
- self.scroll_to_cell(path, None, True, 0, 0)
- self.set_cursor_on_cell(index, None, None, False)
- return
-
- #def query_tooltip(self, widget, x, y, keyboard, tip):
- #row = self.get_dest_row_at_pos(x,y)
- #if row == None:
- #return False
- #iter = self.filter_model.get_iter(row[0])
- #id = self.filter_model[iter][0]
-
- ##attrs = get_attrs(id, "art", "title", "artist", "album", "year", "lenstr", "count")
- #attrs = get_attrs(id, "title", "artist", "album", "year", "lenstr", "count")
-
- ##art = image.Image()
- ##art.set_from_file(attrs[0])
- ##art.set_height(52)
- ##tip.set_icon(art.get_pixbuf())
-
- #tip.set_markup("%s\nby %s\nfrom %s" %
- #(attrs[0].replace("&", "&"),
- #attrs[1].replace("&", "&"),
- #attrs[2].replace("&", "&"))
- #)
-
- #extra = gtk.Label()
- #extra.set_markup(" Year: %s\n Length: %s\n Play count: %s" %
- #(attrs[3], attrs[4], attrs[5]) )
- #tip.set_custom(extra)
- #return True
diff --git a/ocarina/sources/menu.py b/ocarina/sources/menu.py
deleted file mode 100644
index e11b49ba..00000000
--- a/ocarina/sources/menu.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Bryan Schumaker (2 / 26 / 2011)
-
-import gtk
-import libsaria
-
-common = [
- ("Pause after current song", libsaria.controls.do_pause_after)
-]
-
-class MenuItem(gtk.MenuItem):
- def __init__(self, source, text, func):
- gtk.MenuItem.__init__(self, text)
- self.source = source
- if func:
- self.connect("activate", func)
- self.show()
-
-class Menu(gtk.Menu):
- def __init__(self, source, items):
- gtk.Menu.__init__(self)
- for (text, func) in common:
- self.append(MenuItem(source, text, func))
- self.append(MenuItem(source, None, None))
- for (text, func) in items:
- self.append(MenuItem(source, text, func))
-
- def show(self, event):
- self.popup(None, None, None, event.button, event.time)
diff --git a/ocarina/window.py b/ocarina/window.py
deleted file mode 100644
index 3e073647..00000000
--- a/ocarina/window.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Bryan Schumaker (8/13/2010)
-
-import gtk
-import ocarina
-import libsaria
-import body
-import shortcuts
-from libsaria.path import files
-
-TARGET_TYPE_URI_LIST = 80
-DND_MASK = gtk.DEST_DEFAULT_MOTION | gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP
-DND_LIST = [("text/uri-list", 0, TARGET_TYPE_URI_LIST)]
-
-width = libsaria.prefs.init("ocarina.window.width", 800)
-height = libsaria.prefs.init("ocarina.window.height", 600)
-
-window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-window.resize(width, height)
-window.connect("delete-event", ocarina.quit)
-window.connect("key-press-event", shortcuts.key_pressed)
-window.add(body.body)
-window.show()
-
-def grab_focus():
- window.set_focus(None)
-shortcuts.register_shortcut("Escape", grab_focus, True)
-
-def set_title(new_title = None):
- if new_title == None:
- new_title = ocarina.__vers__
- window.set_title(new_title)
-set_title()
-
-def set_icon(icon = "images/ocarina.png"):
- window.set_icon_from_file(icon)
-set_icon()
-
-def resized(widget, geom):
- if libsaria.prefs.get("ocarina.window.width") != geom.width:
- libsaria.prefs.set("ocarina.window.width", geom.width)
- if libsaria.prefs.get("ocarina.window.height") != geom.height:
- libsaria.prefs.set("ocarina.window.height", geom.height)
-window.connect("size-allocate", resized)
-
-def dnd_receive(widget, context, x, y, selection, type, time):
- if type == TARGET_TYPE_URI_LIST:
- uri = selection.data.strip('\r\n\x00')
- for file in uri.split():
- file = file[7:]
- files.universal_open(file)
-window.connect("drag-data-received", dnd_receive)
-window.drag_dest_set(DND_MASK, DND_LIST, gtk.gdk.ACTION_COPY)
diff --git a/plugins/lyrics.py b/plugins/lyrics.py
deleted file mode 100644
index 9c75e21d..00000000
--- a/plugins/lyrics.py
+++ /dev/null
@@ -1,103 +0,0 @@
-# Bryan Schumaker (11/27/2010)
-
-import ocarina
-from ocarina import footer
-from ocarina.components import image
-from ocarina.components import label
-import re
-
-libsaria = ocarina.libsaria
-from libsaria import web
-from libsaria import xm
-from libsaria import cache
-
-__NAME__ = "Lyrics"
-gtk = ocarina.gtk
-
-lyrics = gtk.ScrolledWindow()
-page = gtk.HBox(False, 5)
-text = gtk.TextView()
-buffer = text.get_buffer()
-
-lyrics.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-
-page.pack_start(image.AlbumArt(), False, False)
-
-text.set_editable(False)
-lyrics.add(text)
-page.pack_start(lyrics)
-
-page.show_all()
-
-url = "http://lyrics.wikia.com/api.php?"
-
-def decode_line(line):
- string = ""
- for c in line.split(";"):
- if len(c) == 0:
- continue
- try:
- val = int(c[2:])
- string += chr(val)
- except:
- pass
- return string
-
-def decode(file, code):
- lines = []
- for line in code:
- lines.append(decode_line(line))
- string = "\n".join(lines)
- file.write(string)
-
-def parse_full(file, lyrics):
- req = web.Url(lyrics)
- res = None
- for line in req.open():
- if re.match("(.*?)", line):
- res = line
- split = res.split(" ")
- code = split[len(split) - 1]
- decode(file, code.split(" "))
-
-def parse(file, res):
- doc = xm.parse(res)
- result = xm.child(doc)
- url_node = xm.get_elements(result, "url")[0]
- lyrics = xm.child(url_node).data
- parse_full(file, lyrics)
-
-def fetch_lyrics(file, artist, title):
- req = web.Url(url)
- req["artist"] = artist
- req["song"] = title
- req["fmt"] = "xml"
- try:
- parse(file, req.open())
- except:
- return False
- return True
-
-def set_lyrics(filepath):
- artist, title = libsaria.sources.get_attrs("artist", "title")
- cached = cache[artist]
- file = cached.get("%s.txt" % title, fetch_lyrics, artist, title)
- if file != None:
- fin = open(file)
- buffer.set_text(fin.read())
- else:
- buffer.set_text("")
-
-def start():
- footer.add_page("Lyrics", page)
- libsaria.event.invite("POSTLOAD", set_lyrics, True)
-
-def stop():
- footer.remove_page("Lyrics")
-
-def check_version():
- if libsaria.__major__ != 4:
- return False
- if libsaria.__minor__ == 4:
- return True
- return False
diff --git a/plugins/notify.py b/plugins/notify.py
deleted file mode 100644
index 608366e3..00000000
--- a/plugins/notify.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# Bryan Schumaker (12/12/2010)
-
-import pynotify
-import ocarina
-libsaria = ocarina.libsaria
-get_attrs = libsaria.sources.get_attrs
-image = ocarina.components.image.Image()
-
-__NAME__ = "Notify"
-
-def notify(*args):
- title, artist, art = get_attrs("title", "artist", "art")
-
- try:
- image.set_from_file(art)
- image.set_height(64)
- n = pynotify.Notification(title, "by %s" % artist)
- n.set_icon_from_pixbuf(image.get_pixbuf())
- n.set_timeout(10)
- n.show()
- except Exception, e:
- pass
-
-def start():
- if pynotify.init(ocarina.__vers__):
- libsaria.event.invite("POSTLOAD", notify)
-
-def stop():
- pass
-
-def check_version():
- if libsaria.__major__ != 4:
- return False
- if libsaria.__minor__ == 4:
- return True
- return True
diff --git a/plugins/web_radio.py b/plugins/web_radio.py
deleted file mode 100644
index 611987ee..00000000
--- a/plugins/web_radio.py
+++ /dev/null
@@ -1,56 +0,0 @@
-# Bryan Schumaker (8/14/2010)
-
-import ocarina
-import webkit
-from ocarina import body
-
-__NAME__ = "Web Radio"
-
-libsaria = ocarina.libsaria
-path = libsaria.path
-audio = libsaria.audio
-gtk = ocarina.gtk
-
-box = gtk.VBox()
-sel = gtk.combo_box_new_text()
-page = gtk.ScrolledWindow()
-web = webkit.WebView()
-
-sel.append_text("Select a station:")
-sel.append_text("Groove Shark")
-sel.append_text("Pandora")
-sel.set_active(0)
-
-page.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-page.add(web)
-
-html = path.join(path.cwd(), "html")
-radio = path.join(html, "web_radio.html")
-web.open(radio)
-
-box.pack_start(sel, False, False)
-box.pack_start(page)
-box.show_all()
-
-urls = [radio, "http://www.grooveshark.com", "http://www.pandora.com"]
-
-def combo_box_changed(box):
- model = box.get_model()
- index = box.get_active()
- if index != None:
- web.open(urls[index])
-
-sel.connect("changed", combo_box_changed)
-
-def start():
- body.add_page("Web Radio", box, False, False)
-
-def stop():
- body.remove_page("Web Radio")
-
-def check_version():
- if libsaria.__major__ != 4:
- return False
- if libsaria.__minor__ == 4:
- return True
- return False
diff --git a/plugins/web_server.py b/plugins/web_server.py
deleted file mode 100644
index fa42f2cd..00000000
--- a/plugins/web_server.py
+++ /dev/null
@@ -1,135 +0,0 @@
-# Bryan Schumaker (11/13/2010)
-
-import libsaria
-import imp
-from libsaria.sources import library
-from libsaria import threads
-from libsaria import lastfm
-
-__NAME__ = "Web Server"
-
-path = libsaria.path
-exists = path.exists
-join = path.join
-sep = path.sep
-basename = path.basename
-splitext = path.splitext
-
-from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
-
-html = join(path.cwd(), "html")
-server = None
-types = {".html":"text/html", ".js":"text/javascript",
- ".ico":"image/vnd.microsoft.icon",
- ".png":"image/png", ".jpg":"image/jpeg",
- ".py":"text/html", ".mp3":"audio/mpeg",
- ".ogg":"audio/ogg"}
-
-
-def format_text(text):
- text = text.replace("%20", " ")
- text = text.replace("%2F", "/")
- text = text.replace("%27", "'")
- text = text.replace("%2C", ",")
- return text
-
-def format_path(path):
- if path == "" or path == "/":
- path = html + "/index.html"
- return path, None
- split = path.split("?", 1)
- if len(split) == 1:
- return html + path, None
- path = split[0]
- args = split[1].split("&")
- kwargs = {}
- for arg in args:
- split = arg.split("=", 1)
- kwargs[split[0]] = format_text(split[1])
- return html + path, kwargs
-
-
-class HTTPRequest(BaseHTTPRequestHandler):
-
- def do_GET(self):
- try:
- fpath, args = format_path(self.path)
- #print fpath
- base, ext = splitext(fpath)
- if ext == ".py":
- self.py_file(args, fpath, base)
- elif ext == ".jpg":
- self.jpg_file(fpath)
- elif ext == ".mp3" or ext == ".ogg":
- self.audio_file()
- else:
- self.other_file(fpath, ext)
- except IOError:
- self.send_error(404, 'File Not Found: %s' % self.path)
-
- def do_POST(self):
- print self.path
- print "Received a post request!"
-
- def res_ok(self, ext):
- self.send_response(200)
- self.send_header('Content-type', '%s' % types[ext])
- self.end_headers()
-
- def py_file(self, kw, path, base):
- if not exists(path):
- raise IOError
- file = basename(base)
- mod = imp.load_source(file, path)
- self.res_ok(".py")
- mod.to_html(self.wfile, kw)
-
- def jpg_file(self, ipath):
- split = self.path.strip("/").split("/")
- if split[0] == "artwork":
- artist = format_text(split[1])
- album = splitext(split[2])[0]
- album = format_text(album)
- ipath = lastfm.get_artwork_tags(artist, album)
- base, ext = splitext(ipath)
- self.other_file(ipath, ext)
-
- def audio_file(self):
- sid, ext = splitext(self.path.strip("/"))
- fpath = library.get_attrs(long(sid), "filepath")
- self.other_file(fpath, ext)
-
- def other_file(self, path, ext):
- if not exists(path):
- raise IOError
- try:
- #print "Opening: %s" % path
- f = open(path)
- self.res_ok(ext)
- self.wfile.write(f.read())
- f.close()
- except Exception,e:
- print "Error!! message: %s" % e
-
-
-def start_server():
- global server
- if libsaria.__dev__ == True:
- server = HTTPServer(('', 4243), HTTPRequest)
- else:
- server = HTTPServer(('', 4242), HTTPRequest)
- server.serve_forever()
-
-def start():
- threads.background(start_server)
-
-def stop():
- server.shutdown()
-
-def check_version():
- if libsaria.__major__ != 4:
- return False
- if libsaria.__minor__ == 4:
- return True
- return False
-
diff --git a/plugins/wm_tweaks.py b/plugins/wm_tweaks.py
deleted file mode 100644
index edbc253c..00000000
--- a/plugins/wm_tweaks.py
+++ /dev/null
@@ -1,39 +0,0 @@
-# Bryan Schumaker (10/30/2010)
-
-import ocarina
-from ocarina import window
-gdk = ocarina.gdk
-libsaria = ocarina.libsaria
-get_attrs = libsaria.sources.get_attrs
-invite = libsaria.event.invite
-
-__NAME__ = "Window Manager Tweaks"
-
-
-def tweak_icon(file):
- if file == None:
- file = "images/ocarina.png"
- gdk.threads_enter()
- window.set_icon(file)
- gdk.threads_leave()
-
-def tweak_title(filepath):
- if filepath != None:
- title = get_attrs("title")
- else:
- title = ocarina.__vers__
- window.set_title(title)
-
-def start():
- invite("POSTLOAD", tweak_title)
- invite("POSTGETART", tweak_icon)
-
-def stop():
- pass
-
-def check_version():
- if libsaria.__major__ != 4:
- return False
- if libsaria.__minor__ == 4:
- return True
- return False
diff --git a/scripts/check_deps.py b/scripts/check_deps.py
deleted file mode 100644
index 6192b52f..00000000
--- a/scripts/check_deps.py
+++ /dev/null
@@ -1,36 +0,0 @@
-# Bryan Schumaker (1 / 22 / 2010)
-# Use this script to check if all required and
-# optional dependencies have been installed
-
-print "Checking for gstreamer"
-import gst
-
-print "Checking for tagpy"
-import tagpy
-
-print "Checking for gobject"
-import gobject
-
-print "Checking for gtk"
-import gtk
-
-print "Checking for pango"
-import pango
-
-print ""
-print "==================="
-print "Basic checks passed"
-print "==================="
-print ""
-
-warning = "WARNING: install %s to use the %s plugin"
-try:
- print "Checking for pynotify"
- import pynotify
-except:
- print warning % ("pynotify", "notify")
-
-try:
- print "Checking for webkit"
-except:
- print warning % ("webkit", "web radio")
diff --git a/scripts/makebin.sh b/scripts/makebin.sh
deleted file mode 100644
index a5d26678..00000000
--- a/scripts/makebin.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-
-PYTHONS=`find /usr/bin/python* | grep -v config | grep -v count`
-
-function gen_ocarina()
-{
- PY=$1
- #OUT="bin/ocarina"
- #echo "#!/bin/bash" > $OUT
- #echo "$PY ocarina.py \$*" >> $OUT
- #chmod +x $OUT
-
- OUT="ocarina.py"
- echo "#!$PY" > $OUT
- echo "import ocarina" >> $OUT
- echo "ocarina.run()" >> $OUT
- chmod +x $OUT
-}
-
-function gen_bin()
-{
- PY=$1
- gen_ocarina $PY
- echo ""
-}
-
-for PY in $PYTHONS
-do
- $PY -c "import gst" 2>/dev/null 1>/dev/null
- if [ "$?" == "0" ]
- then
- echo "Found python version: $PY"
- gen_bin $PY
- break
- fi
-done
diff --git a/scripts/new_release b/scripts/new_release
deleted file mode 100755
index efbd327b..00000000
--- a/scripts/new_release
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-
-if [ $# != 1]
-then
- echo "Usage: scripts/new_release BRANCH_NAME"
- exit 1
-fi
-
-NAME=$1
-echo "Creating new release: $NAME"
-
-git push origin origin:refs/heads/$NAME
-git fetch origin
-git checkout --track -b $NAME origin/$NAME
diff --git a/scripts/tag b/scripts/tag
deleted file mode 100755
index 4812cd65..00000000
--- a/scripts/tag
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-if [ $# != 1 ]
-then
- echo "Usage: scripts/tag TAG"
- exit 1
-fi
-
-git tag -a $1
|