From 19020e8dae378875c8bfcd7e573ca5e91b1dfa10 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristoffer=20Gr=C3=B6nlund?= Date: Fri, 1 Jan 2010 20:15:03 +0100 Subject: [PATCH] A thousand cuts.. --- jamaui/__init__.py | 6 ++-- jamaui/player.py | 31 +++++++++++++------- jamaui/playerwindow.py | 76 +++++++++++++++++++++++++++++++++--------------- jamaui/postoffice.py | 20 ++++++------- jamaui/showalbum.py | 7 +++-- jamaui/ui.py | 6 ++-- setup.py | 2 +- 7 files changed, 94 insertions(+), 54 deletions(-) diff --git a/jamaui/__init__.py b/jamaui/__init__.py index d930ae4..7e847ff 100644 --- a/jamaui/__init__.py +++ b/jamaui/__init__.py @@ -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") diff --git a/jamaui/player.py b/jamaui/player.py index 3065b10..24ec4f2 100644 --- a/jamaui/player.py +++ b/jamaui/player.py @@ -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!") diff --git a/jamaui/playerwindow.py b/jamaui/playerwindow.py index a017057..01df496 100644 --- a/jamaui/playerwindow.py +++ b/jamaui/playerwindow.py @@ -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('%s/%s songs'%(playlist_pos, playlist_size)) self.track.set_markup('%s'%(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 diff --git a/jamaui/postoffice.py b/jamaui/postoffice.py index 675f9bf..9453176 100644 --- a/jamaui/postoffice.py +++ b/jamaui/postoffice.py @@ -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() diff --git a/jamaui/showalbum.py b/jamaui/showalbum.py index 773db8c..0818d17 100644 --- a/jamaui/showalbum.py +++ b/jamaui/showalbum.py @@ -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: diff --git a/jamaui/ui.py b/jamaui/ui.py index 8b39275..329963b 100644 --- a/jamaui/ui.py +++ b/jamaui/ui.py @@ -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): diff --git a/setup.py b/setup.py index 8c9777e..fdd591e 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ import os import sys data_files = [ - ('share/jamaendo', glob('data/icon_*.png') + ['data/bg.png']), + ('share/jamaendo', glob('data/icon_*.png') + ['data/bg.png', 'data/album.png']), ('share/applications/hildon', ['data/jamaendo.desktop']), ('share/icons/hicolor/26x26/apps', ['data/26x26/jamaendo.png']), ('share/icons/hicolor/40x40/apps', ['data/40x40/jamaendo.png']), -- 1.7.9.5