From e28f647a60925790fdac11e45ec89e9ede7bfda3 Mon Sep 17 00:00:00 2001
From: Kevin Whitaker <eyecreate@eyecreate.org>
Date: Sun, 29 Oct 2023 17:00:19 -0400
Subject: [PATCH] Add in more garbage collecting and initial implementation of
 file download.

---
 main.py       | 53 ++++++++++++++++++++++++++++++++++++++++++++++-----
 uNextcloud.py | 30 +++++++++++++++++++++++++----
 2 files changed, 74 insertions(+), 9 deletions(-)

diff --git a/main.py b/main.py
index c45a97e..d8e737c 100644
--- a/main.py
+++ b/main.py
@@ -1,8 +1,51 @@
-import sdcard
 import uNextcloud
+import inky_helper as ih
 import gc
+import sdcard, uos
+import random
+from picographics import PicoGraphics, DISPLAY_INKY_FRAME_7 as DISPLAY
+from jpegdec import JPEG
+
+from secrets import WIFI_SSID, WIFI_PASSWORD, NEXTCLOUD_USERNAME, NEXTCLOUD_PASSWORD
+
+def get_new_image():
+    sd_spi = machine.SPI(0, sck=machine.Pin(18, machine.Pin.OUT), mosi=machine.Pin(19, machine.Pin.OUT),
+                         miso=machine.Pin(16, machine.Pin.OUT))
+    sd = sdcard.SDCard(sd_spi, machine.Pin(22))
+    uos.mount(sd, "/sd")
+    gc.collect()
+
+    ih.network_connect(WIFI_SSID, WIFI_PASSWORD)
+
+    nc = uNextcloud.uNextcloud("https://cloud.eyecreate.org")
+    nc.set_auth(NEXTCLOUD_USERNAME, NEXTCLOUD_PASSWORD)
+    response = nc.get_folder_items("eink-frame")
+
+    try:
+        last = open('/sd/last_wallpaper', 'r')
+        last_file = last.read()
+        last.close()
+    except OSError:
+        last_file = ""
+
+    if response != None:
+        for item in response:
+            if item.url_path == last_file:
+                response.remove(item)
+        ran = random.choice(response)
+        if ran.mimetype == "image/jpeg":
+            update_last = open('/sd/last_wallpaper', 'w+')
+            update_last.write(ran.url_path)
+            update_last.close()
+            print(ran.url_path)
+            gc.collect()
+            nc.download_file_to_path(ran.url_path, "/sd/current_image.jpg")
+            graphics = PicoGraphics(DISPLAY)
+            j = JPEG(graphics)
+
+            j.open_file("/sd/current_image.jpg")
+            j.decode()
+            graphics.update()
+    #sleep?
+
 
-sd_spi = machine.SPI(0, sck=machine.Pin(18, machine.Pin.OUT), mosi=machine.Pin(19, machine.Pin.OUT), miso=machine.Pin(16, machine.Pin.OUT))
-sd = sdcard.SDCard(sd_spi, machine.Pin(22))
-uos.mount(sd, "/sd")
-gc.collect()
diff --git a/uNextcloud.py b/uNextcloud.py
index a7cfe35..7bd213a 100644
--- a/uNextcloud.py
+++ b/uNextcloud.py
@@ -2,7 +2,6 @@ import ElementTree
 import urequests
 from urequests import auth
 import gc
-import uos
 
 
 class uNextcloud:
@@ -41,12 +40,35 @@ class uNextcloud:
                     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, folder_path, file, destination_path):
-        pass
-    
+    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()
-- 
GitLab