- #pprint.pprint(r)
- if len(r['syncitems']) == 0:
- break
- for item in r['syncitems']:
- if item['item'][0] == 'L':
- print "Fetching journal entry %s (%s)" % (item['item'], item['action'])
- try:
- e = server.LJ.XMLRPC.getevents(dochallenge({
- 'username': Username,
- 'ver': 1,
- 'selecttype': "one",
- 'itemid': item['item'][2:],
- }, Password))
- writedump("%s/%s" % (Username, item['item']), e['events'][0])
- newentries += 1
- except xmlrpclib.Fault, x:
- print "Error getting item: %s" % item['item']
- pprint.pprint(x)
- errors += 1
- lastsync = item['time']
-
-# The following code doesn't work because the server rejects our repeated calls.
-# http://www.livejournal.com/doc/server/ljp.csp.xml-rpc.getevents.html
-# contains the statement "You should use the syncitems selecttype in
-# conjuntions [sic] with the syncitems protocol mode", but provides
-# no other explanation about how these two function calls should
-# interact. Therefore we just do the above slow one-at-a-time method.
-
-#while True:
-# r = server.LJ.XMLRPC.getevents(dochallenge({
-# 'username': Username,
-# 'ver': 1,
-# 'selecttype': "syncitems",
-# 'lastsync': lastsync,
-# }, Password))
-# pprint.pprint(r)
-# if len(r['events']) == 0:
-# break
-# for item in r['events']:
-# writedump("%s/L-%d" % (Username, item['itemid']), item)
-# newentries += 1
-# lastsync = item['eventtime']
-
-print "Fetching journal comments for: %s" % Username
-
-try:
- f = open("%s/comment.meta" % Username)
- metacache = pickle.load(f)
+ userpics = dict(zip(map(str, r['pickws']), r['pickwurls']))
+ userpics['*'] = r['defaultpicurl']
+
+ while True:
+ r = server.LJ.XMLRPC.syncitems(dochallenge(server, {
+ 'username': Username,
+ 'ver': 1,
+ 'lastsync': lastsync,
+ }, Password))
+ #pprint.pprint(r)
+ if len(r['syncitems']) == 0:
+ break
+ for item in r['syncitems']:
+ if item['item'][0] == 'L':
+ print "Fetching journal entry %s (%s)" % (item['item'], item['action'])
+ try:
+ e = server.LJ.XMLRPC.getevents(dochallenge(server, {
+ 'username': Username,
+ 'ver': 1,
+ 'selecttype': "one",
+ 'itemid': item['item'][2:],
+ }, Password))
+ if e['events']:
+ writedump("%s/%s" % (Username, item['item']), e['events'][0])
+ newentries += 1
+ else:
+ print "Unexpected empty item: %s" % item['item']
+ errors += 1
+ except xmlrpclib.Fault, x:
+ print "Error getting item: %s" % item['item']
+ pprint.pprint(x)
+ errors += 1
+ lastsync = item['time']
+ writelast(Username, lastsync, lastmaxid)
+
+ # The following code doesn't work because the server rejects our repeated calls.
+ # http://www.livejournal.com/doc/server/ljp.csp.xml-rpc.getevents.html
+ # contains the statement "You should use the syncitems selecttype in
+ # conjuntions [sic] with the syncitems protocol mode", but provides
+ # no other explanation about how these two function calls should
+ # interact. Therefore we just do the above slow one-at-a-time method.
+
+ #while True:
+ # r = server.LJ.XMLRPC.getevents(dochallenge(server, {
+ # 'username': Username,
+ # 'ver': 1,
+ # 'selecttype': "syncitems",
+ # 'lastsync': lastsync,
+ # }, Password))
+ # pprint.pprint(r)
+ # if len(r['events']) == 0:
+ # break
+ # for item in r['events']:
+ # writedump("%s/L-%d" % (Username, item['itemid']), item)
+ # newentries += 1
+ # lastsync = item['eventtime']
+
+ print "Fetching journal comments for: %s" % Username
+
+ try:
+ f = open("%s/comment.meta" % Username)
+ metacache = pickle.load(f)
+ f.close()
+ except:
+ metacache = {}
+
+ try:
+ f = open("%s/user.map" % Username)
+ usermap = pickle.load(f)
+ f.close()
+ except:
+ usermap = {}
+
+ maxid = lastmaxid
+ while True:
+ r = urllib2.urlopen(urllib2.Request(Server+"/export_comments.bml?get=comment_meta&startid=%d" % (maxid+1), headers = {'Cookie': "ljsession="+ljsession}))
+ meta = xml.dom.minidom.parse(r)
+ r.close()
+ for c in meta.getElementsByTagName("comment"):
+ id = int(c.getAttribute("id"))
+ metacache[id] = {
+ 'posterid': c.getAttribute("posterid"),
+ 'state': c.getAttribute("state"),
+ }
+ if id > maxid:
+ maxid = id
+ for u in meta.getElementsByTagName("usermap"):
+ usermap[u.getAttribute("id")] = u.getAttribute("user")
+ if maxid >= int(meta.getElementsByTagName("maxid")[0].firstChild.nodeValue):
+ break
+
+ f = open("%s/comment.meta" % Username, "w")
+ pickle.dump(metacache, f)