diff options
-rw-r--r-- | rssfeeder.py | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/rssfeeder.py b/rssfeeder.py new file mode 100644 index 0000000..769ddec --- /dev/null +++ b/rssfeeder.py @@ -0,0 +1,297 @@ +# -*- coding: utf-8 -*- + +import gtk +import webkit +from xml.dom import minidom +import urllib + +class RSSFeeder: + # Attributes + _title = "RSS Feeder" + _label_text = "HELLO News" + _window = None + + _toolbar = None + _statusbar = None + _mainbox = None + + _label = None + _news_button = None + _planet_button = None + _cool_button = None + _fun_button = None + _like_button = None + _updates_button = None + _exit_button = None + _feedview = None + + _feedbox = None + + _feedview_scroller = None + + _statusbar_progressbar = None + + _feedliststore = None + _feedtreeview = None + _feedcellrenderer = None + _feedcelltreeviewcolumn = None + + _currentbutton = None + _currentItems = None + + # Constants + _greenColor = '#00E500' + _defaultColor = "#EFEFEF" + _redColor = '#FF0000' + _feeds_limit = 20 + + def getFeedURL(self): + if self._currentbutton == "news": + return "http://www.eltiempo.com/colombia/rss.xml" + elif self._currentbutton == "planet": + return "http://www.eltiempo.com/deportes/rss.xml" + elif self._currentbutton == "cool": + return "http://www.eltiempo.com/tecnologia/rss.xml" + + return "http://www.eltiempo.com/mundo/rss.xml" + + def exit_button_clicked(self,btn): + """ Callback for exit button click + """ + self.exitApplication() + + def selectButton(self): + self._news_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._defaultColor)) + self._planet_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._defaultColor)) + self._fun_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._defaultColor)) + self._cool_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._defaultColor)) + + if self._currentbutton == "news": + self._news_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._greenColor)) + elif self._currentbutton == "planet": + self._planet_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._greenColor)) + elif self._currentbutton == "cool": + self._cool_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._greenColor)) + elif self._currentbutton == "fun": + self._fun_button.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(self._greenColor)) + + def news_button_clicked(self,btn): + """ Callback for news button click + """ + if self._currentbutton == "news": + self.clearCurrentFeeds() + else: + self._currentbutton = "news" + self.selectButton() + url = self.getFeedURL() + self.load_rss_items(url) + + def planet_button_clicked(self,btn): + """ Callback for planet button click + """ + if self._currentbutton == "planet": + self.clearCurrentFeeds() + else: + self._currentbutton = "planet" + self.selectButton() + url = self.getFeedURL() + self.load_rss_items(url) + + def cool_button_clicked(self,btn): + """ Callback for cool button click + """ + if self._currentbutton == "cool": + self.clearCurrentFeeds() + else: + self._currentbutton = "cool" + self.selectButton() + url = self.getFeedURL() + self.load_rss_items(url) + + def fun_button_clicked(self,btn): + """ Callback for fun button click + """ + if self._currentbutton == "fun": + self.clearCurrentFeeds() + else: + self._currentbutton = "fun" + self.selectButton() + url = self.getFeedURL() + self.load_rss_items(url) + + def updates_button_clicked(self,btn): + """ Callback for updates button click + """ + if self._currentbutton is not None: + url = self.getFeedURL() + self.load_rss_items(url) + + def clearCurrentFeeds(self): + self._feedliststore.clear() + self._currentbutton = None + self._currentItems = None + self.selectButton() + self._feedview.load_html_string('','') + + def load_rss_items(self,url): + """ Get the RSS items + """ + connection = urllib.urlopen(url) + feed = minidom.parse(connection) + connection.close() + items = feed.getElementsByTagName('item')[0:self._feeds_limit] + self._feedliststore.clear() + self._feedview.load_html_string('','') + self._currentItems = items + + for item in items: + self._feedliststore.append([item.childNodes[1].childNodes[0].data]) + + def load_rss_item(self,itemTitle): + """ Get the RSS items + """ + + if self._currentItems is not None: + for item in self._currentItems: + title = item.childNodes[1].childNodes[0].data + if title == itemTitle: + description = item.childNodes[9].childNodes[0].data + content = item.childNodes[13].childNodes[0].data + + html = """ + <div style='font-weight: bold; background-color: #333333; color: #FFFFFF; padding: 5px'>%s</div> + + <div style="height: 20px"> </div> + + <div style='font-weight: bold; background-color: #333333; color: #FFFFFF; padding: 5px'>DESCRIPTION</div> + <div style="height: 10px"> </div> + %s + + <div style="height: 20px"> </div> + + <div style='font-weight: bold; background-color: #333333; color: #FFFFFF; padding: 5px'>CONTENT</div> + <div style="height: 10px"> </div> + %s + """ % ( title, description, content ) + + self._feedview.load_html_string(html,'') + + def exitApplication(self): + """ Callback for close button + """ + gtk.main_quit() + + + def destroyWindow(self, widget, data=None): + """ Callback for window destroy + """ + self.exitApplication() + + def createWindow(self): + """ Create window + """ + self._window = gtk.Window() + self._window.set_title(self._title) + self._window.connect("destroy", self.destroyWindow) + self._window.maximize() + + def createToolbar(self): + """ Create toolbar + """ + self._toolbar = gtk.HBox() + self._label =gtk.Label(self._label_text) + self._news_button = gtk.Button("News") + self._planet_button = gtk.Button("Planet") + self._cool_button = gtk.Button("Cool") + self._fun_button = gtk.Button("Fun") + self._like_button = gtk.Button("Like") + self._updates_button = gtk.Button("Updates") + self._exit_button = gtk.Button("Exit") + + self._toolbar.pack_start(self._label,False,True) + self._toolbar.pack_start(gtk.HSeparator(),False,False,5) + self._toolbar.pack_start(self._news_button,False) + self._toolbar.pack_start(self._planet_button,False) + self._toolbar.pack_start(self._cool_button,False) + self._toolbar.pack_start(self._fun_button,False) + self._toolbar.pack_start(self._like_button,False) + self._toolbar.pack_start(gtk.HSeparator(),False,False,5) + self._toolbar.pack_start(self._updates_button,False,True) + self._toolbar.pack_start(gtk.HSeparator(),False,False,5) + self._toolbar.pack_start(self._exit_button,False,True) + + self._exit_button.connect("clicked",self.exit_button_clicked) + + self._news_button.connect("clicked",self.news_button_clicked) + self._planet_button.connect("clicked",self.planet_button_clicked) + self._cool_button.connect("clicked",self.cool_button_clicked) + self._fun_button.connect("clicked",self.fun_button_clicked) + + self._updates_button.connect("clicked",self.updates_button_clicked) + + self._mainbox.pack_start(self._toolbar,False) + + self.selectButton() + + def feedtreeview_click(self,widget): + treeselection = self._feedtreeview.get_selection() + (model, iter) = treeselection.get_selected() + value = self._feedliststore.get_value(iter, 0) + self.load_rss_item(value) + + def createFeedWorkspace(self): + """ Create feed view + """ + self._feedbox = gtk.HBox() + + self._feedview_scroller = gtk.ScrolledWindow() + self._feedview = webkit.WebView() + self._feedview_scroller.add(self._feedview) + + self._feedliststore = gtk.ListStore(str) + self._feedtreeview = gtk.TreeView(self._feedliststore) + self._feedcellrenderer = gtk.CellRendererText() + self._feedcelltreeviewcolumn = gtk.TreeViewColumn( "Latest 20", self._feedcellrenderer, text=0 ) + self._feedtreeview.append_column(self._feedcelltreeviewcolumn) + + self._feedbox.pack_start(self._feedview_scroller) + self._feedbox.pack_start(self._feedtreeview,False, padding=5) + self._mainbox.pack_start(self._feedbox) + + self._feedtreeview.connect('cursor-changed', self.feedtreeview_click) + + def createStatusBar(self): + self._statusbar = gtk.HBox() + self._statusbar_progressbar = gtk.ProgressBar() + self._statusbar.pack_start(self._statusbar_progressbar) + + self._mainbox.pack_start(self._statusbar, False) + + def __init__(self): + """ Constructor + """ + # Window + self.createWindow() + + # Main box + self._mainbox = gtk.VBox() + + # Toolbar + self.createToolbar() + + # Feed view + self.createFeedWorkspace() + + # Status bar + self.createStatusBar() + + # Show all + self._window.add(self._mainbox) + self._window.show_all() + + # Final adjustments + +if __name__ == "__main__": + rssfeeder = RSSFeeder() + gtk.main() + |