Hans Ulrich Niedermann edb9351
#!/usr/bin/python
Hans Ulrich Niedermann ef82408
#
Hans Ulrich Niedermann ef82408
# Download the latest gpsbabel source tarball by simulating a browser
Hans Ulrich Niedermann ef82408
# visit and a HTTP POST form submission (there is no other way to
Hans Ulrich Niedermann ef82408
# download those files).
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
import re
Hans Ulrich Niedermann edb9351
import urllib2
Hans Ulrich Niedermann edb9351
import subprocess
Hans Ulrich Niedermann edb9351
from BeautifulSoup import BeautifulSoup
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
download_url = "http://www.gpsbabel.org/download.html"
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
print "Loading HTML page", download_url
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
page = urllib2.urlopen(download_url)
Hans Ulrich Niedermann edb9351
# print "page:", page
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
soup = BeautifulSoup(page)
Hans Ulrich Niedermann edb9351
# print "soup:", soup
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
rexp = re.compile('\.tar\.gz$')
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
def test_tag(tag):
Hans Ulrich Niedermann edb9351
    if tag.name != 'form': return False
Hans Ulrich Niedermann edb9351
    if tag['action'] != 'plan9.php': return False
Hans Ulrich Niedermann edb9351
    if tag['method'] != 'post': return False
Hans Ulrich Niedermann edb9351
    if tag['enctype'] != 'multipart/form-data': return False
Hans Ulrich Niedermann edb9351
    found = tag.find('input', value=rexp)
Hans Ulrich Niedermann edb9351
    return found
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
tarball_form = soup.find(test_tag)
Hans Ulrich Niedermann edb9351
form_inputs = tarball_form.findAll('input')
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
d = dict([ (input['name'], input['value']) for input in form_inputs ])
Hans Ulrich Niedermann edb9351
# print d
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
tarball = d[u'dl']
Hans Ulrich Niedermann edb9351
token = d[u'token']
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
# print "tarball:", tarball
Hans Ulrich Niedermann edb9351
# print "token:", token
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann ef82408
# Python has no library functions which handle 'multipart/form-data'
Hans Ulrich Niedermann ef82408
# encoding, and the pycurl interface is non-trivial, so we just run
Hans Ulrich Niedermann ef82408
# the 'curl' program as a separate process.
Hans Ulrich Niedermann edb9351
cmd = [ 'curl',
Hans Ulrich Niedermann edb9351
        '-F', "=".join(['dl', tarball]),
Hans Ulrich Niedermann edb9351
        '-F', "=".join(['token', token]),
Hans Ulrich Niedermann edb9351
        '-e', download_url,
Hans Ulrich Niedermann edb9351
        'http://www.gpsbabel.org/plan9.php',
Hans Ulrich Niedermann edb9351
        '-o', tarball ]
Hans Ulrich Niedermann edb9351
# print "Command:", cmd
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
print "Running curl to get tarball via HTTP POST:", tarball
Hans Ulrich Niedermann edb9351
retcode = subprocess.call(cmd, shell=False)
Hans Ulrich Niedermann edb9351
Hans Ulrich Niedermann edb9351
if retcode == 0:
Hans Ulrich Niedermann edb9351
    print "Successfully downloaded tarball:", tarball
Hans Ulrich Niedermann edb9351
else:
Hans Ulrich Niedermann edb9351
    print "Error downloading tarball (%d):" % retcode, tarball