import os
from os import mkdir, remove, stat, environ
from os.path import isfile, isdir, exists
+import codecs
# Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
from PySide import QtOpenGL, QtCore
from cgi import escape
from re import sub
-class FeedWrapper(QtCore.QObject):
- def __init__(self, key):
- QtCore.QObject.__init__(self)
- self._key = key
- def _name(self):
- return listing.getFeedTitle(self._key)
- def _unread(self):
- return listing.getFeedNumberOfUnreadItems(self._key)
- def _updatedDate(self):
- return listing.getFeedUpdateTime(self._key)
- def _icon(self):
- return listing.getFavicon(self._key)
- def _feedid(self):
- return self._key
- def _updating(self):
- return false
-
- changed = QtCore.Signal()
-
- title = QtCore.Property(unicode, _name, notify=changed)
- feedid = QtCore.Property(unicode, _feedid, notify=changed)
- unread = QtCore.Property(unicode, _unread, notify=changed)
- updatedDate= QtCore.Property(unicode, _updatedDate, notify=changed)
- icon = QtCore.Property(unicode, _icon, notify=changed)
- updating = QtCore.Property(unicode, _icon, notify=changed)
-
-class FeedsModel(QtCore.QAbstractListModel):
- COLUMNS = ('feed', )
- _category = None
-
- def __init__(self):
- QtCore.QAbstractListModel.__init__(self)
- self._feeds = listing.getListOfFeeds(self._category)
- self.setRoleNames(dict(enumerate(FeedsModel.COLUMNS)))
-
- def rowCount(self, parent=QtCore.QModelIndex()):
- return len(self._feeds)
-
- def data(self, index, role):
- if index.isValid() and role == FeedsModel.COLUMNS.index('feed'):
- print self._feeds[index.row()]
- return FeedWrapper(self._feeds[index.row()])
- return None
-
-class ArticleWrapper(QtCore.QObject):
- def __init__(self, feed, articleid):
- QtCore.QObject.__init__(self)
- self._feed = feed
- self._articleid = articleid
- def _name(self):
- return self.fix_title(self._feed.getTitle(self._articleid))
- def _unread(self):
- return str(self._feed.isEntryRead(self._articleid))
- def _getarticleid(self):
- return self._articleid
- def _updatedDate(self):
- return self._feed.getDateStamp(self._articleid)
- def _path(self):
- return self._feed.getContentLink(self._articleid)
-
- changed = QtCore.Signal()
-
- title = QtCore.Property(unicode, _name, notify=changed)
- articleid = QtCore.Property(unicode, _getarticleid, notify=changed)
- unread = QtCore.Property(unicode, _unread, notify=changed)
- updatedDate= QtCore.Property(unicode, _updatedDate, notify=changed)
- path = QtCore.Property(unicode, _path, notify=changed)
-
-class ArticlesModel(QtCore.QAbstractListModel):
- COLUMNS = ('article', )
- _articles = []
- _key = None
- _feed = None
-
- def __init__(self,):
- QtCore.QAbstractListModel.__init__(self)
- self.setRoleNames(dict(enumerate(ArticlesModel.COLUMNS)))
-
- def updateModel(self, key):
- self._key = key
- self._feed = listing.getFeed(self._key)
- self._articles = self._feed.getIds()
-
- def rowCount(self, parent=QtCore.QModelIndex()):
- print "art " + str(len(self._articles))
- return len(self._articles)
-
- def data(self, index, role):
- print "data" + str(index) + " " + str(role)
- if index.isValid() and role == ArticlesModel.COLUMNS.index('article'):
- return ArticleWrapper(self._articles[index.row()])
- return None
-
class Controller(QtCore.QObject):
def __init__(self, listing):
def getArticle(self, key, article):
feed = listing.getFeed(key)
try:
- file = open(feed.getContentLink(article))
+ file = codecs.open(feed.getContentLink(article), "r", "utf-8")
html = file.read().replace("body", "body bgcolor='#ffffff'", 1)
file.close()
except:
- html = "<html><body>Error retrieving article</body></html>"
+ html = u"<html><body>Error retrieving article</body></html>"
return html
@QtCore.Slot(str, result=str)
@QtCore.Slot(str)
def updateFeed(self, key):
- print 'updating feed ', key
listing.updateFeed(key)
@QtCore.Slot()
def updateAll(self):
- for feed in listing.getListOfFeeds("Manual"):
- listing.updateFeed(feed)
-
+ for catid in listing.getListOfCategories():
+ for feed in listing.getSortedListOfKeys("Manual", category=catid):
+ listing.updateFeed(feed)
+
+ @QtCore.Slot(str)
+ def updateCategory(self, catid):
+ for feed in listing.getSortedListOfKeys("Manual", category=catid):
+ listing.updateFeed(feed)
+
@QtCore.Slot(str,str,str)
def addFeed(self, title, url, catid):
listing.addFeed(title,url, category=catid)
listing.addCategory(name)
@QtCore.Slot(str)
+ def removeFeed(self, key):
+ listing.removeFeed(key)
+
+ @QtCore.Slot(str)
+ def removeCategory(self, catid):
+ listing.removeCategory(catid)
+
+ @QtCore.Slot(str)
def markAllAsRead(self, key):
feed = listing.getFeed(key)
feed.markAllAsRead()
if (item == "hideReadArticles"):
return "False"
return ""
+
+ @QtCore.Slot(str, result=int)
+ def importOpml(self, filename):
+ from opml_lib import parseOpml
+ file = open(filename, "r")
+ feeds = parseOpml(file.read())
+ file.close()
+ for (title, url) in feeds:
+ listing.addFeed(title, url)
+ return len(feeds)
+
+ @QtCore.Slot(str, result=str)
+ def exportOpml(self, filename="/home/user/MyDocs/feedingit-export.opml"):
+ logger.debug("ExportOpmlData: %s" % filename)
+ from opml_lib import getOpmlText
+ try:
+ str = getOpmlText(listing)
+ file = open(filename, "w")
+ file.write(str)
+ file.close()
+ return filename
+ except:
+ logger.debug("Error exporting: %s" % filename)
+ return "error"
def main():
app = QtGui.QApplication(sys.argv)
view = QtDeclarative.QDeclarativeView()
- global articlesModel
- feedsModel = FeedsModel()
- articlesModel = ArticlesModel()
-
controller = Controller(listing)
rc = view.rootContext()
rc.setContextProperty('controller', controller)
- rc.setContextProperty('feedsModel', feedsModel)
- rc.setContextProperty('articlesModel', articlesModel)
# Comment the two lines below if you don't want to use OpenGL for QML rendering or if it is not supported
- glw = QtOpenGL.QGLWidget()
- view.setViewport(glw)
+ #glw = QtOpenGL.QGLWidget()
+ #view.setViewport(glw)
if os.path.exists('/usr/share/feedingit/qml'):
+ glw = QtOpenGL.QGLWidget()
+ view.setViewport(glw)
view.setSource('/usr/share/feedingit/qml/main.qml')
+ view.showFullScreen()
else:
- #view.setSource(os.path.join('qml','main.qml'))
- view.setSource(os.path.join('qml','FeedingIt.qml'))
+ view.setSource(os.path.join('qml','main.qml'))
+ view.show()
+ #view.setSource(os.path.join('qml','FeedingIt.qml'))
#view.showFullScreen()
- view.show()
+ #view.show()
sys.exit(app.exec_())
if __name__ == "__main__":