from showalbum import ShowAlbum
from albumlist import MusicList
from player import Playlist
+from fetcher import Fetcher
import logging
log = logging.getLogger(__name__)
hildon.StackableWindow.__init__(self)
self.set_title(feature)
+ self.fetcher = None
+ self.connect('destroy', self.on_destroy)
self.featurefn = _alist(self.features, feature)
# Results list
self.panarea.add(self.musiclist)
self.idmap = {}
- try:
- self.items = self.featurefn()
- for item in self.items:
- self.idmap[item.ID] = item
- self.musiclist.add_items(self.items)
- except jamaendo.JamendoAPIException:
- log.exception('failed to get %s' % (feature))
- self.items = []
+ self.items = []
self.add(self.panarea)
self.create_menu()
+ self.start_feature_fetcher()
+
+ def start_feature_fetcher(self):
+ if self.fetcher:
+ self.fetcher.stop()
+ self.fetcher = None
+ self.fetcher = Fetcher(self.featurefn, self,
+ on_item = self.on_feature_result,
+ on_ok = self.on_feature_complete,
+ on_fail = self.on_feature_complete)
+ self.fetcher.start()
+
+ def on_feature_result(self, wnd, item):
+ if wnd is self:
+ self.musiclist.add_items([item])
+ self.idmap[item.ID] = item
+ self.items.append(item)
+
+ def on_feature_complete(self, wnd, error=None):
+ if wnd is self:
+ self.fetcher.stop()
+ self.fetcher = None
+
def create_menu(self):
def on_player(*args):
from playerwindow import open_playerwindow
self.menu.show_all()
self.set_app_menu(self.menu)
+ def on_destroy(self, wnd):
+ if self.fetcher:
+ self.fetcher.stop()
+ self.fetcher = None
+
def row_activated(self, treeview, path, view_column):
_id = self.musiclist.get_item_id(path)
item = self.idmap[_id]
wnd = open_playerwindow()
wnd.play_tracks(playlist)
elif isinstance(item, jamaendo.Tag):
- try:
+ self.start_tag_fetcher(item.ID)
+
+ def start_tag_fetcher(self, item_id):
+ if self.fetcher:
+ self.fetcher.stop()
+ self.fetcher = None
+ self.fetcher = Fetcher(lambda: jamaendo.get_tag_tracks(item_id),
+ self,
+ on_item = self.on_tag_result,
+ on_ok = self.on_tag_complete,
+ on_fail = self.on_tag_complete)
+ self.fetcher.taglist = []
+ self.fetcher.start()
+
+ def on_tag_result(self, wnd, item):
+ if wnd is self and hasattr(self.fetcher, 'taglist'):
+ self.fetcher.taglist.append(item)
+
+ def on_tag_complete(self, wnd, error=None):
+ if wnd is self:
+ self.fetcher.stop()
+ if error is not None and hasattr(self.fetcher, 'taglist'):
wnd = open_playerwindow()
- wnd.play_tracks(jamaendo.get_tag_tracks(item.ID))
- except jamaendo.JamendoAPIException:
- log.exception('Failed to get tracks for %s' % (item.ID))
+ wnd.play_tracks(self.fetcher.taglist)
+ self.fetcher = None
import jamaendo
import logging
+import gtk
import hildon
log = logging.getLogger(__name__)
for item in self.generator():
self._post(item)
self._post_ok()
- except jamaendo.JamendoAPIError, e:
+ except jamaendo.JamendoAPIException, e:
log.exception("Failed to fetch, id %s" % (self.owner))
self._post_fail(e)
def _on_ok_cb(self, i):
self.on_ok(i)
- hildon.hildon_gtk_window_set_progress_indicator(self.owner, 0)
+ if isinstance(self.owner, gtk.Window):
+ hildon.hildon_gtk_window_set_progress_indicator(self.owner, 0)
def _on_fail_cb(self, i, e):
self.on_fail(i, e)
- hildon.hildon_gtk_window_set_progress_indicator(self.owner, 0)
+ if isinstance(self.owner, gtk.Window):
+ hildon.hildon_gtk_window_set_progress_indicator(self.owner, 0)
def start(self):
postoffice.connect('fetch', self, self._on_item_cb)
postoffice.connect('fetch-ok', self, self._on_ok_cb)
postoffice.connect('fetch-fail', self, self._on_fail_cb)
- hildon.hildon_gtk_window_set_progress_indicator(self.owner, 1)
+ if isinstance(self.owner, gtk.Window):
+ hildon.hildon_gtk_window_set_progress_indicator(self.owner, 1)
self.worker = _Worker(self.generator, self.owner)
self.worker.start()
import jamaendo
from settings import settings
from postoffice import postoffice
+from fetcher import Fetcher
log = logging.getLogger(__name__)
self.backend = PlayerBackend()
self.backend.set_eos_callback(self._on_eos)
self.playlist = Playlist()
+ self.fetcher = None # for refilling the radio
def get_position_duration(self):
return self.backend.get_position_duration()
+ def _play_track(self, track, notify='play'):
+ self.backend.play_url('mp3', track.mp3_url())
+ log.debug("playing %s", track)
+ postoffice.notify(notify, track)
+
+ def _refill_radio(self):
+ log.debug("Refilling radio %s", self.playlist)
+ #self.playlist.add(jamaendo.get_radio_tracks(self.playlist.radio_id))
+ self._start_radio_fetcher()
+
+ def _start_radio_fetcher(self):
+ if self.fetcher:
+ self.fetcher.stop()
+ self.fetcher = None
+ self.fetcher = Fetcher(lambda: jamaendo.get_radio_tracks(self.playlist.radio_id),
+ self,
+ on_item = self._on_radio_result,
+ on_ok = self._on_radio_complete,
+ on_fail = self._on_radio_complete)
+ self.fetcher.has_no_results = True
+ self.fetcher.start()
+
+ def _on_radio_result(self, wnd, item):
+ if wnd is self:
+ self.playlist.add(item)
+ if not self.playing():
+ if self.fetcher.has_no_results:
+ self.fetcher.has_no_results = False
+ entry = self.playlist.next()
+ self._play_track(entry)
+
+ def _on_radio_complete(self, wnd, error=None):
+ if wnd is self:
+ if error:
+ self.stop()
+ self.fetcher.stop()
+ self.fetcher = None
+
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.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)
- postoffice.notify('play', entry)
-
- def pause(self):
- self.backend.pause()
- postoffice.notify('pause', self.playlist.current())
-
- def stop(self):
- self.backend.stop()
- postoffice.notify('stop', self.playlist.current())
- def playing(self):
- return self.backend.playing()
+ if self.playlist.current():
+ entry = self.playlist.current()
+ self._play_track(entry)
+ elif self.playlist.has_next():
+ entry = self.playlist.next()
+ self._play_track(entry)
+ elif self.playlist.radio_mode:
+ self._refill_radio()
+ #self.play()
def next(self):
if self.playlist.has_next():
self.backend.stop(reset=False)
entry = self.playlist.next()
- self.backend.play_url('mp3', entry.mp3_url())
- log.debug("playing %s:%s", entry.ID, entry.name)
- postoffice.notify('next', entry)
+ self._play_track(entry, notify='next')
elif self.playlist.radio_mode:
- log.debug("Refilling radio %s", self.playlist)
- self.playlist.add(jamaendo.get_radio_tracks(self.playlist.radio_id))
- if self.playlist.has_next():
- self.next()
- else:
- self.stop()
+ self._refill_radio()
+ #if self.playlist.has_next():
+ # self.next()
+ #else:
+ # self.stop()
else:
self.stop()
if self.playlist.has_prev():
self.backend.stop(reset=False)
entry = self.playlist.prev()
- self.backend.play_url('mp3', entry.mp3_url())
- log.debug("playing %s", entry)
- postoffice.notify('prev', entry)
+ self._play_track(entry, 'prev')
+
+ def pause(self):
+ self.backend.pause()
+ postoffice.notify('pause', self.playlist.current())
+
+ def stop(self):
+ self.backend.stop()
+ postoffice.notify('stop', self.playlist.current())
+
+ def playing(self):
+ return self.backend.playing()
def _on_eos(self):
self.next()
self.add_stock_button(btns, gtk.STOCK_MEDIA_STOP, self.on_stop)
self.add_stock_button(btns, gtk.STOCK_MEDIA_NEXT, self.on_next)
+ self.controls = btns
+
self.add(vbox)
postoffice.connect('album-cover', self, self.set_album_cover)
self.artist.set_markup('%s'%(cgi.escape(artist)))
self.album.set_markup('<span foreground="%s">%s</span>'%(colors.SecondaryTextColor(), cgi.escape(album)))
+ if not track:
+ txt = '<span font_desc="%s" foreground="%s">%s</span>' % \
+ (colors.XXLargeSystemFont(),
+ colors.SecondaryTextColor(),
+ '00:00'
+ )
+ self.playtime.set_markup(txt)
+
def show_banner(self, message, timeout = 2000):
banner = hildon.hildon_banner_show_information(self, '', message)
banner.set_timeout(2000)
def update_state(self):
item = self.playlist.current()
if item:
+ hildon.hildon_gtk_window_set_progress_indicator(self, 0)
if not item.name:
item.load()
self.set_labels(item.name, item.artist_name, item.album_name,
else:
self.set_labels('', '', '', 0, 0)
self.set_default_cover()
+ state = bool(item)
+ for btn in self.controls:
+ if isinstance(btn, hildon.GtkButton):
+ btn.set_sensitive(state)
def set_album_cover(self, albumid, size, cover):
if size == 300:
playlist.radio_mode = True
playlist.radio_name = radio_name
playlist.radio_id = radio_id
- playlist.add(jamaendo.get_radio_tracks(playlist.radio_id))
- log.debug("Playing radio: %s", playlist)
+ hildon.hildon_gtk_window_set_progress_indicator(self, 1)
self.__play_tracks(playlist)
- log.debug("Playlist current: %s, playing? %s",
- playlist.current_index(),
- self.player.playing())
+ #log.debug("Playlist current: %s, playing? %s",
+ # playlist.current_index(),
+ # self.player.playing())
def play_tracks(self, tracks):
self.__play_tracks(tracks)
import jamaendo
from playerwindow import open_playerwindow
from albumlist import RadioList
+from fetcher import Fetcher
class RadiosWindow(hildon.StackableWindow):
def __init__(self):
hildon.StackableWindow.__init__(self)
+ self.fetcher = None
+ self.radios = {}
+
self.set_title("Radios")
+ self.connect('destroy', self.on_destroy)
# Results list
self.panarea = hildon.PannableArea()
self.radiolist = RadioList()
self.radiolist.connect('row-activated', self.row_activated)
-
self.panarea.add(self.radiolist)
-
- self.radios = {}
- hildon.hildon_gtk_window_set_progress_indicator(self, 1)
- radios = jamaendo.starred_radios()
- for item in radios:
- self.radios[item.ID] = item
- self.radiolist.add_radios(radios)
- hildon.hildon_gtk_window_set_progress_indicator(self, 0)
-
self.add(self.panarea)
- def make_button(self, text, subtext, callback):
- button = hildon.Button(gtk.HILDON_SIZE_FINGER_HEIGHT,
- hildon.BUTTON_ARRANGEMENT_VERTICAL)
- button.set_text(text, subtext)
-
- if callback:
- button.connect('clicked', callback)
+ self.start_radio_fetcher()
- return button
+ def on_destroy(self, wnd):
+ if self.fetcher:
+ self.fetcher.stop()
+ self.fetcher = None
def row_activated(self, treeview, path, view_column):
name, _id = self.radiolist.get_radio_id(path)
wnd = open_playerwindow()
wnd.play_radio(name, _id)
+
+ def start_radio_fetcher(self):
+ if self.fetcher:
+ self.fetcher.stop()
+ self.fetcher = None
+ self.fetcher = Fetcher(jamaendo.starred_radios, self,
+ on_item = self.on_radio_result,
+ on_ok = self.on_radio_complete,
+ on_fail = self.on_radio_complete)
+ self.fetcher.start()
+
+ def on_radio_result(self, wnd, item):
+ if wnd is self:
+ self.radios[item.ID] = item
+ self.radiolist.add_radios([item])
+
+ def on_radio_complete(self, wnd, error=None):
+ if wnd is self:
+ self.fetcher.stop()
+ self.fetcher = None
mode = self.mode.get_active()
txt = self.entry.get_text()
self.musiclist.set_loading(False)
+ self.musiclist.empty_message = "Searching..."
self.musiclist.get_model().clear()
if self.fetcher:
self.fetcher = Fetcher(itemgen, self,
on_item = self.on_add_result,
- on_ok = self.on_add_ok,
- on_fail = self.on_add_fail)
+ on_ok = self.on_add_complete,
+ on_fail = self.on_add_complete)
self.fetcher.start()
'''
try:
self.musiclist.add_items([item])
self.idmap[item.ID] = item
- def on_add_ok(self, wnd):
- if wnd is self:
- self.fetcher.stop()
- self.fetcher = None
-
- def on_add_fail(self, wnd, error):
+ def on_add_complete(self, wnd, error=None):
if wnd is self:
+ self.musiclist.empty_message = "No matching results"
self.musiclist.queue_draw()
self.fetcher.stop()
self.fetcher = None