374627fc3083d4e8747f5dff955f65c8ad6082bb
[feedingit] / psa_harmattan / feedingit / deb_dist / feedingit-0.1.0 / debian / feedingit / usr / share / feedingit / 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 import dbus
12 # import python dbus GLib mainloop support
13 import dbus.mainloop.glib
14 # Enable glib main loop support
15 dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
16
17 # Comment the line below if you don't want to use OpenGL for QML rendering or if it is not supported
18 from PySide import QtOpenGL,  QtCore
19
20 from rss_sqlite import Listing
21 CONFIGDIR = environ.get("HOME", "/home/user") + "/.feedingit/"
22 #CONFIGDIR = "/home/user/.feedingit"
23
24 import logging
25 logger = logging.getLogger(__name__)
26
27 import debugging
28 debugging.init(dot_directory=".feedingit", program_name="feedingit-pyside")
29
30 from cgi import escape
31 from re import sub
32
33 class Controller(QtCore.QObject):
34     
35     def __init__(self, listing):
36         QtCore.QObject.__init__(self)
37         from XmlHandler import XmlHandler
38         self._handler = XmlHandler(listing)
39         
40     def update_progress(self, percent_complete,
41                         completed, in_progress, queued,
42                         bytes_downloaded, bytes_updated, bytes_per_second,
43                         feed_updated):
44         total = completed + in_progress + queued
45         root.updateProgress(int(total), int(completed))
46         
47     def articleCountUpdated(self):
48         print "article updated"
49     
50     def update_started(self):
51         root.updateStarted()
52     
53     def update_finished(self):
54         root.updateFinished()
55
56     @QtCore.Slot(str,str, result=str)
57     def getArticle(self, key, article):
58        feed = listing.getFeed(key)
59        try:
60           file = codecs.open(feed.getContentLink(article), "r", "utf-8")
61           html = file.read().replace("body", "body bgcolor='#ffffff'", 1)
62           file.close()
63        except:
64           html = u"<html><body>Error retrieving article</body></html>"
65        return html
66     
67     @QtCore.Slot(str, result=str)
68     def getFeedsXml(self, catid):
69         return self._handler.generateFeedsXml(catid)
70     
71     @QtCore.Slot(str,result=str)
72     def getArticlesXml(self, key):
73         #onlyUnread = arguments.get("onlyUnread","False")
74         return self._handler.generateArticlesXml(key, config.getHideReadArticles())
75     
76     @QtCore.Slot(result=str)
77     def getCategoryXml(self):
78         return self._handler.generateCategoryXml()
79     
80     @QtCore.Slot(QtCore.QObject)
81     def feedClicked(self, wrapper):
82         #print 'User clicked on:', wrapper._key
83         #articlesModel.updateModel(wrapper._key)
84         pass
85         
86     @QtCore.Slot(str)
87     def updateFeed(self, key):
88         listing.updateFeed(key)
89         
90     @QtCore.Slot()
91     def updateAll(self):
92         for catid in listing.getListOfCategories():
93             for feed in listing.getSortedListOfKeys("Manual", category=catid):
94                 listing.updateFeed(feed)
95
96     @QtCore.Slot(str)
97     def updateCategory(self, catid):
98         for feed in listing.getSortedListOfKeys("Manual", category=catid):
99             listing.updateFeed(feed)           
100
101     @QtCore.Slot(str,str,str)
102     def addFeed(self, title, url, catid):
103         listing.addFeed(title,url, category=catid)
104         
105     @QtCore.Slot(str)
106     def addCategory(self, name):
107         listing.addCategory(name)
108
109     @QtCore.Slot(str)
110     def removeFeed(self, key):
111         listing.removeFeed(key)
112
113     @QtCore.Slot(str)
114     def removeCategory(self, catid):
115         listing.removeCategory(catid)
116
117     @QtCore.Slot(str)
118     def markAllAsRead(self, key):
119         feed = listing.getFeed(key)
120         feed.markAllAsRead()
121         listing.updateUnread(key)
122
123     @QtCore.Slot(str, str)
124     def setEntryRead(self, key, articleid):
125         feed = listing.getFeed(key)
126         feed.setEntryRead(articleid)
127         listing.updateUnread(key)
128
129     @QtCore.Slot(str, result=str)
130     def getConfig(self, item):
131         if (item == "hideReadFeed"):
132             return "True"
133         if (item == "hideReadArticles"):
134             return "False"
135         return ""
136     
137     @QtCore.Slot(str, str)
138     def populateFileDialog(self, path, type):
139         import glob
140         import os.path
141         for file in glob.glob(path+type):
142             logger.debug(file)
143             root.addFileNotification(file, os.path.basename(file))
144     
145     @QtCore.Slot(str, result=int)
146     def importOpml(self, filename):
147         from opml_lib import parseOpml
148         file = open(filename, "r")
149         feeds = parseOpml(file.read())
150         file.close()
151         for (title, url) in feeds:
152             listing.addFeed(title, url)
153         return len(feeds)
154     
155     @QtCore.Slot(str, result=str)
156     def exportOpml(self, filename="/home/user/MyDocs/feedingit-export.opml"):
157         logger.debug("ExportOpmlData: %s" % filename)
158         from opml_lib import getOpmlText
159         try:
160             str = getOpmlText(listing)
161             file = open(filename, "w")
162             file.write(str)
163             file.close()
164             return filename
165         except:
166             logger.debug("Error exporting: %s" % filename)
167             return "error"
168         
169     @QtCore.Slot(str, result=bool)
170     def getBooleanSetting(self, setting):
171         if (setting == "theme"):
172             return config.getTheme()
173         elif (setting == "imageCache" ):
174             return config.getImageCache()
175         elif (setting == "hideReadFeeds"):
176             return config.getHideReadFeeds()
177         elif (setting == "hideReadArticles"):
178             return config.getHideReadArticles()
179         elif (setting == "autoupdate"):
180             return config.isAutoUpdateEnabled()
181         else:
182             return 'True'
183         
184     @QtCore.Slot(str, bool)
185     def setBooleanSetting(self, setting, value):
186         if (setting == "theme"):
187             config.setTheme(value)
188         elif (setting == "imageCache" ):
189             config.setImageCache(value)
190         elif (setting == "hideReadFeeds"):
191             config.setHideReadFeeds(value)
192         elif (setting == "hideReadArticles"):
193             config.setHideReadArticles(value)
194         elif (setting == "autoupdate"):
195             config.setAutoUpdateEnabled(value)
196         config.saveConfig()
197
198 def main():
199     if not isdir(CONFIGDIR):
200         try:
201             mkdir(CONFIGDIR)
202         except:
203             logger.error("Error: Can't create configuration directory")
204             from sys import exit
205             exit(1)
206             
207     from config import Config
208     global config
209     config = Config(None,CONFIGDIR+"config.ini")
210
211     global listing
212     listing = Listing(config, CONFIGDIR)
213     
214     import mainthread
215     mainthread.init()
216
217     from jobmanager import JobManager
218     JobManager(True)
219
220     app = QtGui.QApplication(sys.argv)
221     view = QtDeclarative.QDeclarativeView()
222
223     controller = Controller(listing)
224  
225     # listen on dbus for download update progress
226     bus = dbus.SessionBus()
227     
228     bus.add_signal_receiver(handler_function=controller.update_progress,
229                             bus_name=None,
230                             signal_name='UpdateProgress',
231                             dbus_interface='org.marcoz.feedingit',
232                             path='/org/marcoz/feedingit/update')
233     
234     bus.add_signal_receiver(handler_function=controller.articleCountUpdated,
235                             bus_name=None,
236                             signal_name='ArticleCountUpdated',
237                             dbus_interface='org.marcoz.feedingit',
238                             path='/org/marcoz/feedingit/update')
239     bus.add_signal_receiver(handler_function=controller.update_started,
240                             bus_name=None,
241                             signal_name='UpdateStarted',
242                             dbus_interface='org.marcoz.feedingit',
243                             path='/org/marcoz/feedingit/update')
244     bus.add_signal_receiver(handler_function=controller.update_finished,
245                             bus_name=None,
246                             signal_name='UpdateFinished',
247                             dbus_interface='org.marcoz.feedingit',
248                             path='/org/marcoz/feedingit/update')
249  
250     global root
251     rc = view.rootContext()
252  
253     rc.setContextProperty('controller', controller)
254
255     # Comment the two lines below if you don't want to use OpenGL for QML rendering or if it is not supported
256     #glw = QtOpenGL.QGLWidget()
257     #view.setViewport(glw)
258
259     if os.path.exists('/usr/share/feedingit/qml'):
260         glw = QtOpenGL.QGLWidget()
261         view.setViewport(glw)
262         view.setSource('/usr/share/feedingit/qml/main.qml')
263         view.showFullScreen()
264     else:
265         view.setSource(os.path.join('qml','main.qml'))
266         view.show()
267         #view.setSource(os.path.join('qml','FeedingIt.qml'))
268     root = view.rootObject()
269
270     #view.showFullScreen()
271     #view.show()
272     sys.exit(app.exec_())
273
274 if __name__ == "__main__": 
275     main()