0.9.1-2 for extras-devel
[feedingit] / psa_harmattan / feedingit / pysrc / feedingit.py
1 #!/usr/bin/python
2
3 import sys
4
5 from PySide import QtGui
6 from PySide import QtDeclarative
7 import os
8 from os import mkdir, remove, stat, environ
9 from os.path import isfile, isdir, exists
10 import codecs
11
12 # Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
13 from PySide import QtOpenGL,  QtCore
14
15 from rss_sqlite import Listing
16 CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit"
17 #CONFIGDIR = "/home/user/.feedingit"
18
19 import logging
20 #logger = logging.getLogger(__name__)
21
22 import debugging
23 debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
24
25 from cgi import escape
26 from re import sub
27
28 class Controller(QtCore.QObject):
29     
30     def __init__(self, listing):
31         QtCore.QObject.__init__(self)
32         from XmlHandler import XmlHandler
33         self._handler = XmlHandler(listing)
34
35     @QtCore.Slot(str,str, result=str)
36     def getArticle(self, key, article):
37        feed = listing.getFeed(key)
38        try:
39           file = codecs.open(feed.getContentLink(article), "r", "utf-8")
40           html = file.read().replace("body", "body bgcolor='#ffffff'", 1)
41           file.close()
42        except:
43           html = u"<html><body>Error retrieving article</body></html>"
44        return html
45     
46     @QtCore.Slot(str, result=str)
47     def getFeedsXml(self, catid):
48         return self._handler.generateFeedsXml(catid)
49     
50     @QtCore.Slot(str,result=str)
51     def getArticlesXml(self, key):
52         #onlyUnread = arguments.get("onlyUnread","False")
53         return self._handler.generateArticlesXml(key, "False")
54     
55     @QtCore.Slot(result=str)
56     def getCategoryXml(self):
57         return self._handler.generateCategoryXml()
58     
59     @QtCore.Slot(QtCore.QObject)
60     def feedClicked(self, wrapper):
61         #print 'User clicked on:', wrapper._key
62         #articlesModel.updateModel(wrapper._key)
63         pass
64         
65     @QtCore.Slot(str)
66     def updateFeed(self, key):
67         listing.updateFeed(key)
68         
69     @QtCore.Slot()
70     def updateAll(self):
71         for catid in listing.getListOfCategories():
72             for feed in listing.getSortedListOfKeys("Manual", category=catid):
73                 listing.updateFeed(feed)
74
75     @QtCore.Slot(str)
76     def updateCategory(self, catid):
77         for feed in listing.getSortedListOfKeys("Manual", category=catid):
78             listing.updateFeed(feed)           
79
80     @QtCore.Slot(str,str,str)
81     def addFeed(self, title, url, catid):
82         listing.addFeed(title,url, category=catid)
83         
84     @QtCore.Slot(str)
85     def addCategory(self, name):
86         listing.addCategory(name)
87
88     @QtCore.Slot(str)
89     def removeFeed(self, key):
90         listing.removeFeed(key)
91
92     @QtCore.Slot(str)
93     def removeCategory(self, catid):
94         listing.removeCategory(catid)
95
96     @QtCore.Slot(str)
97     def markAllAsRead(self, key):
98         feed = listing.getFeed(key)
99         feed.markAllAsRead()
100
101     @QtCore.Slot(str, str)
102     def setEntryRead(self, key, articleid):
103         feed = listing.getFeed(key)
104         feed.setEntryRead(articleid)
105         listing.updateUnread(key)
106
107     @QtCore.Slot(str, result=str)
108     def getConfig(self, item):
109         if (item == "hideReadFeed"):
110             return "True"
111         if (item == "hideReadArticles"):
112             return "False"
113         return ""
114     
115     @QtCore.Slot(str, result=int)
116     def importOpml(self, filename):
117         from opml_lib import parseOpml
118         file = open(filename, "r")
119         feeds = parseOpml(file.read())
120         file.close()
121         for (title, url) in feeds:
122             listing.addFeed(title, url)
123         return len(feeds)
124     
125     @QtCore.Slot(str, result=str)
126     def exportOpml(self, filename="/home/user/MyDocs/feedingit-export.opml"):
127         logger.debug("ExportOpmlData: %s" % filename)
128         from opml_lib import getOpmlText
129         try:
130             str = getOpmlText(listing)
131             file = open(filename, "w")
132             file.write(str)
133             file.close()
134             return filename
135         except:
136             logger.debug("Error exporting: %s" % filename)
137             return "error"
138
139 def main():
140
141     if not isdir(CONFIGDIR):
142         try:
143             mkdir(CONFIGDIR)
144         except:
145             logger.error("Error: Can't create configuration directory")
146             from sys import exit
147             exit(1)
148             
149     from config import Config
150     global config
151     config = Config(None,CONFIGDIR+"config.ini")
152
153     global listing
154     listing = Listing(config, CONFIGDIR)
155     
156     import mainthread
157     mainthread.init()
158
159     from jobmanager import JobManager
160     JobManager(True)
161
162     app = QtGui.QApplication(sys.argv)
163     view = QtDeclarative.QDeclarativeView()
164
165     controller = Controller(listing)
166  
167     rc = view.rootContext()
168  
169     rc.setContextProperty('controller', controller)
170
171     # Comment the two lines below if you don't want to use OpenGL for QML rendering or if it is not supported
172     #glw = QtOpenGL.QGLWidget()
173     #view.setViewport(glw)
174
175     if os.path.exists('/usr/share/feedingit/qml'):
176         glw = QtOpenGL.QGLWidget()
177         view.setViewport(glw)
178         view.setSource('/usr/share/feedingit/qml/main.qml')
179         view.showFullScreen()
180     else:
181         view.setSource(os.path.join('qml','main.qml'))
182         view.show()
183         #view.setSource(os.path.join('qml','FeedingIt.qml'))
184
185     #view.showFullScreen()
186     #view.show()
187     sys.exit(app.exec_())
188
189 if __name__ == "__main__":
190     
191     main()