--- 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()