# HG changeset patch # User Fabien Ninoles # Date 1228683933 18000 # Node ID a26e907b8022d100f060687fccb06550813bb585 # Parent 785c66feccd3275ab63a3410d45f407bc93d3163 Update to IMMS 2.0 Disable player for now. diff -r 785c66feccd3 -r a26e907b8022 imms.py --- a/imms.py Sat Apr 03 13:00:44 2004 -0500 +++ b/imms.py Sun Dec 07 16:05:33 2008 -0500 @@ -1,33 +1,34 @@ import os.path from sys import stderr -import sqlite +from pysqlite2 import dbapi2 as sqlite from utils import sql_quote, unique _log = stderr def rating_to_color(rating): - i = rating - 75 + i = rating red = green = blue = 0 if i <= 25: red = 255 green = i * 255 / 25 - elif i <= 50: - red = (50-i) * 255 / 25 + elif i <= 75: + red = (75-i) * 255 / 50 green = 255 else: green = 255 - blue = (i-50) * 255 / 25 + blue = (i-75) * 255 / 25 + print >>stderr,"Rating:",rating,"R:",red,"G:",green,"B:",blue return "#%02x%02x%02x" % (red, green, blue) class IMMSDb: def __init__(self, dbname = None): if not dbname: - dbname = os.environ['HOME'] + '/.imms/imms.db' + dbname = os.environ['HOME'] + '/.imms/imms2.db' # autocommit = 1 disable autocommit! - self.cx = sqlite.connect(dbname, autocommit = 1, timeout = 5) + self.cx = sqlite.connect(dbname, timeout = 5) self.cu = self.cx.cursor() def get_library_entry(self, **kw): - qry = "SELECT path, uid, sid FROM Library"; + qry = "SELECT path, l.uid, l.sid FROM Library l NATURAL INNER JOIN Identify" first = 1 for key in kw.keys(): if first: @@ -36,7 +37,7 @@ else: qry += " AND " if key in ['uid', 'sid']: - qry += "%s = %d" % (key, kw[key]) + qry += "l.%s = %d" % (key, kw[key]) else: qry += "%s = '%s'" % (key, sql_quote(kw[key])) qry += ";" @@ -54,7 +55,7 @@ def erase_uid(self, uid): self.cu.execute("""BEGIN TRANSACTION; DELETE FROM Library WHERE uid = %d; - DELETE FROM Rating WHERE uid = %d; + DELETE FROM Ratings WHERE uid = %d; DELETE FROM Acoustic WHERE uid = %d; COMMIT;""" % (uid, uid, uid)) def erase_sid(self, sid): @@ -87,11 +88,11 @@ self.cu.execute(qry) return self.cu.fetchall() def get_ratings(self, min = 0, max = 150): - self.cu.execute('''SELECT Rating.uid, Rating.rating - FROM Rating - WHERE Rating.rating >= %d - AND Rating.rating <= %d - ORDER BY Rating.rating;''' % (min, max)) + self.cu.execute('''SELECT Ratings.uid, Ratings.rating + FROM Ratings + WHERE Ratings.rating >= %d + AND Ratings.rating <= %d + ORDER BY Ratings.rating;''' % (min, max)) return self.cu.fetchall() def get_acoustics(self, uids = None): qry = "SELECT uid, bpm, spectrum FROM Acoustic" @@ -151,13 +152,12 @@ res[sid].append(int(uid)) return res def get_ratings_and_paths(self, uids = None): - qry = '''SELECT l.uid, r.rating, l.path, ls.last - FROM Library l, Rating r, Last ls - WHERE l.uid = r.uid AND l.sid = ls.sid''' + qry = '''SELECT i.uid, rating, path, last + FROM Identify i NATURAL INNER JOIN Ratings NATURAL INNER JOIN Library NATURAL INNER JOIN Last''' if uids: - qry += ' AND (l.uid = %d' % (uids.pop()) + qry += ' WHERE (i.uid = %d' % (uids.pop()) for uid in uids: - qry += ' OR l.uid = %d' % uid + qry += ' OR i.uid = %d' % uid qry += ')' qry += ';' self.cu.execute(qry) @@ -178,7 +178,7 @@ return results def get_ratings_and_infos(self): self.cu.execute('''SELECT r.rating, i.artist, i.title - FROM Library l, Rating r, Info i + FROM Library l, Ratings r, Info i WHERE l.uid = r.uid AND l.sid = i.sid;''') return self.cu.fetchall() def clean_info(self): @@ -190,7 +190,7 @@ WHERE sid NOT IN (SELECT sid FROM Library);""") def clean_rating(self): - self.cu.execute("""DELETE FROM Rating + self.cu.execute("""DELETE FROM Ratings WHERE uid NOT IN (SELECT uid FROM Library);""") def clean_acoustic(self): @@ -267,7 +267,7 @@ map(self.check_uid, unique(deleted_uids)) map(self.check_sid, unique(deleted_sids)) ## def clean_rating(self): -## print >> _log, "Clean Rating" +## print >> _log, "Clean Ratings" ## rates = self.db.get_ratings() ## rates = unique(map(lambda x: x[0], rates)) ## map(self.check_uid, rates) diff -r 785c66feccd3 -r a26e907b8022 immsview --- a/immsview Sat Apr 03 13:00:44 2004 -0500 +++ b/immsview Sun Dec 07 16:05:33 2008 -0500 @@ -160,7 +160,6 @@ import gtk import gtk.glade import gettext -import xmms.control import time import Gnuplot from imms import IMMSDb, rating_to_color @@ -171,31 +170,18 @@ _ = gettext.gettext stderr = sys.stderr -class XMMSControl: +class PlayerController: def __getattr__(self, name): - return xmms.control.__dict__[name] - def get_current_file(self): - return self.get_playlist_file( - self.get_playlist_pos()) - def find_in_playlist(self, filename): - for idx in range(self.get_playlist_length()): - if filename == self.get_playlist_file(idx): - return idx - return -1 - def play_file(self, filename): - idx = self.find_in_playlist(filename) - if idx == -1: - self.enqueue_and_play((filename,)) - else: - self.set_playlist_pos(idx) + print >>stderr, "Player don't support", name + return 0 _gdk_colors = [] -for i in range(75,150+1): +for i in range(0,100): _gdk_colors.append(rating_to_color(i)) def gdk_rating_to_color(rate): - rate = min(max(rate,75),150) - return _gdk_colors[rate-75] + rate = min(max(rate,0),100) + return _gdk_colors[rate] # This class must be derived from a GtkTreeModel # with persistent GtkTreeIter !!! @@ -250,7 +236,7 @@ IMMSStore.COL_LAST_STR, strdelay(self.curtime-tune['last']), IMMSStore.COL_RATING_COLOR, gdk_rating_to_color(tune['rating']), IMMSStore.COL_PATHS, tune['path'], - IMMSStore.COL_SELECT, gtk.FALSE) + IMMSStore.COL_SELECT, False) return giter def update(self): self.curtime = time @@ -335,25 +321,28 @@ self.db = db; Gnuplot.Gnuplot.__init__(self) def plot_rate(self): - array = [0] * (150-75+1) + array = [0] * (100+1) for uid, rating in self.db.get_ratings(): - array[rating-75] += 1 - d1 = Gnuplot.Data(range(75,150+1), array, - with='impulses') - d2 = Gnuplot.Data(range(75,150+1), array, + if (rating > 100): + print >>stderr, "Rating for",uid,"is greater than 100:",rating + rating = 100 + array[rating] += 1 + d1 = Gnuplot.Data(range(0,100), array, + with_='impulses') + d2 = Gnuplot.Data(range(0,100), array, smooth = 'bezier') self.plot(d1, d2, title='rate frequency') self.gnuplot.flush() class IMMSView(gtk.TreeView): - def __init__(self, model, xmms): + def __init__(self, model, player): gtk.TreeView.__init__(self, model) - self.xmms = xmms + self.player = player self.create_widgets() def create_widgets(self): renderer = gtk.CellRendererText() renderer.set_property('weight', 700) - renderer.set_property('background-set', gtk.TRUE) + renderer.set_property('background-set', True) column = gtk.TreeViewColumn(_("Rating"), renderer, weight_set = IMMSStore.COL_SELECT, background = IMMSStore.COL_RATING_COLOR, @@ -363,7 +352,7 @@ renderer = gtk.CellRendererText() renderer.set_property('weight', 700) - # renderer.set_property('background-set', gtk.FALSE) + # renderer.set_property('background-set', False) column = gtk.TreeViewColumn(_("Last"), renderer, weight_set = IMMSStore.COL_SELECT, text = IMMSStore.COL_LAST_STR) @@ -372,21 +361,21 @@ column = gtk.TreeViewColumn(_("File"), renderer, weight_set = IMMSStore.COL_SELECT, text = IMMSStore.COL_PATH) - column.set_resizable(gtk.TRUE) + column.set_resizable(True) column.set_sort_column_id(IMMSStore.COL_PATH) self.append_column(column) self.set_search_column(IMMSStore.COL_PATH) - self.set_headers_clickable(gtk.TRUE) + self.set_headers_clickable(True) self.connect('row-activated', self.on_row_activated) def set_current_song(self, song): model = self.get_model() giter = model.find_selected_giter() if giter: model.update_giter(giter) - model.set_value(giter, IMMSStore.COL_SELECT, gtk.FALSE) + model.set_value(giter, IMMSStore.COL_SELECT, False) giter = model.find_giter_from_path(song) if giter: - model.set_value(giter, IMMSStore.COL_SELECT, gtk.TRUE) + model.set_value(giter, IMMSStore.COL_SELECT, True) def select_current_song(self): model = self.get_model() giter = model.find_selected_giter() @@ -417,87 +406,90 @@ giter = model.get_iter(path) fn = self.get_filename(giter) self.set_current_song(fn) - self.xmms.play_file(fn) + self.player.play_file(fn) class IMMSToolbar(gtk.Toolbar): - def __init__(self, iview, xmms, plotter): + def __init__(self, iview, player, plotter): gtk.Toolbar.__init__(self) self.iview = iview - self.xmms = xmms + self.player = player self.plot = plotter self.current_song = '' self.create_widgets() + def create_tool_button(self, label, tooltip, callback): + button = gtk.ToolButton() + button.set_label(label) + button.set_use_underline(True) + button.set_tooltip_text(tooltip) + button.connect('clicked', callback) + button.show() + self.insert(button, -1) def create_widgets(self): - self.append_item(_('Refresh'), _('Refresh list'), - None, None, self.do_refresh) - self.append_item(_('Plot'), _('Show graph of rates'), - None, None, self.do_plot) - self.append_item(_('Current'), _('Get current song'), - None, None, self.do_get_current) - self.append_item(_('Previous'), _('Play previous song'), - None, None, self.do_play_prev) - self.append_item(_('Play'), _('Play selection'), - None, None, self.do_play) - self.append_item(_('Next'), _('Play next song'), - None, None, self.do_play_next) + self.create_tool_button(_('_Refresh'), _('Refresh list'), self.do_refresh) + self.create_tool_button(_('Plo_t'), _('Show graph of rates'), self.do_plot) + self.create_tool_button(_('_Current'), _('Get current song'), self.do_get_current) + self.create_tool_button(_('_Previous'), _('Play previous song'), self.do_play_prev) + self.create_tool_button(_('P_lay'), _('Play selection'), self.do_play) + self.create_tool_button(_('_Next'), _('Play next song'), self.do_play_next) + self.set_show_arrow(True) + self.set_tooltips(True) def do_plot(self, dummy = None): self.plot.plot_rate() def do_refresh(self, dummy = None): self.iview.get_model().update() self.current_song = '' def refresh_current(self): - song = self.xmms.get_current_file() - if song != self.current_song: - try: - self.iview.set_current_song(song) - self.current_song = song - except Exception, e: - print >> stderr, e - return gtk.TRUE +# song = self.player.get_current_file() +# song = self.player.get_current_file() +# if song != self.current_song: +# try: +# self.iview.set_current_song(song) +# self.current_song = song +# except Exception, e: +# print >> stderr, e + return True def do_get_current(self, dummy = None): self.refresh_current() self.iview.select_current_song() def do_play(self, dummy = None): fn = self.iview.get_file_selected() if fn: - self.xmms.play_file(fn) + self.player.play_file(fn) def do_play_prev(self, dummy = None): - self.xmms.playlist_prev() + self.player.playlist_prev() def do_play_next(self, dummy = None): - self.xmms.playlist_next() + self.player.playlist_next() class Application: REFRESH_RATE = 5000 def __init__(self): - self.xmms = XMMSControl() + self.player = PlayerController() self.db = IMMSDb() self.model = IMMSStore(self.db) def main(self): self.create_widgets() - gtk.mainloop() + gtk.main() def create_widgets(self): root = gtk.Window() root.set_title(_("IMMSView")) - root.connect('destroy', gtk.mainquit) + root.connect('destroy', gtk.main_quit) vbox = gtk.VBox(spacing = 3) root.add(vbox) vbox.show() - iview = IMMSView(self.model,self.xmms) + iview = IMMSView(self.model,self.player) scroll = gtk.ScrolledWindow() scroll.add(iview) vbox.pack_end(scroll) iview.show() scroll.show() plotter = IMMSPlot(self.model) - toolbar = IMMSToolbar(iview, self.xmms, plotter) - vbox.pack_start(toolbar, expand = gtk.FALSE) + toolbar = IMMSToolbar(iview, self.player, plotter) + vbox.pack_start(toolbar, expand = False) toolbar.show() root.show() toolbar.do_refresh() - gtk.timeout_add(self.REFRESH_RATE, - IMMSToolbar.refresh_current, - toolbar) + gobject.timeout_add(self.REFRESH_RATE, IMMSToolbar.refresh_current, toolbar) if __name__ == '__main__': app = Application()