"""CircuitPython file download utility. Downloads files over Wi-Fi in chunks to local flash or microSD card storage. """ import os from sd_cp import SDCardManager def download_file(url, dest_filename, session, use_sd=True): """Downloads a file from a URL over the network. Args: url (str): Source URL. dest_filename (str): Target filename. session (Session): adafruit_requests Session object. use_sd (bool): Save to microSD card if True, else local flash. """ dest_path = dest_filename sd_manager = None if use_sd: sd_manager = SDCardManager(mount_point='/sd') if not sd_manager.mount(): print("Download Error: Could not mount SD card.") return None dest_path = f"/sd/{dest_filename}" print(f"Starting download from: {url} -> {dest_path}") try: res = session.get(url) except Exception as e: print(f"HTTP Connection failed: {e}") return None if res.status_code != 200: print(f"HTTP Error: Received status code {res.status_code}") res.close() return None try: chunk_size = 4096 total_downloaded = 0 with open(dest_path, 'wb') as f: for chunk in res.iter_content(chunk_size): if not chunk: break f.write(chunk) total_downloaded += len(chunk) if total_downloaded % (chunk_size * 25) == 0: print(f"Downloaded {total_downloaded // 1024} KB...") print(f"Download complete! Saved {total_downloaded} bytes to '{dest_path}'.") return dest_path except Exception as e: print(f"Error writing to file: {e}") try: os.remove(dest_path) except: pass return None finally: res.close()