fix google reader sync
[vuplus_dvbapp-plugin] / simplerss / src / GoogleReader.py
1 import urllib
2 from twisted.web.client import getPage
3 from RSSFeed import UniversalFeed
4 from twisted.internet.defer import Deferred
5 from xml.etree.cElementTree import fromstring as cet_fromstring
6
7 class GoogleReader:
8         def __init__(self, username = None, password = None):
9                 self.username = username
10                 self.password = password
11                 self.token = None
12                 self.auth = None
13
14         def sendRequest(self, url):
15                 print "[GoogleReader] sendRequest:", url
16                 headers = {
17                         'Authorization': 'GoogleLogin auth='+self.auth,
18                 }
19
20                 return getPage(url, headers=headers)
21
22         def login(self):
23                 print "[GoogleReader] login"
24                 if not self.username or not self.password:
25                         return
26
27                 headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'}
28                 data = {
29                         'service': 'reader',
30                         'Email': self.username,
31                         'Passwd': self.password,
32                         'source': 'enigma2-plugin-extensions-simplerss',
33                         'continue': 'http://www.google.com/',
34                 }
35
36                 defer = Deferred()
37                 getPage('https://www.google.com/accounts/ClientLogin', method = 'POST', headers = headers, postdata = urllib.urlencode(data)).addCallback(self.loginFinished, defer).addErrback(self.loginFailed, defer)
38                 return defer
39
40         def loginFinished(self, res = None, defer = None):
41                 pos_beg = res.find('Auth=')
42                 pos_end = res.find('\n',pos_beg)
43                 self.auth = res[pos_beg+5:pos_end]
44                 if defer:
45                         defer.callback(self.auth)
46
47         def loginFailed(self, res = None, defer = None):
48                 print "[GoogleReader] loginFailed:", res
49                 if defer:
50                         # XXX: we might want to give some information here besides "we failed"
51                         defer.errback()
52
53         def getToken(self):
54                 if not self.auth:
55                         return
56
57                 defer = Deferred()
58                 self.sendRequest('http://www.google.com/reader/api/0/token').addCallback(self.gotToken, defer).addErrback(seld.errToken, defer)
59                 return defer
60
61         def gotToken(self, res = None, defer = None):
62                 self.token = res
63                 if defer:
64                         defer.callback(res)
65
66         def errToken(self, res = None, defer = None):
67                 print "[GoogleReader] errToken", res
68                 self.token = None
69                 if defer:
70                         # XXX: we might want to give some information here besides "we failed"
71                         defer.errback()
72
73         def getSubscriptionList(self):
74                 if not self.auth:
75                         return
76
77                 defer = Deferred()
78                 self.sendRequest('http://www.google.com/reader/api/0/subscription/list?output=xml').addCallback(self.gotSubscriptionList, defer).addErrback(self.errSubscriptionList, defer)
79                 return defer
80
81         def gotSubscriptionList(self, res = None, defer = None):
82                 l = []
83                 if res:
84                         dom = cet_fromstring(res)
85                         for item in dom.getiterator():
86                                 if item.tag == 'string':
87                                         if item.get('name') == 'id':
88                                                 l.append(UniversalFeed(item.text[5:], True, True))
89                 if defer:
90                         defer.callback(l)
91
92         def errSubscriptionList(self, res = None, defer = None):
93                 print "[GoogleReader] errSubscriptionList", res
94                 if defer:
95                         # XXX: we might want to give some information here besides "we failed"
96                         defer.errback()
97
98 if __name__ == '__main__':
99         from twisted.internet import reactor
100         import sys
101
102         googleReader = GoogleReader(sys.argv[1], sys.argv[2])
103         def googleLoggedIn(self, sid = None):
104                 googleReader.getSubscriptionList().addCallback(googleSubscriptionList).addErrback(googleSubscriptionFailed)
105
106         def googleLoginFailed(self, res = None):
107                 print "Failed to login to Google Reader."
108
109         def googleSubscriptionList(self, subscriptions = None):
110                 print "Got Feeds:", subscriptions
111
112         def googleSubscriptionFailed(self, res = None):
113                 print "Failed to get subscriptions from Google Reader."
114
115         googleReader.login().addCallback(googleLoggedIn).addErrback(googleLoginFailed)
116         reactor.run()