def find_url(self, item):
        url = item.url

        if url:
            return url
        else:
            network = item.network

            if network is "gm":
                if self.gm is None:
                    from utils.app_config import Config
                    config = Config()

                    self.gm = GoogleMusic(config.config["gm"]["email"], config.config["gm"]["password"])
                    self.gm.init()

                url = self.get_gm_url(item)

                if url:
                    return url
                else:
                    return self.get_vk_url(item)
            elif network == "last fm":
                return self.get_vk_url(item)
class Downloader:
    gm = None
    vk = None
    tracks_without_url = []

    def __init__(self):
        pass

    def get_gm_url(self, item):
        try:
            return self.gm.api.get_stream_url(item.track_id)
        except Exception:
            return None

    def get_vk_url(self, item):
        if self.vk is None:
            from utils.app_config import Config
            config = Config()

            self.vk = Vkontakte(config.config["vk"]["email"], config.config["vk"]["password"],
                                config.config["vk"]["app_id"])
            self.vk.init()

        search_items = self.vk.search_track("%s-%s" % (item.artist, item.title))
        url = None

        if search_items is not None:
            for search_item in search_items:
                artist = search_item["artist"]
                title = search_item["title"]

                artist_cmp_factor = compare(artist, item.artist)
                title_cmp_factor = compare(title, item.title)

                if artist_cmp_factor > 80 and title_cmp_factor > 80:
                    url = search_item["url"]

                    break

        if not url:
            i = random.randint(3, 10)

            print((Fore.CYAN + "\tVk resolver: sleep in %d seconds" + Fore.RESET) % i)

            time.sleep(i)

        return url

    def find_url(self, item):
        url = item.url

        if url:
            return url
        else:
            network = item.network

            if network is "gm":
                if self.gm is None:
                    from utils.app_config import Config
                    config = Config()

                    self.gm = GoogleMusic(config.config["gm"]["email"], config.config["gm"]["password"])
                    self.gm.init()

                url = self.get_gm_url(item)

                if url:
                    return url
                else:
                    return self.get_vk_url(item)
            elif network == "last fm":
                return self.get_vk_url(item)

    def handle_item(self, items, item):
        name = FILE_TEMPLATE % (item.artist, item.title)

        if os.path.isfile(FILE_MUSIC + os.path.sep + normalize_name(name)):
            print(Fore.GREEN + "\tFile %s exist" % name.encode('ascii', 'ignore'))

            return

        url = self.find_url(item)

        if url:
            print(Fore.YELLOW + "\t[%d/%d] Download %s - %s" % (
                items.index(item) + 1 if item in items else 0,
                len(items),
                item.artist.encode('ascii', 'ignore'),
                item.title.encode('ascii', 'ignore')))

            to_file(url, FILE_MUSIC + os.path.sep + normalize_name(name))
        else:
            self.tracks_without_url.append(item)

            print(Fore.RED + "\tUrl for %s - %s not found" % (
                item.artist.encode('ascii', 'ignore'),
                item.title.encode('ascii', 'ignore')))

    def download_all(self, items):
        print(Fore.RESET + "\n============================================")
        print("Download tracks...\n")

        if not os.path.isdir(FILE_MUSIC):
            os.makedirs(FILE_MUSIC)

        for item in items:
            if item.tracks:
                self.handle_item(items, get_candidate(item.tracks))
            else:
                self.handle_item(items, item)