#!/usr/bin/env python from httplib import HTTPConnection from httplib import responses import xml.dom.minidom from xml.dom.minidom import Node import sys try: import pygtk pygtk.require("2.0") except: pass try: import gtk import gtk.glade except: sys.exit(1) import subprocess class Item: def __init__(self, title, date, imgurl = None): self.title = title; self.imgurl = imgurl self.date = date class ItemProvider: def __init__(self, service): self.service = service self.index = 0; self.items = [] def load(self): feed = self.service.list() # dirty fix for bad feed feed = unicode( feed, "latin1" ) doc = xml.dom.minidom.parseString(feed.encode( "utf-8" )) self.items = [] for itemNode in doc.getElementsByTagName("item"): #isbn = node.getAttribute("isbn") titleNodes = itemNode.getElementsByTagName("title") for titleNode in titleNodes: title = "" for textNode in titleNode.childNodes: if textNode.nodeType == Node.TEXT_NODE: title += textNode.data dateNodes = itemNode.getElementsByTagName("pubDate") for dateNode in dateNodes: date = "" for textNode in dateNode.childNodes: if textNode.nodeType == Node.TEXT_NODE: date += textNode.data descriptionNodes = itemNode.getElementsByTagName("description") for descriptionNode in descriptionNodes: description = "" for textNode in descriptionNode.childNodes: if textNode.nodeType == Node.TEXT_NODE: description += textNode.data #dirty way for gettng the url imgurl = description.split('"')[1] item = Item(title, date, imgurl); self.items.append(item) def next(self): self.index -= 1 if self.index < 0: self.index = len(self.items) -1 return self.curent() def previous(self): self.index += 1 self.index = self.index % len(self.items) return self.curent() def curent(self): return self.items[self.index] class ColorboxGTK: """This is an feed browser""" def __init__(self, service): self.itemprovider = ItemProvider(service) #Set the Glade file self.gladefile = "colorbox.glade" self.wTree = gtk.glade.XML(self.gladefile) dic = { "on_btnPrevious_clicked" : self.on_btnPrevious_clicked, "on_btnNext_clicked" : self.on_btnNext_clicked, "on_MainWindow_destroy" : self.on_MainWindow_destroy, "on_MainWindow_show" : self.on_MainWindow_show} self.wTree.signal_autoconnect(dic) self.textview = self.wTree.get_widget("TextView") self.image = self.wTree.get_widget("image") #Get the Main Window, and connect the "destroy" event self.window = self.wTree.get_widget("MainWindow") if (self.window): # self.window.connect("destroy", gtk.main_quit) self.window.show() def on_MainWindow_destroy(self, window=None): print window gtk.main_quit() def on_MainWindow_show(self, event, data=None): self.itemprovider.load() self.showItem(self.itemprovider.curent()) def on_btnPrevious_clicked(self, widget, data=None): self.showItem(self.itemprovider.previous()) #print "previous + %s" % str(widget) def on_btnNext_clicked(self, widget, data=None): self.showItem(self.itemprovider.next()) #print "next + %s" % str(widget) def showItem(self, item): textbuffer = self.textview.get_buffer() textbuffer.set_text("%s\n%s" % (item.title, item.date)) # would be better to not save the images to disk! download(item.imgurl, "tmp.png") self.image.set_from_file("tmp.png") class MusicService: "This class talks to the rss webservice" def list(self): "returns all available colorbox items" h = HTTPConnection("data.somatik.be") h.request("GET", "/feed/colorbox") response = h.getresponse() return response.read() def download(url, to): # todo use tempfile? subprocess.call("wget --output-document=%s %s" % (to, url) , shell=True) def main(): service = MusicService() hwg = ColorboxGTK(service) gtk.main() print "Bye" if __name__ == '__main__': main()