import src.fw_api import sys from urllib.parse import unquote def get_remote_file_name(url): '''This function return filename by content-disposition header''' r = src.fw_api.current_instance.s.head(url) content_dispos = r.headers.get('content-disposition') if content_dispos.startswith('attachment; filename*=UTF-8\'\''): return unquote(content_dispos.split('attachment; filename*=UTF-8\'\'')[-1]) def download_track(url, name=None): url = url.split('?')[0] # Stripe all params from url r = src.fw_api.current_instance.s.get(url, stream=True) if not name: name = get_remote_file_name(url) if not name: name = url.split(r'/')[-1] with open(name.replace('/', '_'), 'wb') as f: print(f"Downloading {name}") total_length = r.headers.get('content-length') if total_length is None: # no content length header f.write(r.content) else: dl = 0 total_length = int(total_length) for data in r.iter_content(chunk_size=4096): dl += len(data) f.write(data) done = int(50 * dl / total_length) # base progress bar sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done))) sys.stdout.flush() return name