from dataclasses import dataclass from urllib.parse import quote, urlparse, urlunparse from os import get_terminal_size from colored import fg, bg, attr @dataclass class RGB: r: int = 0 g: int = 0 b: int = 0 def fix_url(url: str): parts = urlparse(str(url)) return urlunparse(parts._replace(path=quote(parts.path))) def progress_bar(filename: bytes or str, current: int, total: int) -> None: _filename: str if type(filename) is str: _filename = filename else: _filename = filename.decode() def return_diff_color(c1: RGB, c2: RGB, percent: int) -> RGB: def return_diff(n1, n2, _percent=100) -> int: if n1 > n2: return n1 - int((n1 - n2) * (_percent / 100)) elif n1 < n2: return n1 + int((n2 - n1) * (_percent / 100)) return n1 new_rgb = RGB(r=return_diff(c1.r, c2.r, percent), g=return_diff(c1.g, c2.g, percent), b=return_diff(c1.b, c2.b, percent)) return new_rgb def color_to_hex(color: RGB) -> str: def return_hex_number(n: int): hnum = hex(int(n)) return f'{str(hnum).replace("0x", "").zfill(2)}' r: str = return_hex_number(color.r) g: str = return_hex_number(color.g) b: str = return_hex_number(color.b) return f"{r}{g}{b}" base_color = RGB(r=68, g=121, b=84) end_color = RGB(r=0, g=255, b=68) loading_chars = "|/-\\" try: screen_size = get_terminal_size().columns() except Exception: screen_size = 120 available_colums = int(screen_size / 100 * 50) percent = int(float(current) / float(total) * 100) _n = percent % len(loading_chars) load_bar = "=" * int((available_colums / 100) * percent) + '=>' space_filling = " " * int(available_colums-len(load_bar)) _color = f'#{color_to_hex(return_diff_color(base_color, end_color, percent))}' print( f'\t[{loading_chars[_n]}] {fg(_color)}{load_bar}{attr("reset")} [{percent}%] {space_filling} {[" "," ",""][len(str(percent))-1]}[{(_filename[:75] + "..") if len(_filename) > 75 else _filename}]', end='\r')