import urequests import ElementTree class uNextcloud: class File: def __init__(self, url_path, mimetype): self.url_path = url_path self.mimetype = mimetype def get_url(self): return self.url_path def get_mimetype(self): return self.mimetype def __init__(self, nextcloud_url): self.url = nextcloud_url self.username = None self.password = None def set_auth(self, username, password): self.username = username self.password = password def get_folder_items(self, folder_path=""): response = urequests.request("PROPFIND", self.url+"/remote.php/dav/files/"+self.username+"/"+folder_path, auth=(self.username, self.password)) if 200 <= response.status_code < 300: file_list = [] try: xml = ElementTree.fromstring(response.text) for resp in xml: href = resp.find_first_by_tag("href") propstat = resp.find_first_by_tag("propstat") prop = propstat.find_first_by_tag("prop") content_type = prop.find_first_by_tag("getcontenttype") if content_type != None: file_list.append(self.File(href.text, content_type.text)) response.close() return file_list except AttributeError: response.close() return None else: response.close() return None def download_file_to_path(self, url_path, destination_path): response = urequests.request("GET", self.url+url_path, auth=(self.username, self.password)) if 200 <= response.status_code < 300: len = 0 with open(destination_path, 'wb') as dest: data = bytearray(1024) while True: print(f"downloaded {len}") if response.raw.readinto(data) == 0: break len += 1024 dest.write(data) dest.flush() response.close() else: response.close() raise Exception()