diff --git a/plugins/remote.py b/plugins/remote.py new file mode 100644 index 00000000..23dd86a2 --- /dev/null +++ b/plugins/remote.py @@ -0,0 +1,108 @@ +# Bryan Schumaker (11/13/2010) + +import socket +import libsaria +from libsaria import threads + +server = None + +def play_id(arg): + id = int(arg[0]) + print "Trying to play id: %s" % id + libsaria.collection.library.play_id(id) + +def play(*args): + libsaria.audio.play() + +def pause(*args): + libsaria.audio.pause() + +def stop(*args): + libsaria.audio.stop() + +def next(*args): + print libsaria.collection + libsaria.collection.plist_next() + +procs = {"play_id":play_id, "play":play, "pause":pause, "stop":stop, "next":next} + +def decode_len(msg): + size, msg = msg.split(' ', 1) + return int(size), msg + +def decode_op(msg): + op_len, msg = msg.split(' ', 1) + op = msg[:int(op_len)] + return op, msg[int(op_len) + 1:] + +def decode_args(msg): + if msg == "0": + return [] + n_args, msg = msg.split(' ', 1) + n_args = n_args + args = [] + for i in xrange(int(n_args)): + arg_len, msg = msg.split(' ', 1) + args.append(msg[:int(arg_len)]) + msg = msg[int(arg_len) + 1:] + return args + + +def decode(text): + try: + print "Decoding: %s" % text + size, msg = decode_len(text) + if size != len(msg): + print "Message is wrong length!" + return + except: + print "There was a problem receiving the message" + return + try: + op, msg = decode_op(msg) + except: + print "There was a problem decoding the operation" + return + try: + args = decode_args(msg) + except: + print "There was a problem decoding the argumets" + return + try: + procs[op](args) + except: + print "There was a problem running the operation" + return + +def serve(): + while 1: + try: + (client, address) = server.accept() + message = client.recv(4096) + decode(message) + except: + break + +def start_server(): + global server + # Set up a socket + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + server.bind(("localhost", 4242)) + except: + print "Could not open port 4242" + server.listen(5) + serve() + +def start(): + threads.background(start_server) + +def stop(): + server.shutdown(socket.SHUT_RDWR) + +def check_version(): + if libsaria.__major__ != 1: + return False + if libsaria.__minor__ >= 2: + return True + return False diff --git a/remote.py b/remote.py new file mode 100755 index 00000000..abff0cc2 --- /dev/null +++ b/remote.py @@ -0,0 +1,24 @@ +#!/usr/bin/python2 +# Bryan Schumaker (11/13/2010) + +import remote +from remote.gui import buttons +gtk = remote.gtk + +win = remote.window() +win.resize(1,1) + +vbox = gtk.VBox() +vbox.show() + +button_box = gtk.HBox() +button_box.show() +button_box.pack_start(buttons.PlayButton(), False, False) +button_box.pack_start(buttons.PauseButton(), False, False) +button_box.pack_start(buttons.StopButton(), False, False) +button_box.pack_start(buttons.NextButton(), False, False) + +vbox.pack_start(button_box, False, False) +win.add(vbox) + +remote.start() diff --git a/remote/__init__.py b/remote/__init__.py new file mode 100644 index 00000000..f5f537a3 --- /dev/null +++ b/remote/__init__.py @@ -0,0 +1,51 @@ +# Bryan Schumaker (11/13/2010) + +import gtk +import socket + +win = None + +def send(text): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect( ("localhost", 4242) ) + total_sent = 0 + length = len(text) + while total_sent < length: + sent = s.send(text[total_sent:]) + if sent == 0: + print "Socket connection broken :(" + return + total_sent += sent + +def encode(func): + op, args = func.split('(', 1) + args = args[:len(args)-1] + args = args.split(',') + msg = "%s %s" % (len(op), op) + msg_args = "" + n_args = 0 + for arg in args: + arg = arg.strip() + if len(arg) > 0: + msg_args += " %s %s" % (len(arg), arg) + n_args += 1 + msg = msg.strip() + args = msg_args.strip() + msg = "%s %s %s" % (msg, n_args, args) + msg = msg.strip() + return "%s %s" % (len(msg), msg) + # msg_len op_len op n_args arg1_len arg1 arg2_len arg2 + + +def start(): + gtk.main() + +def quit(*args): + gtk.main_quit() + +def window(): + global win + if win == None: + from gui import window + win = window.get_window() + return win diff --git a/remote/gui/__init__.py b/remote/gui/__init__.py new file mode 100644 index 00000000..cdc2ffed --- /dev/null +++ b/remote/gui/__init__.py @@ -0,0 +1,3 @@ +# Bryan Schumaker (11/13/2010) + +__all__ = ["window", "buttons"] diff --git a/remote/gui/buttons.py b/remote/gui/buttons.py new file mode 100644 index 00000000..cab304d3 --- /dev/null +++ b/remote/gui/buttons.py @@ -0,0 +1,75 @@ +# Bryan Schumaker (11/13/2010) +import remote +gtk = remote.gtk + +play_button = None +pause_button = None + +def set_state_playing(): + play_button.hide() + pause_button.show() + +def set_state_paused(): + play_button.show() + pause_button.hide() + +from remote import procs + +class Button(gtk.Button): + def __init__(self, stock, size=gtk.ICON_SIZE_DIALOG, func=None, show=True): + gtk.Button.__init__(self) + self.func = func + img = gtk.image_new_from_stock(stock, size) + img.show() + self.add(img) + self.set_relief(gtk.RELIEF_NONE) + self.click_id = self.connect("clicked", self.clicked) + if show == True: + Button.show(self) + self.set_alignment(0,0) + + def clicked(self, button): + self.func() + + def show(self, *args): + gtk.Button.show(self) + + def hide(self, *args): + gtk.Button.hide(self) + + +class PlayButton(Button): + def __init__(self): + global play_button + Button.__init__(self, gtk.STOCK_MEDIA_PLAY) + play_button = self + def clicked(self, button): + procs.play() + def hide(self): + Button.hide(self) + def show(self): + Button.show(self) + +class PauseButton(Button): + def __init__(self): + global pause_button + Button.__init__(self, gtk.STOCK_MEDIA_PAUSE, show=False) + pause_button = self + def clicked(self, button): + procs.pause() + def hide(self): + Button.hide(self) + def show(self): + Button.show(self) + +class StopButton(Button): + def __init__(self): + Button.__init__(self, gtk.STOCK_MEDIA_STOP) + def clicked(self, button): + procs.stop() + +class NextButton(Button): + def __init__(self): + Button.__init__(self, gtk.STOCK_MEDIA_NEXT) + def clicked(self, button): + procs.next() diff --git a/remote/gui/window.py b/remote/gui/window.py new file mode 100644 index 00000000..9c8a4f40 --- /dev/null +++ b/remote/gui/window.py @@ -0,0 +1,10 @@ +# Bryan Schumaker (11/13/2010) + +import gtk +import remote + +def get_window(): + win = gtk.Window() + win.connect("delete-event", remote.quit) + win.show() + return win diff --git a/remote/procs.py b/remote/procs.py new file mode 100644 index 00000000..61a92803 --- /dev/null +++ b/remote/procs.py @@ -0,0 +1,27 @@ +# Bryan Schumaker (11/13/2010) + +import remote +from remote.gui.buttons import set_state_playing, set_state_paused + +send = remote.send +encode = remote.encode + +def remote_call(func): + msg = encode(func) + res = send(msg) + print "Encoded message: %s" % msg + +def play(): + remote_call("play()") + set_state_playing() + +def pause(): + remote_call("pause()") + set_state_paused() + +def stop(): + remote_call("stop()") + set_state_paused() + +def next(): + remote_call("next()")