From e6d2d87b31cbd5b9e770386e1cf6d78cfbe39b06 Mon Sep 17 00:00:00 2001 From: dgtlmoon Date: Sat, 18 Mar 2023 20:52:52 +0100 Subject: [PATCH] Notification screenshots - now PNG only for now to save disk space (no point creating two images) (#1481) --- changedetectionio/model/Watch.py | 11 ----------- changedetectionio/store.py | 5 ----- changedetectionio/tests/test_notification.py | 17 ++++++++--------- changedetectionio/update_worker.py | 2 +- 4 files changed, 9 insertions(+), 26 deletions(-) diff --git a/changedetectionio/model/Watch.py b/changedetectionio/model/Watch.py index 1901e658..403ac858 100644 --- a/changedetectionio/model/Watch.py +++ b/changedetectionio/model/Watch.py @@ -313,17 +313,6 @@ class model(dict): # False is not an option for AppRise, must be type None return None - def get_screenshot_as_jpeg(self): - - # Created by save_screenshot() - fname = os.path.join(self.watch_data_dir, "last-screenshot.jpg") - if os.path.isfile(fname): - return fname - - # False is not an option for AppRise, must be type None - return None - - def __get_file_ctime(self, filename): fname = os.path.join(self.watch_data_dir, filename) if os.path.isfile(fname): diff --git a/changedetectionio/store.py b/changedetectionio/store.py index 9ffadf9c..f7bffbe8 100644 --- a/changedetectionio/store.py +++ b/changedetectionio/store.py @@ -361,11 +361,6 @@ class ChangeDetectionStore: f.write(screenshot) f.close() - # Make a JPEG that's used in notifications (due to being a smaller size) available - from PIL import Image - im1 = Image.open(target_path) - im1.convert('RGB').save(target_path.replace('.png','.jpg'), quality=int(os.getenv("NOTIFICATION_SCREENSHOT_JPG_QUALITY", 75))) - def save_error_text(self, watch_uuid, contents): if not self.data['watching'].get(watch_uuid): diff --git a/changedetectionio/tests/test_notification.py b/changedetectionio/tests/test_notification.py index 8eedcd7c..036bf730 100644 --- a/changedetectionio/tests/test_notification.py +++ b/changedetectionio/tests/test_notification.py @@ -73,16 +73,12 @@ def test_check_notification(client, live_server): # We write the PNG to disk, but a JPEG should appear in the notification # Write the last screenshot png testimage_png = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=' - # This one is created when we save the screenshot from the webdriver/playwright session (converted from PNG) - testimage_jpg = '/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAABAAEBAREA/8QAFAABAAAAAAAAAAAAAAAAAAAACf/EABQQAQAAAAAAAAAAAAAAAAAAAAD/2gAIAQEAAD8AKp//2Q==' uuid = extract_UUID_from_client(client) datastore = 'test-datastore' with open(os.path.join(datastore, str(uuid), 'last-screenshot.png'), 'wb') as f: f.write(base64.b64decode(testimage_png)) - with open(os.path.join(datastore, str(uuid), 'last-screenshot.jpg'), 'wb') as f: - f.write(base64.b64decode(testimage_jpg)) # Goto the edit page, add our ignore text # Add our URL to the import page @@ -162,12 +158,12 @@ def test_check_notification(client, live_server): # Check the attachment was added, and that it is a JPEG from the original PNG notification_submission_object = json.loads(notification_submission) - assert notification_submission_object['attachments'][0]['filename'] == 'last-screenshot.jpg' + # We keep PNG screenshots for now + assert notification_submission_object['attachments'][0]['filename'] == 'last-screenshot.png' assert len(notification_submission_object['attachments'][0]['base64']) - assert notification_submission_object['attachments'][0]['mimetype'] == 'image/jpeg' + assert notification_submission_object['attachments'][0]['mimetype'] == 'image/png' jpeg_in_attachment = base64.b64decode(notification_submission_object['attachments'][0]['base64']) - assert b'JFIF' in jpeg_in_attachment - assert testimage_png not in notification_submission + # Assert that the JPEG is readable (didn't get chewed up somewhere) from PIL import Image import io @@ -299,7 +295,10 @@ def test_notification_custom_endpoint_and_jinja2(client, live_server): follow_redirects=True ) assert b'Settings updated' in res.data - + client.get( + url_for("form_delete", uuid="all"), + follow_redirects=True + ) # Add a watch and trigger a HTTP POST test_url = url_for('test_endpoint', _external=True) res = client.post( diff --git a/changedetectionio/update_worker.py b/changedetectionio/update_worker.py index 0667525f..2a7479dd 100644 --- a/changedetectionio/update_worker.py +++ b/changedetectionio/update_worker.py @@ -75,7 +75,7 @@ class update_worker(threading.Thread): n_object.update({ 'watch_url': watch['url'], 'uuid': watch_uuid, - 'screenshot': watch.get_screenshot_as_jpeg() if watch.get('notification_screenshot') else None, + 'screenshot': watch.get_screenshot() if watch.get('notification_screenshot') else None, 'current_snapshot': snapshot_contents.decode('utf-8'), 'diff': diff.render_diff(watch_history[dates[-2]], watch_history[dates[-1]], line_feed_sep=line_feed_sep), 'diff_added': diff.render_diff(watch_history[dates[-2]], watch_history[dates[-1]], include_removed=False, line_feed_sep=line_feed_sep),