diff --git a/bin/ascoltami b/bin/ascoltami --- a/bin/ascoltami +++ b/bin/ascoltami @@ -29,6 +29,7 @@ from twisted.web import xmlrpc, server import run_local from light9 import networking, showconfig, wavelength +from light9.namespaces import L9, MUS from pympd import Mpd @@ -67,9 +68,10 @@ class XMLRPCServe(xmlrpc.XMLRPC): def xmlrpc_songlength(self): """song length, in seconds""" return float(self.player.total_time.get()) - def xmlrpc_songname(self): - """song filename, or None""" - return self.player.filename_var.get() or "No song" + + def xmlrpc_song_uri(self): + """song URI, or None""" + return self.player.song_uri.encode('utf8') or "No song" class Player: """semprini-style access to mpd. in here is where we add the padding""" @@ -85,6 +87,7 @@ class Player: self.current_time = tk.DoubleVar() self.total_time = tk.DoubleVar() self.filename_var = tk.StringVar() + self.song_uri = None self.pre_post_names = showconfig.prePostSong() @@ -150,24 +153,25 @@ class Player: finally: reactor.callLater(.05, self.pollStatus) - def set_total_time(self, song_path): + def set_total_time(self, song): # currently only good for .wav - p = os.path.join(showconfig.musicDir(), song_path) + p = showconfig.songOnDisk(song) self.total_time.set(wavelength.wavelength(p)) - def play(self, song_path=None): - if song_path is None: + def play(self, song=None): + if song is None: self.mpd.play() return self.autopausedthissong = False self.mpd.clear() - self.mpd.add(showconfig.songInMpd(self.pre_post_names[0])) - self.mpd.add(showconfig.songInMpd(song_path)) - self.mpd.add(showconfig.songInMpd(self.pre_post_names[1])) - self.filename_var.set(song_path) + self.mpd.add(showconfig.songInMpd(MUS['preSong'])) + self.mpd.add(showconfig.songInMpd(song)) + self.mpd.add(showconfig.songInMpd(MUS['postSong'])) + self.filename_var.set(graph.value(song, L9['showPath'])) + self.song_uri = song - self.set_total_time(song_path) + self.set_total_time(song) self.mpd.seek(seconds=0, song=0) def check_autopause(self): @@ -204,23 +208,20 @@ class Player: self.mpd.pause() -def buildsonglist(root,songfiles,player): +def buildsonglist(root, graph, songs, player): songlist=tk.Frame(root,bd=2,relief='raised',bg='black') - prefixlen=len(os.path.commonprefix(songfiles)) - # include to the last os.sep- dont crop path elements in the middle - prefixlen=songfiles[0].rfind(os.sep)+1 - maxsfwidth=max([len(x[prefixlen:]) for x in songfiles]) + maxsfwidth=max([len(graph.label(song)) for song in songs]) - for i,sf in enumerate(songfiles): - b=tk.Button(songlist,text=sf[prefixlen:],width=maxsfwidth, + for i,song in enumerate(songs): + b=tk.Button(songlist,text=graph.label(song),width=maxsfwidth, anchor='w',pady=0,bd=0,relief='flat', font="arial 14 bold") b.bind("",lambda ev,b=b: b.config(font="arial %d bold" % min(12,int((ev.height-3)*.8)))) try: # rainbow colors - frac=i/len(songfiles) + frac=i/len(songs) b.config(bg='black', fg="#%02x%02x%02x" % tuple([int(255*(.7+.3* math.sin(frac*4+x)) @@ -228,13 +229,13 @@ def buildsonglist(root,songfiles,player) except Exception,e: print "rainbow failed: %s"%e - b.config(command=lambda sf=sf: player.play(sf)) + b.config(command=lambda song=song: player.play(song)) b.pack(side='top',fill='both',exp=1,padx=0,pady=0,ipadx=0,ipady=0) - def color_buttons(x, y, z, sf=sf, b=b): + def color_buttons(x, y, z, song=song, b=b): name = player.filename_var.get() - if name == sf[prefixlen:]: + if name == graph.value(song, L9['showPath']): b['bg'] = 'grey50' else: b['bg'] = 'black' @@ -391,10 +392,14 @@ parser=OptionParser() (options,songfiles)=parser.parse_args() +graph = showconfig.getGraph() + if len(songfiles)<1: - songfiles = [f for f in os.listdir(showconfig.musicDir()) - if f.endswith('wav')] - songfiles.sort() + graph = showconfig.getGraph() + playList = graph.value(L9['show/dance2007'], L9['playList']) + songs = list(graph.items(playList)) +else: + raise NotImplementedError("don't know how to make rdf song nodes from cmdline song paths") root=tk.Tk() root.wm_title("ascoltami") @@ -402,7 +407,7 @@ root.wm_title("ascoltami") root.config(bg="black") player=Player(None,None) -songlist = buildsonglist(root,songfiles,player) +songlist = buildsonglist(root, graph, songs, player) songlist.pack(fill='both',exp=1) f2 = tk.Frame(bg='black')