X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=icalparse.py;h=3cdc7f1c6222c68968e31ea71b7f0044a7e888bf;hb=08ba47d0e811c700411e763559a4e535cc459cf0;hp=293295c62dcf5da892eee740ce01b9088eede732;hpb=dd8076b16e4c04a510dc8fe8fe8655f5e350014f;p=frenchie%2Ficalparse.git diff --git a/icalparse.py b/icalparse.py index 293295c..3cdc7f1 100755 --- a/icalparse.py +++ b/icalparse.py @@ -23,6 +23,7 @@ import sys import urlparse import os +from cgi import parse_header class InvalidICS(Exception): pass @@ -132,14 +133,17 @@ def getContent(url='',stdin=False): try: res = urllib2.urlopen(url) content = res.read() - if 'content-type' in res.info(): ct = res.info()['content-type'] - else: ct = '' + ct = res.info().getplist() res.close() except (urllib2.URLError, OSError), e: sys.stderr.write('%s\n'%e) sys.exit(1) - encoding = 'charset' in ct and ct.split(';')[-1].lower().split('=')[-1].strip() or '' + for param in ct: + if 'charset' in param: + encoding = param.split('=')[1] + break + return (content, encoding) @@ -153,7 +157,8 @@ def getHTTPContent(url='',cache='.httplib2-cache'): import urllib2 if not url: return ('','') - if not 'http' in parsedURL[0]: return ('','') + + if not 'http' in urlparse.urlparse(url)[0]: return ('','') if 'httplib2' in sys.modules: try: h = httplib2.Http('.httplib2-cache') @@ -167,8 +172,15 @@ def getHTTPContent(url='',cache='.httplib2-cache'): sys.stderr.write('%s\n'%e) sys.exit(1) - content = req[1] - if 'content-type' in req[0]: ct = req[0]['content-type'] + resp, content = req + if 'content-type' in resp: + ct = 'Content-Type: %s'%req[0]['content-type'] + ct = parse_header(ct) + if 'charset' in ct[1]: encoding = ct[1]['charset'] + else: encoding = '' + else: + ct = '' + encoding = '' else: try: @@ -178,11 +190,11 @@ def getHTTPContent(url='',cache='.httplib2-cache'): sys.exit(1) content = req.read() - info = req.info() - - ct = info['content-type'] - - encoding = 'charset' in ct and ct.split(';')[-1].lower().split('=')[-1].strip() or '' + ct = req.info().getplist() + for param in ct: + if 'charset' in param: + encoding = param.split('=')[1] + break return (content, encoding) @@ -255,6 +267,21 @@ def writeOutput(cal, outfile=''): out.close() +def vobjectRules(ics): + '''Applies rules to the ICS file before we have our way with it''' + + try: + import vobjectRules + except ImportError: + sys.stderr.write('Vobject rules file could not be imported\n') + return ics + + for rule in vobjectRules.runRules: + ics = rule(ics) + + return ics + + if __name__ == '__main__': from optparse import OptionParser # If the user passed us a 'stdin' argument, we'll go with that, @@ -270,6 +297,9 @@ if __name__ == '__main__': parser.add_option('-m','--encoding', dest='encoding', default='', help='Specify a different character encoding' '(ignored if the remote server also specifies one)') + parser.add_option('-r','--vobject-rules', + action='store_true', dest='vobject', + help='Run rules written for vobject stored in vobjectRules.py') (options, args) = parser.parse_args() @@ -283,6 +313,7 @@ if __name__ == '__main__': (content, encoding) = getContent(url, options.stdin) encoding = encoding or options.encoding or 'utf-8' + if options.vobject: content = vobjectRules(content) cal = lineJoiner(content, encoding) ical = applyRules(splitFields(cal), generateRules(), options.verbose) output = lineFolder(joinFields(ical))