A thousand cuts..
authorKristoffer Grönlund <kristoffer.gronlund@purplescout.se>
Fri, 1 Jan 2010 19:15:03 +0000 (20:15 +0100)
committerKristoffer Grönlund <kristoffer.gronlund@purplescout.se>
Sat, 2 Jan 2010 23:37:45 +0000 (00:37 +0100)
jamaui/__init__.py
jamaui/player.py
jamaui/playerwindow.py
jamaui/postoffice.py
jamaui/showalbum.py
jamaui/ui.py
setup.py

index d930ae4..7e847ff 100644 (file)
@@ -25,9 +25,7 @@
 import logging
 import sys
 
-#logging.basicConfig(level=logging.DEBUG, format="%(name)-15s: [%(lineno)4d] %(levelname)-8s %(message)s")
-
 LOG_FILENAME = '/tmp/jamaendo.log'
+LOG_LEVEL = logging.INFO
 
-logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG, format="%(name)-15s: [%(lineno)4d] %(levelname)-8s %(message)s")
-sys.excepthook = lambda *args: logger.critical('Exception:', exc_info=args)
+logging.basicConfig(filename=LOG_FILENAME,level=LOG_LEVEL, format="%(name)-15s: [%(lineno)4d] %(levelname)-8s %(message)s")
index 3065b10..24ec4f2 100644 (file)
@@ -66,12 +66,12 @@ class GStreamer(_Player):
         self.volume_multiplier = 1.
         self.volume_property = None
         self.eos_callback = lambda: self.stop()
-        postoffice.connect('settings-changed', self.on_settings_changed)
+        postoffice.connect('settings-changed', self, self.on_settings_changed)
 
     def on_settings_changed(self, key, value):
         if key == 'volume':
             self._set_volume_level(value)
-        #postoffice.disconnect(self.on_settings_changed)
+        #postoffice.disconnect(self)
 
 
     def play_url(self, filetype, uri):
@@ -108,7 +108,7 @@ class GStreamer(_Player):
             return self.STATES.get(state, 'none')
         return 'none'
 
-    def _get_position_duration(self):
+    def get_position_duration(self):
         try:
             pos_int = self.player.query_position(self.time_format, None)[0]
             dur_int = self.player.query_duration(self.time_format, None)[0]
@@ -129,10 +129,11 @@ class GStreamer(_Player):
         if self.player:
             self.player.set_state(gst.STATE_PAUSED)
 
-    def stop(self):
+    def stop(self, reset = True):
         if self.player:
             self.player.set_state(gst.STATE_NULL)
-            self.player = None
+            if reset:
+                self.player = None
 
     def _maemo_setup_playbin2_player(self, url):
         self.player = gst.parse_launch("playbin2 uri=%s" % (url,))
@@ -341,16 +342,23 @@ class Player(object):
         self.backend.set_eos_callback(self._on_eos)
         self.playlist = Playlist()
 
+    def get_position_duration(self):
+        return self.backend.get_position_duration()
+
     def play(self, playlist = None):
         if playlist:
             self.playlist = playlist
         elif self.playlist is None:
             self.playlist = Playlist()
         if self.playlist.size():
-            if self.playlist.has_next():
-                entry = self.playlist.next()
+            if self.playlist.current():
+                entry = self.playlist.current()
+                self.backend.play_url('mp3', entry.mp3_url())
                 log.debug("playing %s", entry)
+            elif self.playlist.has_next():
+                entry = self.playlist.next()
                 self.backend.play_url('mp3', entry.mp3_url())
+                log.debug("playing %s", entry)
 
     def pause(self):
         self.backend.pause()
@@ -363,16 +371,19 @@ class Player(object):
 
     def next(self):
         if self.playlist.has_next():
-            self.stop()
-            self.play()
+            self.backend.stop(reset=False)
+            entry = self.playlist.next()
+            self.backend.play_url('mp3', entry.mp3_url())
+            log.debug("playing %s", entry)
         else:
             self.stop()
 
     def prev(self):
         if self.playlist.has_prev():
+            self.backend.stop(reset=False)
             entry = self.playlist.prev()
-            log.debug("playing %s", entry)
             self.backend.play_url('mp3', entry.mp3_url())
+            log.debug("playing %s", entry)
 
     def _on_eos(self):
         log.debug("EOS!")
index a017057..01df496 100644 (file)
@@ -32,14 +32,14 @@ import logging
 log = logging.getLogger(__name__)
 
 class PlayerWindow(hildon.StackableWindow):
-    def __init__(self, playlist=None):
+    def __init__(self):
         hildon.StackableWindow.__init__(self)
         self.set_title("jamaendo")
 
         self.connect('destroy', self.on_destroy)
 
-        self.playlist = Playlist(playlist)
         self.player = the_player
+        self.playlist = the_player.playlist
 
         vbox = gtk.VBox()
 
@@ -58,12 +58,7 @@ class PlayerWindow(hildon.StackableWindow):
         self.artist = gtk.Label()
         self.album = gtk.Label()
 
-        if self.player.playlist.current_index() > -1:
-            pl = self.player.playlist
-            track = pl.current()
-            self.set_labels(track.name, track.artist_name, track.album_name, pl.current_index(), pl.size())
-        else:
-            self.set_labels('', '', '', 0, 0)
+        self.set_labels('', '', '', 0, 0)
 
         self._position_timer = None
 
@@ -84,8 +79,7 @@ class PlayerWindow(hildon.StackableWindow):
         vbox.pack_end(btns, False, True, 0)
 
         self.add_stock_button(btns, gtk.STOCK_MEDIA_PREVIOUS, self.on_prev)
-        self.add_stock_button(btns, gtk.STOCK_MEDIA_PLAY, self.on_play)
-        self.add_stock_button(btns, gtk.STOCK_MEDIA_PAUSE, self.on_pause)
+        self.add_play_button(btns)
         self.add_stock_button(btns, gtk.STOCK_MEDIA_STOP, self.on_stop)
         self.add_stock_button(btns, gtk.STOCK_MEDIA_NEXT, self.on_next)
 
@@ -98,25 +92,54 @@ class PlayerWindow(hildon.StackableWindow):
         hbox.pack_start(self.volume, False)
         self.add(vbox)
 
-        postoffice.connect('album-cover', self.set_album_cover)
+        postoffice.connect('album-cover', self, self.set_album_cover)
 
         #print "Created player window, playlist: %s" % (self.playlist)
 
+        self.update_state()
+        self.update_play_button()
+
     def get_album_id(self):
         if self.playlist and self.playlist.current_index() > -1:
             return self.playlist.current().album_id
         return None
 
     def on_destroy(self, wnd):
-        postoffice.disconnect('album-cover', self.set_album_cover)
+        self.stop_position_timer()
+        postoffice.disconnect('album-cover', self)
 
     def add_stock_button(self, btns, stock, cb):
         btn = hildon.GtkButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
         btn.set_relief(gtk.RELIEF_NONE)
-        btn.set_image(gtk.image_new_from_stock(stock, gtk.ICON_SIZE_SMALL_TOOLBAR))
+        sz = gtk.ICON_SIZE_BUTTON
+        btn.set_image(gtk.image_new_from_stock(stock, sz))
         btn.connect('clicked', cb)
         btns.add(btn)
 
+    def add_play_button(self, btns):
+        sz = gtk.ICON_SIZE_BUTTON
+        self.playimg = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PLAY, sz)
+        self.pauseimg = gtk.image_new_from_stock(gtk.STOCK_MEDIA_PAUSE, sz)
+        btn = hildon.GtkButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
+        btn.set_relief(gtk.RELIEF_NONE)
+        if self.player.playing():
+            btn.set_image(self.pauseimg)
+            btn.set_data('state', 'pause')
+        else:
+            btn.set_image(self.playimg)
+            btn.set_data('state', 'play')
+        btn.connect('clicked', self.on_play)
+        btns.add(btn)
+        self.playbtn = btn
+
+    def update_play_button(self):
+        if self.player.playing():
+            self.playbtn.set_image(self.pauseimg)
+            self.playbtn.set_data('state', 'pause')
+        else:
+            self.playbtn.set_image(self.playimg)
+            self.playbtn.set_data('state', 'play')
+
     def set_labels(self, track, artist, album, playlist_pos, playlist_size):
         self.playlist_pos.set_markup('<span size="small">%s/%s songs</span>'%(playlist_pos, playlist_size))
         self.track.set_markup('<span size="x-large">%s</span>'%(track))
@@ -178,19 +201,25 @@ class PlayerWindow(hildon.StackableWindow):
                 self.cover.set_from_file(cover)
 
     def play_tracks(self, tracks):
-        self.playlist = Playlist(tracks)
+        self.stop_position_timer()
         self.clear_position()
-        self.start_position_timer()
+        self.playlist = Playlist(tracks)
+        self.player.stop()
         self.player.play(self.playlist)
         self.update_state()
+        self.update_play_button()
 
     def on_play(self, button):
-        self.player.play(self.playlist)
-        self.start_position_timer()
-        self.update_state()
-    def on_pause(self, button):
-        self.stop_position_timer()
-        self.player.pause()
+        if not self.player.playing():
+            self.player.play(self.playlist)
+            self.start_position_timer()
+            self.update_state()
+            self.update_play_button()
+        else:
+            self.stop_position_timer()
+            self.player.pause()
+            self.update_state()
+            self.update_play_button()
     def on_prev(self, button):
         self.player.prev()
         self.update_state()
@@ -201,8 +230,9 @@ class PlayerWindow(hildon.StackableWindow):
         self.stop_position_timer()
         self.clear_position()
         self.player.stop()
+        self.update_play_button()
 
-def open_playerwindow(tracks=None):
-    player = PlayerWindow(tracks)
+def open_playerwindow():
+    player = PlayerWindow()
     player.show_all()
     return player
index 675f9bf..9453176 100644 (file)
@@ -35,26 +35,24 @@ class PostOffice(object):
     def notify(self, tag, *data):
         clients = self.tags.get(tag)
         if clients:
-            log.debug("(%s %s) -> [%s]",
-                      tag,
-                      " ".join(str(x) for x in data),
-                      " ".join(str(x) for x in clients))
-            for client in clients:
+            #log.debug("(%s %s) -> [%s]",
+            #          tag,
+            #          " ".join(str(x) for x in data),
+            #          " ".join(repr(x) for x,_ in clients))
+            for ref, client in clients:
                 client(*data)
 
-    def connect(self, tag, callback):
+    def connect(self, tag, ref, callback):
         if tag not in self.tags:
             self.tags[tag] = []
         clients = self.tags[tag]
         if callback not in clients:
-            clients.append(callback)
+            clients.append((ref, callback))
 
-    def disconnect(self, tag, callback):
+    def disconnect(self, tag, ref):
         if tag not in self.tags:
             self.tags[tag] = []
-        clients = self.tags[tag]
-        if callback in clients:
-            clients.remove(callback)
+        self.tags[tag] = [(_ref, cb) for _ref, cb in self.tags[tag] if _ref != ref]
 
 postoffice = PostOffice()
 
index 773db8c..0818d17 100644 (file)
@@ -45,6 +45,9 @@ class ShowAlbum(hildon.StackableWindow):
         top_hbox = gtk.HBox()
         vbox1 = gtk.VBox()
         self.cover = gtk.Image()
+        tmp = util.find_resource('album.png')
+        if tmp:
+            self.cover.set_from_file(tmp)
         self.bbox = gtk.HButtonBox()
         self.bbox.set_property('layout-style', gtk.BUTTONBOX_SPREAD)
         self.goto_artist = self.make_imagebutton('artist', self.on_goto_artist)
@@ -82,13 +85,13 @@ class ShowAlbum(hildon.StackableWindow):
 
         self.add(top_hbox)
 
-        postoffice.connect('album-cover', self.on_album_cover)
+        postoffice.connect('album-cover', self, self.on_album_cover)
         postoffice.notify('request-album-cover', self.album.ID, 300)
 
         self.show_all()
 
     def on_destroy(self, wnd):
-        postoffice.disconnect('album-cover', self.on_album_cover)
+        postoffice.disconnect('album-cover', self)
 
     def on_album_cover(self, albumid, size, cover):
         if albumid == self.album.ID and size == 300:
index 8b39275..329963b 100644 (file)
@@ -94,7 +94,7 @@ class Jamaui(object):
         settings.set_filename(os.path.join(self.CONFDIR, 'ui_settings'))
         settings.load()
 
-        postoffice.connect('request-album-cover', self.on_request_cover)
+        postoffice.connect('request-album-cover', self, self.on_request_cover)
         log.debug("Created main window.")
 
     def save_settings(self):
@@ -193,7 +193,7 @@ class Jamaui(object):
     #    self.bbox.add(btn)
 
     def destroy(self, widget):
-        postoffice.disconnect('request-album-cover', self.on_request_cover)
+        postoffice.disconnect('request-album-cover', self)
         gtk.main_quit()
 
     def show_about(self, w, win):
@@ -309,7 +309,7 @@ JAMENDO is an online platform that distributes musical works under Creative Comm
         self.favoriteswnd.show_all()
 
     def on_player(self, button):
-        open_playerwindow([])
+        open_playerwindow()
 
     '''
     def on_search(self, button):
index 8c9777e..fdd591e 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -32,7 +32,7 @@ import os
 import sys\r
 \r
 data_files = [\r
-    ('share/jamaendo', glob('data/icon_*.png') + ['data/bg.png']),\r
+    ('share/jamaendo', glob('data/icon_*.png') + ['data/bg.png', 'data/album.png']),\r
     ('share/applications/hildon', ['data/jamaendo.desktop']),\r
     ('share/icons/hicolor/26x26/apps', ['data/26x26/jamaendo.png']),\r
     ('share/icons/hicolor/40x40/apps', ['data/40x40/jamaendo.png']),\r