Update to IMMS 2.0 immsview
authorFabien Ninoles <fabien@tzone.org>
Sun, 07 Dec 2008 16:05:33 -0500
branchimmsview
changeset 39 a26e907b8022
parent 38 785c66feccd3
child 40 7a7e5a853937
Update to IMMS 2.0 Disable player for now.
imms.py
immsview
--- 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)
--- 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()