URI: 
       tScanning and parsing QR codes using computer's camera. - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit b21ebc0da4b5d7f726b18e007101cf9553203c0e
   DIR parent 09c8e956e13627a6250c3a9b12573ab6ac744956
  HTML Author: slush <info@bitcoin.cz>
       Date:   Thu,  2 Aug 2012 15:18:06 +0200
       
       Scanning and parsing QR codes using computer's camera.
       
       Diffstat:
         A lib/qrscanner.py                    |      75 +++++++++++++++++++++++++++++++
       
       1 file changed, 75 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/lib/qrscanner.py b/lib/qrscanner.py
       t@@ -0,0 +1,75 @@
       +from util import print_error
       +
       +try:
       +    import zbar
       +except ImportError:    
       +    print_error("Install zbar package to enable QR scans")
       +    zbar = None
       +
       +from urlparse import urlparse, parse_qs
       +
       +def is_available():
       +    if not zbar:
       +        return False
       +    return True
       +
       +def scan_qr():
       +    proc = zbar.Processor()
       +    proc.init()
       +    proc.visible = True
       +
       +    while True:
       +        try:
       +            proc.process_one()
       +        except:
       +            # User closed the preview window
       +            return {}
       +
       +        for r in proc.results:
       +            if str(r.type) != 'QRCODE':
       +                continue
       +
       +            return parse_uri(r.data)
       +        
       +def parse_uri(uri):
       +    if ':' not in uri:
       +        # It's just an address (not BIP21)
       +        return {'address': uri}
       +
       +    if '//' not in uri:
       +        # Workaround for urlparse, it don't handle bitcoin: URI properly
       +        uri = uri.replace(':', '://')
       +        
       +    uri = urlparse(uri)
       +    result = {'address': uri.netloc} 
       +    
       +    if uri.path.startswith('?'):
       +        params = parse_qs(uri.path[1:])
       +    else:
       +        params = parse_qs(uri.path)    
       +
       +    for k,v in params.items():
       +        if k in ('amount', 'label', 'message'):
       +            result[k] = v[0]
       +        
       +    return result    
       +
       +if __name__ == '__main__':
       +    # Run some tests
       +    
       +    assert(parse_uri('1Marek48fwU7mugmSe186do2QpUkBnpzSN') ==
       +           {'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
       +
       +    assert(parse_uri('bitcoin://1Marek48fwU7mugmSe186do2QpUkBnpzSN') ==
       +           {'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
       +    
       +    assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN') ==
       +           {'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
       +    
       +    assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN?amount=10') ==
       +           {'amount': '10', 'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
       +    
       +    assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN?amount=10&label=slush&message=Small%20tip%20to%20slush') ==
       +           {'amount': '10', 'label': 'slush', 'message': 'Small tip to slush', 'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'})
       +    
       +