Beginning of a series of changes to use vobject
[frenchie/icalparse.git] / icalparse.py
index 293295c..3cdc7f1 100755 (executable)
@@ -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))

UCC git Repository :: git.ucc.asn.au