import gobject import gtk import hildon import re import os import gst from daap import DAAPClient class SearchWindow: def delete_event(self, widget, event, data=None): widget.hide () return True def do_search(self, text): found = [] for t in tracks: if re.search(text, "%s %s %s"%(t.name, t.artist, t.album), re.IGNORECASE ): found.append( t ) return found def search_changed(self, widget): self.treeview.set_model(None) self.model.clear() self.play.set_sensitive(False); self.enqueue.set_sensitive(False); if len(widget.get_text()) <= 3: return results = self.do_search (widget.get_text()) for track in results: self.model.append([track.id, "%s - %s"%(track.artist,track.name)]) self.treeview.set_model(self.model) self.play.set_sensitive(True); self.enqueue.set_sensitive(True); def on_play(self, button, now): global mainwindow selection = self.treeview.get_selection() querymodel, iter = selection.get_selected() if iter != None: id = self.model.get(iter, 0) mainwindow.append(id[0], now) if now: self.window.hide() def __init__(self): self.window = hildon.Window() self.window.set_title("Add Song") self.window.set_border_width(10) self.window.connect("delete_event", self.delete_event) vbox = gtk.VBox (False, 0) self.window.add(vbox) box1 = gtk.HBox(False, 0) vbox.pack_start(box1, False, False, 6) searchlabel = gtk.Label("Search song:") box1.pack_start(searchlabel, False, False, 6) self.searchentry = gtk.Entry(0) self.searchentry.connect("changed", self.search_changed) box1.pack_start(self.searchentry, True, True, 6) scrolled = gtk.ScrolledWindow() scrolled.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.treeview = gtk.TreeView() renderer = gtk.CellRendererText() column = gtk.TreeViewColumn("", renderer, text=1) self.treeview.append_column(column) scrolled.add(self.treeview) vbox.pack_start(scrolled, True, True, 6) self.model = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING) bbox = gtk.HButtonBox() self.play = gtk.Button("Play") self.play.set_sensitive(False); self.play.connect("clicked", self.on_play, True) bbox.pack_start(self.play, False, False, 6) self.enqueue = gtk.Button("Enqueue") self.enqueue.set_sensitive(False); self.enqueue.connect("clicked", self.on_play, False) bbox.pack_start(self.enqueue, False, False, 6) vbox.pack_start(bbox, False, False, 6) class MainWindow: def delete_event(self, widget, event, data=None): gtk.main_quit() return False def add (self, button): if self.searchwindow == None: self.searchwindow = SearchWindow() self.searchwindow.window.show_all() self.searchwindow.window.present() def append (self, id, play): global tracks for track in tracks: if track.id == id: self.playmodel.append([track.id, "%s - %s"%(track.artist,track.name)]) if play: selection = self.treeview.get_selection() pos = self.playmodel.iter_n_children(None) print pos iter = self.playmodel.iter_nth_child(None, pos-1) selection.select_iter(iter) self.play() def gst_play (self, filename): bin = gst.parse_launch( "gnomevfssrc location=\"%s\" ! dspmp3sink"%(filename) ) #bin = gst.parse_launch( "gnomevfssrc location=\"%s\" ! gnomevfssink location=\"OUT%s\""%(filename, filename) ) bin.set_state( gst.STATE_PLAYING ) bus = bin.get_bus() bus.enable_sync_message_emission() bus.add_signal_watch() def on_message( bus, message, filename): t = message.type if t == gst.MESSAGE_EOS: os.remove(filename) self.next() bus.connect( "message", on_message, filename) def play (self): global tracks global current global session selection = self.treeview.get_selection() model, iter = selection.get_selected() if iter == None: return id = self.playmodel.get(iter, 0) for t in tracks: if t.id == id[0]: filename = "%s - %s.%s"%(repr(t.artist), repr(t.name), t.type) print session t.save( filename ) self.gst_play (filename) current = iter def on_play (self, button): self.play() def next (self): global current next = self.playmodel.iter_next(current) if next != None: selection = self.treeview.get_selection() selection.select_iter(next) self.play() def __init__(self): self.searchwindow = None window = hildon.Window() window.set_title("Shared music player") window.connect("delete_event", self.delete_event) window.set_border_width(10) vbox = gtk.VBox (False, 0) window.add(vbox) bbox = gtk.HButtonBox() vbox.pack_start(bbox, False, False, 6) play = gtk.Button("Play") play.connect("clicked", self.on_play) stop = gtk.Button("Stop") add = gtk.Button("Add Song") add.connect("clicked", self.add) bbox.pack_start(play, False, False, 6) bbox.pack_start(stop, False, False, 6) bbox.pack_start(add, False, False, 6) scrolled = gtk.ScrolledWindow() scrolled.set_policy (gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.playmodel = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING) self.treeview = gtk.TreeView(self.playmodel) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn("", renderer, text=1) self.treeview.append_column(column) scrolled.add(self.treeview) vbox.pack_start(scrolled, True, True, 6) window.show_all() client = DAAPClient() client.connect("192.168.255.2") session = client.login() databases = session.databases() for d in databases: print "%s: %s"%(d.id, repr(d.name)) current = None tracks = d.tracks() mainwindow = MainWindow() gtk.main()