diff --git a/libsaria/path/lastfm.py b/libsaria/path/lastfm.py index 986e623f..f877a6d8 100644 --- a/libsaria/path/lastfm.py +++ b/libsaria/path/lastfm.py @@ -90,6 +90,7 @@ def get_artwork_id(id): return get_artwork_tags(artist, album) def get_artwork(filepath): + id = sources.get_attrs("id") file = get_artwork_id(id) - libsaria.event.start("POSTGETART", file) + libsaria.event.start("POSTGETART", file, id) libsaria.event.invite("POSTLOAD", get_artwork, True) diff --git a/ocarina/__init__.py b/ocarina/__init__.py index 669d3e04..a8283e35 100644 --- a/ocarina/__init__.py +++ b/ocarina/__init__.py @@ -25,6 +25,7 @@ import queue import library import callbacks +callbacks.on_getart("images/ocarina.png", 0) libsaria.startup() print "Startup took:", uptime() gtk.main() diff --git a/ocarina/body/footer/__init__.py b/ocarina/body/footer/__init__.py index afd3391c..26a3b06b 100644 --- a/ocarina/body/footer/__init__.py +++ b/ocarina/body/footer/__init__.py @@ -40,6 +40,9 @@ if up == True: else: show_less() +def set_art(path): + detailed.set_art(path) + def on_play(): tiny.on_play() detailed.on_play() diff --git a/ocarina/body/footer/detailed.py b/ocarina/body/footer/detailed.py index 9ae6d9ff..fcede5ad 100644 --- a/ocarina/body/footer/detailed.py +++ b/ocarina/body/footer/detailed.py @@ -57,6 +57,9 @@ action.show() detailed.set_action_widget(action, gtk.PACK_END) detailed.append_page(nowplaying.page, nowplaying.label) +def set_art(path): + nowplaying.set_art(path) + def update_pos(time): slider_update(slider) cur_pos.set_text(time) diff --git a/ocarina/body/footer/nowplaying.py b/ocarina/body/footer/nowplaying.py index 8ed34596..d46bb528 100644 --- a/ocarina/body/footer/nowplaying.py +++ b/ocarina/body/footer/nowplaying.py @@ -3,10 +3,14 @@ import gtk from libsaria import controls from ocarina.body import button +from ocarina.body import image page = gtk.HBox(False, 5) label = gtk.Label("Now Playing") +ARTWORK = image.Image() +page.pack_start(ARTWORK, False, False) + def pack_label(box, label): a = gtk.Alignment(0, 0.5, 0, 0) a.add(label) @@ -46,6 +50,16 @@ page.pack_start(buttons, False, False) page.show_all() label.show() +sa_id = None +def resize_art(*args): + set_art(ARTWORK.path) + page.disconnect(sa_id) +sa_id = page.connect("size-allocate", resize_art) + +def set_art(path): + height = page.get_allocation().height + ARTWORK.set_image(path, height) + def on_like(): like = controls.get_like() button.toggle_unconnect(LIKE) diff --git a/ocarina/body/image.py b/ocarina/body/image.py new file mode 100644 index 00000000..d5b49ccd --- /dev/null +++ b/ocarina/body/image.py @@ -0,0 +1,149 @@ +# Bryan Schumaker (04 / 23 / 2011) + +import gtk + +def find_new_width(buf, new_h): + w = buf.get_width() + h = buf.get_height() + if new_h == 0: + return + if h == new_h: + return + if h == 0: + h = 1 + return (float(w) / float(h)) * new_h + +def resize(img, new_h): + buf = img.get_pixbuf() + if buf == None: + return + new_w = find_new_width(buf, new_h) + if new_w == None: + return + buf = buf.scale_simple(int(new_w), int(new_h), gtk.gdk.INTERP_HYPER) + if buf == None: + return + img.set_from_pixbuf(buf) + + +class Image(gtk.Image): + def __init__(self): + gtk.Image.__init__(self) + self.path = None + self.show() + + def set_image(self, path, height): + if path != None: + self.path = path + self.set_from_file(path) + resize(self, height) + + +#import libsaria +#import gtk +#gdk = gtk.gdk + +#sources = libsaria.sources +#from libsaria import threads + +#lock = threads.get_mutex("album_art") + +#class Image(gtk.Image): + #def __init__(self): + #gtk.Image.__init__(self) + #self.show() + + #def set_height(self, new_h): + #buf = self.get_pixbuf() + #if buf == None: + #return False + #w = buf.get_width() + #h = buf.get_height() + #if h == new_h: + #return False + #if h == 0: + #h = 1 + #new_w = (float(w) / float(h)) * new_h + #if new_w <= 0 or new_h <= 0: + #return False + + #buf = buf.scale_simple(int(new_w), int(new_h), gtk.gdk.INTERP_HYPER) + #if buf == None: + #return False + #self.set_from_pixbuf(buf) + #return True + + +#class AlbumArtImage(Image): + #def __init__(self, size): + #Image.__init__(self) + #self.size = size + #self.file = None + #self.set("images/ocarina.png") + #self.set_has_tooltip(True) + #self.connect("query-tooltip", self.tooltip) + #self.connect("button-press-event", self.clicked) + #libsaria.event.invite("PRELOAD", self.preload) + #libsaria.event.invite("POSTGETART", self.set) + #libsaria.event.invite("POSTSETART", self.set_locked) + + #def preload(self, *args): + #self.file = "images/ocarina.png" + + #def clicked(self, widget, event): + #print widget, event + + #def tooltip(self, image, x, y, keyboard, tip): + #image = gtk.Image() + #image.set_from_file(self.file) + #tip.set_icon(image.get_pixbuf()) + #return True + + #def set(self, file=None): + #gdk.threads_enter() + #self.set_locked(file) + #gdk.threads_leave() + + #def set_locked(self, file=None): + #for i in xrange(2): + #self.file = file + #try: + #self.set_from_file(self.file) + #if self.set_height(self.size) == True: + #break + #except: + #pass + #file = "images/ocarina.png" + + #def set_height(self, new_h): + #size = self.size_request() + #if size[1] == new_h: + #return + #return Image.set_height(self, new_h) + + +#class AlbumArt(gtk.EventBox): + #def __init__(self, size=64): + #gtk.EventBox.__init__(self) + #self.image = AlbumArtImage(size) + #self.add(self.image) + #self.connect("button-press-event", self.clicked) + #self.show_all() + + #def clicked(self, widget, event): + #if event.button != 1: + #return + #if sources.get_attrs("id") == -1: + #return + #from ocarina import fsselect + #path = fsselect.file("Select an image") + #if path == None: + #return + #print "Selected file: %s" % path + #try: + ##self.image.set(path) + #sources.library.set_attr(sources.cur_lib_id, "art", path) + #except Exception, e: + #print e + #pass + diff --git a/ocarina/callbacks.py b/ocarina/callbacks.py index b6004fce..147b330f 100644 --- a/ocarina/callbacks.py +++ b/ocarina/callbacks.py @@ -28,3 +28,10 @@ invite("POSTLOAD", on_load) def on_like(*args): footer.on_like() invite("POSTSETLIKE", on_like) + +def on_getart(path, id): + cur_id = libsaria.sources.get_attrs("id") + if id != cur_id: + path = "images/ocarina.png" + footer.set_art(path) +invite("POSTGETART", on_getart)