#!/usr/local/bin/python
# handrss.py -- Use an OPML file (XML "subscription list" for an RSS reader)
# to update the "RSS Source URLs" Palm PDB file for the Hand/RSS reader.
#
# Hand/RSS itself is at http://standalone.com/palmos/hand_rss/
# The original peepdb is at http://linux.piter-press.ru/peepdb/
# but you probably need the patches in the version distributed near this file
#
# Copyright 2003 Mark Eichin <eichin@thok.org>
# free for all use, please send me patches or info about interesting uses.
import peepdb
import os
import sys
import struct
import xml.dom
import xml.dom.minidom
progname, palmuser = sys.argv
home = os.getenv("HOME")
oplfile = xml.dom.minidom.parse(os.path.join(home, "MySubscriptions.opml"))
def fakexpath(nodes, xmldoc):
if not nodes:
return [xmldoc]
hotnodes = [n for n
in xmldoc.childNodes
if n.nodeType == xml.dom.Node.ELEMENT_NODE
and n.nodeName == nodes[0]]
res = []
# can't use a comprehension because they're all lists...
for node in hotnodes:
res.extend(fakexpath(nodes[1:], node))
return res
oplentries = {}
oplorder = []
for opl in fakexpath(["opml", "body", "outline"], oplfile):
xmlurl = opl.attributes["xmlUrl"].nodeValue.encode("iso-8859-1")
title = opl.attributes["title"].nodeValue.encode("iso-8859-1")
oplentries[xmlurl] = title
oplorder.append(xmlurl)
rssfile = "RSS Source URLs.pdb"
filename = os.path.join(home, "Documents/Palm/Users", palmuser, "Backups", rssfile)
outfilename = os.path.join(home, "Documents/Palm/Users", palmuser, "Files to Install", rssfile)
p = peepdb.palmdb('load', filename)
def cvt_id(id):
return struct.unpack(">BH", id)
def make_id(id):
return struct.pack(">BH", 100, id)
idlow = [struct.unpack(">BH",r[0].get_id())[1] for r in p.records]
idlow.sort()
pdbentries = {}
pdborder = []
for r in p.records:
pdbtitle,pdburl,tail = r[1][48:].split("\0")
pdbentries[pdburl] = pdbtitle
pdborder.append(pdburl)
def next_id():
nid = idlow[-1] + 1
idlow.append(nid)
return nid
def add_rss_record(p, title, url):
lastrec = p.records[-1]
id = next_id()
shorturl = url.replace("http://", "")
data = lastrec[1][:48] + title + "\0" + shorturl + "\0"
p.create_new_record(make_id(id), data)
p.records[-1][0].set_dirty_bit(1)
# title = "Burn Before Reading"
# shorturl = "www-images.thok.org/~burnbeforereading/index.rss"
# add_rss_record(p, title, shorturl)
for shorturl in pdborder:
url = "http://" + shorturl
if url not in oplorder:
print "only on palm:", url, pdbentries[shorturl]
for url in oplorder:
if not url.startswith("http://"):
print "not http:", url
continue
shorturl = url.replace("http://", "")
if shorturl in pdborder:
print "already present:", url
continue
add_rss_record(p, oplentries[url], url)
p.save_to_file(outfilename)