diff --git a/Makefile b/Makefile deleted file mode 100644 index beae3a4d..00000000 --- a/Makefile +++ /dev/null @@ -1,24 +0,0 @@ - -all: ocarina.py - ./ocarina.py - -ocarina.py: - sh scripts/makebin.sh - -clean: - rm `find . | grep .pyc` - rm ocarina.py - -install: - cd /opt/ && git clone git://lavos.homelinux.com/ocarina.git - cd /opt/ocarina && make ocarina.py - cd /usr/bin && ln -sf /opt/ocarina/bin/ocarina . - -uninstall: - rm -rIf /opt/ocarina - rm -f /usr/bin/ocarina - -update: - cd /opt/ocarina && make clean - cd /opt/ocarina && git pull - cd /opt/ocarina && make ocarina.py diff --git a/bin/ocarina b/bin/ocarina deleted file mode 100755 index 9a90fd06..00000000 --- a/bin/ocarina +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -cd /opt/ocarina && `which python2` ocarina.py $* diff --git a/html/album.py b/html/album.py deleted file mode 100644 index 6739e0eb..00000000 --- a/html/album.py +++ /dev/null @@ -1,61 +0,0 @@ -# Bryan Schumaker (11/17/2010) - -from libsaria.sources import library -from libsaria import path -splitext = path.splitext - -def header(wfile): - wfile.write("") - wfile.write("\n") - wfile.write("\n") - wfile.write("") - -def footer(wfile): - wfile.write("") - -def body(wfile, args): - artist = library.tag_tree[args["artist"]].value - album = library.tag_tree[args["artist"]][args["album"]].value - wfile.write("") - - wfile.write("") - - img_ar = artist.replace("/", "%2F") - img_al = album.replace("/", "%2F") - wfile.write("") - - wfile.write("
") - wfile.write("" % album) - wfile.write("" % artist) - wfile.write("
%s
by %s
") - wfile.write("") - wfile.write("
") - wfile.write("" % (img_ar, img_al)) - wfile.write("
") - wfile.write("
") - wfile.write("
\n") - - titles = [] - for title, key in library.titles(args["artist"], args["album"]): - sid = library.song_id(args["artist"], args["album"], key) - track = library.get_attrs(sid, "track") - titles += [(track, sid, title)] - titles.sort() - tags = "\n" - for id, sid, title in titles: - wfile.write(tags % (id, sid, title)) - wfile.write("
%s.%s
") - - -def to_html(wfile, args): - header(wfile) - body(wfile, args) - footer(wfile) diff --git a/html/controls.html b/html/controls.html deleted file mode 100644 index 37c26612..00000000 --- a/html/controls.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - -
- - - - - - - -
- - - - - - diff --git a/html/controls.js b/html/controls.js deleted file mode 100644 index fcb74eb9..00000000 --- a/html/controls.js +++ /dev/null @@ -1,46 +0,0 @@ -// Bryan Schumaker (12 / 27 / 2010) - -function control(action) -{ - send_request("RPC/" + action); -} - -function play() -{ - control("play"); -} - -function load_id(id) -{ - control("load&id="+id); -} - -function pause() -{ - control("pause"); -} - -function stop() -{ - control("stop"); -} - -function next() -{ - control("next"); -} - -function forward() -{ - control("forward"); -} - -function rewind() -{ - control("rewind"); -} - -function play_id(id) -{ - control("play_id/" + id) -} diff --git a/html/controls.py b/html/controls.py deleted file mode 100644 index 49e2458d..00000000 --- a/html/controls.py +++ /dev/null @@ -1,52 +0,0 @@ -# Bryan Schumaker (11/18/2010) - -import libsaria.audio -import libsaria.sources -import ocarina - -controls = libsaria.controls - -play = controls.play -pause = controls.pause -stop = controls.stop -next = controls.next -attrs = libsaria.sources.get_attrs -load_id = libsaria.sources.library.load_id - -playing = controls.playing -forward = controls.seek_forward -rewind = controls.seek_backward - -def to_html(wfile, args): - action = args["a"] - ret = False - if action == "play": - ret = play() - elif action == "pause": - ret = pause() - elif action == "stop": - ret = stop() - elif action == "next": - ret = next() - elif action == "forward": - ret = forward() - elif action == "rewind": - ret = rewind() - elif action == "version": - ret = ocarina.__vers__ - elif action == "uptime": - ret = ocarina.now() - ocarina.__start__ - elif action == "title": - ret = attrs("title") - elif action == "album": - ret = "from %s" % attrs("album") - elif action == "artist": - ret = "by %s" % attrs("artist") - elif action == "playing": - ret = playing() - elif action == "load": - load_id(int(args['id'])) - play() - #else: - # print action, args - wfile.write(str(ret)) diff --git a/html/favicon.ico b/html/favicon.ico deleted file mode 100644 index adc4a6d9..00000000 Binary files a/html/favicon.ico and /dev/null differ diff --git a/html/images/forward.png b/html/images/forward.png deleted file mode 100644 index c1d49403..00000000 Binary files a/html/images/forward.png and /dev/null differ diff --git a/html/images/next.png b/html/images/next.png deleted file mode 100644 index 10081fdc..00000000 Binary files a/html/images/next.png and /dev/null differ diff --git a/html/images/pause.png b/html/images/pause.png deleted file mode 100644 index 36fe26b3..00000000 Binary files a/html/images/pause.png and /dev/null differ diff --git a/html/images/play.png b/html/images/play.png deleted file mode 100644 index 90e05922..00000000 Binary files a/html/images/play.png and /dev/null differ diff --git a/html/images/rewind.png b/html/images/rewind.png deleted file mode 100644 index f448b2eb..00000000 Binary files a/html/images/rewind.png and /dev/null differ diff --git a/html/images/stop.png b/html/images/stop.png deleted file mode 100644 index fe0e7766..00000000 Binary files a/html/images/stop.png and /dev/null differ diff --git a/html/index.html b/html/index.html deleted file mode 100644 index f2434f13..00000000 --- a/html/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - -
Library Browser
- - - - - diff --git a/html/library.py b/html/library.py deleted file mode 100644 index 5810f6d1..00000000 --- a/html/library.py +++ /dev/null @@ -1,24 +0,0 @@ -# Bryan Schumaker -import libsaria -library = libsaria.sources.library -walk = library.walk -get_attrs = library.get_attrs - -def header(wfile): - wfile.write("") - -def footer(wfile): - wfile.write("") - -def body(wfile): - link = "%s
" - for artist, ar_key in library.artists(): - wfile.write("

%s

" % artist) - for album, al_key in library.albums(ar_key): - wfile.write(link % (ar_key, al_key, album)) - #wfile.write("%s
" % album) - -def to_html(wfile, args): - header(wfile) - body(wfile) - footer(wfile) diff --git a/html/library2.py b/html/library2.py deleted file mode 100644 index 5f3c0af7..00000000 --- a/html/library2.py +++ /dev/null @@ -1,45 +0,0 @@ -# Bryan Schumaker (12 / 26 / 2010) - -import libsaria -library = libsaria.sources.library -walk = library.walk -get_attrs = library.get_attrs - -cols = [("Title", 400), ("Length", 60), ("Artist", 200), ("Album", 200), ("Year", 50)] - -def header(wfile): - wfile.write("") - -def footer(wfile): - wfile.write("") - -def content_header(wfile): - wfile.write("") - for col, width in cols: - wfile.write("" % (width, col)) - wfile.write("
%s
") - wfile.write("
") - -def body(wfile): - wfile.write("header stuff goes here") - content_header(wfile) - wfile.write("
") - wfile.write("") - colors = ["white", "aliceblue"] - i = 0 - for id in walk(): - wfile.write("") - for index, attr in enumerate(get_attrs(id, "title", "lenstr", "artist", "album", "year")): - wfile.write("" % (cols[index][1], colors[i], attr)) - wfile.write("") - if i == 0: - i = 1 - else: - i = 0 - wfile.write("
%s
") - wfile.write("footer stuff goes here") - -def to_html(wfile, args): - header(wfile) - body(wfile) - footer(wfile) diff --git a/html/test.js b/html/test.js deleted file mode 100644 index 3b57f8c5..00000000 --- a/html/test.js +++ /dev/null @@ -1,5 +0,0 @@ - -function message() -{ - document.getElementById("bryan").innerHTML = "Internal javascript test!"; -} diff --git a/html/test.py b/html/test.py deleted file mode 100644 index a19c8bd2..00000000 --- a/html/test.py +++ /dev/null @@ -1,25 +0,0 @@ -# Bryan Schumaker -import libsaria -library = libsaria.sources.library -walk = library.walk -get_attrs = library.get_attrs - -def header(wfile): - wfile.write("") - -def footer(wfile): - wfile.write("") - -def body(wfile): - wfile.write("") - for id in library.walk(): - #attrs = get_attrs(id, "id", "title", "lenstr", "artist", "album", "year") - artist, album, title = library.get_attrs(id, "artist", "album", "title") - wfile.write("" % (artist, album, title)) - wfile.write("
%s%s%s
") - #wfile.write("Python!!!") - -def to_html(wfile): - header(wfile) - body(wfile) - footer(wfile) diff --git a/html/utils.js b/html/utils.js deleted file mode 100644 index 3fc1bcc7..00000000 --- a/html/utils.js +++ /dev/null @@ -1,38 +0,0 @@ -// Bryan Schumaker (12 / 27 / 2010) - -function set_attr(attr, id) -{ - var req = new XMLHttpRequest(); - req.onreadystatechange = function() - { - if (req.readyState == 4 && req.status == 200) - { - document.getElementById(id).innerHTML = req.responseText; - } - } - - req.open('GET', "controls.py?a=" + attr, true); - req.send(); - setTimeout("set_attr(\"" + attr + "\", \"" + id + "\")", 3000) -} - -function set_attr_once(attr, id) -{ - var req = new XMLHttpRequest(); - req.onreadystatechange = function() - { - if (req.readyState == 4 && req.status == 200) - { - document.getElementById(id).innerHTML = req.responseText; - } - } - req.open('GET', "controls.py?a=" + attr, true); - req.send(); -} - -function send_request(url) -{ - var http = new XMLHttpRequest(); - http.open('GET', url, true); - http.send(); -} diff --git a/html/web_radio.html b/html/web_radio.html deleted file mode 100644 index bda3ba11..00000000 --- a/html/web_radio.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - -
- - - - - - - - - - - -
Select a radio station
Pandora
Grooveshark
- - - - - 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("" % (id, id, title)) - write("\n" % (artist, album)) - if color == "white": - color = "aliceblue" - else: - color = "white" - write("
%s%s%s
") - -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