75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
import ElementTree
|
|
import urequests
|
|
from urequests import auth
|
|
import gc
|
|
|
|
|
|
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=urequests.auth.HTTPBasicAuth(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()
|
|
gc.collect()
|
|
return file_list
|
|
except AttributeError:
|
|
response.close()
|
|
gc.collect()
|
|
return None
|
|
else:
|
|
response.close()
|
|
gc.collect()
|
|
return None
|
|
|
|
def download_file_to_path(self, url_path, destination_path):
|
|
response = urequests.request("GET", self.url+url_path, auth=urequests.auth.HTTPBasicAuth(self.username, self.password))
|
|
if 200 <= response.status_code < 300:
|
|
dest = open(destination_path, 'wb')
|
|
data = bytearray(1024)
|
|
len = 0
|
|
while True:
|
|
print(f"downloaded {len}")
|
|
gc.collect()
|
|
if response.raw.readinto(data) == 0:
|
|
break
|
|
len += 1024
|
|
dest.write(data)
|
|
print(gc.mem_free())
|
|
dest.close()
|
|
response.close()
|
|
gc.collect()
|
|
else:
|
|
response.close()
|
|
raise Exception()
|