=== modified file 'xl/player/engine_normal.py' --- xl/player/engine_normal.py 2009-07-09 23:34:03 +0000 +++ xl/player/engine_normal.py 2009-07-14 14:05:04 +0000 @@ -70,6 +70,13 @@ """ if message.type == gst.MESSAGE_TAG and self.tag_func: self.tag_func(message.parse_tag()) + if not self.current['__length']: + try: + duration = float(self.playbin.query_duration(gst.FORMAT_TIME, None)[0])/1000000000 + if duration > 0: + self.current['__length'] = duration + except gst.QueryError: + logger.error("Couldn't query duration") elif message.type == gst.MESSAGE_EOS and not self.is_paused(): self.eof_func() elif message.type == gst.MESSAGE_ERROR: @@ -78,11 +85,8 @@ self._on_playback_error(a.message) elif message.type == gst.MESSAGE_BUFFERING: percent = message.parse_buffering() - if percent < 100: - self.playbin.set_state(gst.STATE_PAUSED) - else: + if not percent < 100: logger.info(_('Buffering complete')) - self.playbin.set_state(gst.STATE_PLAYING) if percent % 5 == 0: event.log_event('playback_buffering', self, percent) return True @@ -225,7 +229,7 @@ # gstreamer does not buffer paused network streams, so if the user # is unpausing a stream, just restart playback - if not self.current.is_local(): + if not (self.current.is_local() or self.current['__length']): self.playbin.set_state(gst.STATE_READY) self.playbin.set_state(gst.STATE_PLAYING) @@ -239,7 +243,7 @@ """ value = int(gst.SECOND * value) event = gst.event_new_seek(1.0, gst.FORMAT_TIME, - gst.SEEK_FLAG_FLUSH|gst.SEEK_FLAG_ACCURATE, + gst.SEEK_FLAG_FLUSH, gst.SEEK_TYPE_SET, value, gst.SEEK_TYPE_NONE, 0) res = self.playbin.send_event(event) === modified file 'xl/track.py' --- xl/track.py 2009-07-13 23:51:49 +0000 +++ xl/track.py 2009-07-14 13:16:46 +0000 @@ -433,13 +433,14 @@ if key == '__bitrate': track['__bitrate'] = int(value[0]) / 1000 + elif key == 'duration': track['__length'] = float(value[0])/1000000000 + # if there's a comment, but no album, set album to the comment elif key == 'comment' and not track.get_loc().endswith('.mp3'): track['album'] = value elif key == 'album': track['album'] = value elif key == 'artist': track['artist'] = value - elif key == 'duration': track['__length'] = value elif key == 'track-number': track['tracknumber'] = value elif key == 'genre': track['genre'] = value === modified file 'xlgui/main.py' --- xlgui/main.py 2009-07-13 16:05:28 +0000 +++ xlgui/main.py 2009-07-14 14:06:57 +0000 @@ -41,6 +41,8 @@ event.add_callback(self.playback_start, 'playback_player_start', player) + event.add_callback(self.playback_toggle_pause, 'playback_toggle_pause', + player) event.add_callback(self.playback_end, 'playback_player_end', player) @@ -62,7 +64,7 @@ if value > 1: value = 1 track = self.player.current - if not track or not track.is_local(): return + if not track or not (track.is_local() or track['__length']): return length = track.get_duration() seconds = float(value * length) @@ -74,7 +76,7 @@ def seek_motion_notify(self, widget, event): track = self.player.current - if not track or not track.is_local(): return + if not track or not(track.is_local() or track['__length']): return mouse_x, mouse_y = event.get_coords() progress_loc = self.bar.get_allocation() @@ -93,6 +95,13 @@ def playback_start(self, type, player, object): self.timer_id = gobject.timeout_add(1000, self.timer_update) + def playback_toggle_pause(self, type, player, object): + if self.timer_id: + gobject.source_remove(self.timer_id) + self.timer_id = None + if not player.is_paused(): + self.timer_id = gobject.timeout_add(1000, self.timer_update) + def playback_end(self, type, player, object): if self.timer_id: gobject.source_remove(self.timer_id) self.timer_id = None @@ -101,11 +110,13 @@ def timer_update(self, *e): track = self.player.current - if not track or self.seeking: return + if not track: return + if self.seeking: return True - if not track.is_local(): + if not track.is_local() and not track['__length']: + self.bar.set_fraction(0) self.bar.set_text(_('Streaming...')) - return + return True length = track.get_duration() self.bar.set_fraction(self.player.get_progress())