summaryrefslogtreecommitdiff
path: root/osc/grabber.py
blob: b8e4441a8f83f97c44afc9393372c39db4e52516 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# Copyright (C) 2018 SUSE Linux.  All rights reserved.
# This program is free software; it may be used, copied, modified
# and distributed under the terms of the GNU General Public Licence,
# either version 2, or (at your option) any later version.

import sys
import os.path
from .core import streamfile

try:
    from urllib.request import HTTPError
    from urllib.parse import urlparse
    from urllib.parse import unquote
    from urllib.error import URLError
except ImportError:
    from urllib2 import HTTPError
    from urlparse import urlparse
    from urllib import unquote
    from urllib2 import URLError


class OscFileGrabber(object):
    def __init__(self, progress_obj=None):
        self.progress_obj = progress_obj

    def urlgrab(self, url, filename=None, text=None):
        if filename is None:
            parts = urlparse(url)
            filename = os.path.basename(unquote(parts[2]))
        with open(filename, 'wb') as f:
            for i in streamfile(url, progress_obj=self.progress_obj,
                                text=text):
                f.write(i)


class OscMirrorGroup(object):
    def __init__(self, grabber, mirrors):
        self._grabber = grabber
        self._mirrors = mirrors

    def urlgrab(self, url, filename=None, text=None):
        for mirror in self._mirrors:
            try:
                self._grabber.urlgrab(mirror, filename, text)
                return True
            except (HTTPError, URLError) as e:
                # try next mirror
                pass

        return False