4
from urllib.parse import urljoin
7
from html.parser import HTMLParser
13
def ResolveDownloadUrl(downloadUrl, pattern):
14
with urllib.request.urlopen(downloadUrl ) as response:
15
html = response.read().decode("utf-8")
17
class MyHTMLParser(HTMLParser):
18
def handle_starttag(self, tag, attrs):
21
if attr[0] == 'href' and re.match(pattern, attr[1]):
22
result.append(urljoin(downloadUrl, attr[1]))
23
def handle_endtag(self, tag):
25
def handle_data(self, data):
28
parser = MyHTMLParser()
34
def DownloadUrl(url, output_path = None):
35
class DownloadProgressBar(tqdm):
36
def update_to(self, b=1, bsize=1, tsize=None):
39
self.update(b * bsize - self.n)
40
if output_path is None:
41
output_path = tempfile.mktemp()
42
print('Downloading "%s" to "%s"' % (url, output_path))
43
with DownloadProgressBar(unit='B', unit_scale=True,
44
miniters=1, desc=url.split('/')[-1]) as t:
45
urllib.request.urlretrieve(url, filename=output_path, reporthook=t.update_to)
49
def Unpack(file, toPath):
50
print('Extracting "%s" to "%s"' % (file, toPath))
51
with zipfile.ZipFile(file, 'r') as zip_ref:
52
zip_ref.extractall(toPath)
55
def DownloadPackage(env, package):
56
home = os.path.expanduser("~")
57
packageExtractPath = os.path.join(home, '.mcucpp', package['type'], package['name'])
58
if 'verifyPath' in package:
59
verifyPath = os.path.join(packageExtractPath, package['verifyPath'])
60
if os.path.isfile(verifyPath):
61
print ('Package "%s" is already in place' % package['name'])
64
if 'searchUrl' in package:
65
if 'searchPattern' in package:
66
searchPattern = package['searchPattern']
68
searchPattern = r'.*\.zip'
69
downloadUrl = ResolveDownloadUrl(package['searchUrl'], searchPattern)[0]
71
downloadUrl = package['dpwnloadUrl']
72
file = DownloadUrl(downloadUrl)
74
Unpack(file, packageExtractPath)
75
env[package['name']] = packageExtractPath