Adding wip version for meego harmattan
[feedingit] / psa_harmattan / feedingit / pysrc / feedingit.py
diff --git a/psa_harmattan/feedingit/pysrc/feedingit.py b/psa_harmattan/feedingit/pysrc/feedingit.py
new file mode 100644 (file)
index 0000000..01c7b51
--- /dev/null
@@ -0,0 +1,248 @@
+#!/usr/bin/python
+
+import sys
+
+from PySide import QtGui
+from PySide import QtDeclarative
+import os
+from os import mkdir, remove, stat, environ
+from os.path import isfile, isdir, exists
+
+# 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 rss_sqlite import Listing
+CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit"
+#CONFIGDIR = "/home/user/.feedingit"
+
+import logging
+#logger = logging.getLogger(__name__)
+
+import debugging
+debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
+
+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):
+        QtCore.QObject.__init__(self)
+        from XmlHandler import XmlHandler
+        self._handler = XmlHandler(listing)
+
+    @QtCore.Slot(str,str, result=str)
+    def getArticle(self, key, article):
+       feed = listing.getFeed(key)
+       try:
+          file = open(feed.getContentLink(article))
+          html = file.read().replace("body", "body bgcolor='#ffffff'", 1)
+          file.close()
+       except:
+          html = "<html><body>Error retrieving article</body></html>"
+       return html
+    
+    @QtCore.Slot(str, result=str)
+    def getFeedsXml(self, catid):
+        return self._handler.generateFeedsXml(catid)
+    
+    @QtCore.Slot(str,result=str)
+    def getArticlesXml(self, key):
+        #onlyUnread = arguments.get("onlyUnread","False")
+        return self._handler.generateArticlesXml(key, "False")
+    
+    @QtCore.Slot(result=str)
+    def getCategoryXml(self):
+        return self._handler.generateCategoryXml()
+    
+    @QtCore.Slot(QtCore.QObject)
+    def feedClicked(self, wrapper):
+        #print 'User clicked on:', wrapper._key
+        #articlesModel.updateModel(wrapper._key)
+        pass
+        
+    @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)
+            
+    @QtCore.Slot(str,str,str)
+    def addFeed(self, title, url, catid):
+        listing.addFeed(title,url, category=catid)
+        
+    @QtCore.Slot(str)
+    def addCategory(self, name):
+        listing.addCategory(name)
+
+    @QtCore.Slot(str)
+    def markAllAsRead(self, key):
+        feed = listing.getFeed(key)
+        feed.markAllAsRead()
+
+    @QtCore.Slot(str, str)
+    def setEntryRead(self, key, articleid):
+        feed = listing.getFeed(key)
+        feed.setEntryRead(articleid)
+        listing.updateUnread(key)
+
+    @QtCore.Slot(str, result=str)
+    def getConfig(self, item):
+        if (item == "hideReadFeed"):
+            return "True"
+        if (item == "hideReadArticles"):
+            return "False"
+        return ""
+
+def main():
+
+    if not isdir(CONFIGDIR):
+        try:
+            mkdir(CONFIGDIR)
+        except:
+            logger.error("Error: Can't create configuration directory")
+            from sys import exit
+            exit(1)
+            
+    from config import Config
+    global config
+    config = Config(None,CONFIGDIR+"config.ini")
+
+    global listing
+    listing = Listing(config, CONFIGDIR)
+    
+    import mainthread
+    mainthread.init()
+
+    from jobmanager import JobManager
+    JobManager(True)
+
+    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)
+
+    if os.path.exists('/usr/share/feedingit/qml'):
+        view.setSource('/usr/share/feedingit/qml/main.qml')
+    else:
+        #view.setSource(os.path.join('qml','main.qml'))
+        view.setSource(os.path.join('qml','FeedingIt.qml'))
+
+    #view.showFullScreen()
+    view.show()
+    sys.exit(app.exec_())
+
+if __name__ == "__main__":
+    
+    main()