diff --git a/aqt/installer.py b/aqt/installer.py index 962b3bf..29d7674 100644 --- a/aqt/installer.py +++ b/aqt/installer.py @@ -27,7 +27,7 @@ import platform import requests import sys import traceback -import aqt.metalink +import xml.etree.ElementTree as ElementTree from six import StringIO from multiprocessing.dummy import Pool from operator import and_ @@ -50,16 +50,10 @@ def _get(url, stream=False, mirror=True): blacklist = ['http://mirrors.ustc.edu.cn', 'http://mirrors.tuna.tsinghua.edu.cn', 'http://mirrors.geekpie.club'] - for b in blacklist: - if newurl.startswith(b): - mml = aqt.metalink.Metalink(url) - newurl = mml.altlink(blacklist=blacklist) - break - try: - r = requests.get(newurl, stream=stream) - except requests.exceptions.ConnectionError as e: - print('Redirected to new URL: {}'.format(newurl)) - raise e + mml = Metalink(url) + newurl = mml.altlink(blacklist=blacklist) + print('Redirected to new URL: {}'.format(newurl)) + r = requests.get(newurl, stream=stream) else: r = requests.get(url, stream=True) return r @@ -147,3 +141,47 @@ class QtInstaller: raise e else: exit(1) + + + +class Metalink: + '''Download .meta4 metalink version4 xml file and parse it.''' + + def __init__(self, url): + self.mirrors = {} + self.url = url + try: + m = requests.get(url + '.meta4') + except: + return + else: + mirror_xml = ElementTree.fromstring(m.text) + for f in mirror_xml.iter("{urn:ietf:params:xml:ns:metalink}file"): + for u in f.iter("{urn:ietf:params:xml:ns:metalink}url"): + pri = u.attrib['priority'] + self.mirrors[pri] = u.text + + def altlink(self, priority=None, blacklist=None): + if len(self.mirrors) == 0: + # no alternative + return self.url + if priority is None: + if blacklist is not None: + for ind in range(len(self.mirrors)): + mirror = self.mirrors[str(ind + 1)] + black = False + for b in blacklist: + if mirror.startswith(b): + black = True + continue + if black: + continue + return mirror + else: + for ind in range(len(self.mirrors)): + mirror = self.mirrors[str(ind + 1)] + if mirror == self.candidate: + continue + return mirror + else: + return self.mirrors[str(priority)] \ No newline at end of file diff --git a/aqt/metalink.py b/aqt/metalink.py deleted file mode 100644 index 324973f..0000000 --- a/aqt/metalink.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright (C) 2018 Linus Jahn -# Copyright (C) 2019 Hiroshi Miura -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of -# this software and associated documentation files (the "Software"), to deal in -# the Software without restriction, including without limitation the rights to -# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -# the Software, and to permit persons to whom the Software is furnished to do so, -# subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -import requests -import xml.etree.ElementTree as ElementTree - - -class Metalink: - '''Download .meta4 metalink version4 xml file and parse it.''' - - def __init__(self, url, candidate=None): - self.mirrors = {} - self.url = url - self.candidate = candidate - m = requests.get(url + '.meta4') - mirror_xml = ElementTree.fromstring(m.text) - for f in mirror_xml.iter("{urn:ietf:params:xml:ns:metalink}file"): - for u in f.iter("{urn:ietf:params:xml:ns:metalink}url"): - pri = u.attrib['priority'] - self.mirrors[pri] = u.text - - def altlink(self, priority=None, blacklist=None): - if len(self.mirrors) == 0: - # no alternative - if self.candidate is not None: - return self.candidate - else: - return self.url - if priority is None: - if blacklist is not None: - for ind in range(len(self.mirrors)): - mirror = self.mirrors[str(ind + 1)] - black = False - for b in blacklist: - if mirror.startswith(b): - black = True - continue - if black: - continue - return mirror - else: - for ind in range(len(self.mirrors)): - mirror = self.mirrors[str(ind + 1)] - if mirror == self.candidate: - continue - return mirror - else: - return self.mirrors[str(priority)]