From 6886f2fb9a2e944148a835ec044886664b57b7fc Mon Sep 17 00:00:00 2001 From: somyje Date: Thu, 2 Apr 2026 04:47:55 +0300 Subject: [PATCH] Add Google Keep plugin --- install/requirements-dev.txt | 2 + install/requirements.txt | 2 + src/plugins/keep/icon.png | Bin 0 -> 13255 bytes src/plugins/keep/keep.py | 81 ++++++++++++++++++++++++++++ src/plugins/keep/plugin-info.json | 5 ++ src/plugins/keep/render/keep.css | 39 ++++++++++++++ src/plugins/keep/render/keep.html | 13 +++++ src/plugins/keep/settings.html | 14 +++++ src/templates/apikeys.html | 84 ++++++++++++++++-------------- 9 files changed, 200 insertions(+), 40 deletions(-) create mode 100644 src/plugins/keep/icon.png create mode 100644 src/plugins/keep/keep.py create mode 100644 src/plugins/keep/plugin-info.json create mode 100644 src/plugins/keep/render/keep.css create mode 100644 src/plugins/keep/render/keep.html create mode 100644 src/plugins/keep/settings.html diff --git a/install/requirements-dev.txt b/install/requirements-dev.txt index c66cf1989..abbbbde88 100644 --- a/install/requirements-dev.txt +++ b/install/requirements-dev.txt @@ -15,3 +15,5 @@ feedparser==6.0.11 waitress==3.0.2 astral>=3.1 pytest==8.4.2 +gkeepapi==0.17.1 +gpsoauth==2.0.0 diff --git a/install/requirements.txt b/install/requirements.txt index 66c636ab4..52f12288d 100644 --- a/install/requirements.txt +++ b/install/requirements.txt @@ -16,3 +16,5 @@ cysystemd==2.0.1 waitress==3.0.2 feedparser==6.0.11 astral>=3.1 +gkeepapi==0.17.1 +gpsoauth==2.0.0 diff --git a/src/plugins/keep/icon.png b/src/plugins/keep/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..09d391029dbb60e634b33a723d8d69c7b1aaac90 GIT binary patch literal 13255 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 KC-OAyBmW0`jW~q> literal 0 HcmV?d00001 diff --git a/src/plugins/keep/keep.py b/src/plugins/keep/keep.py new file mode 100644 index 000000000..102945800 --- /dev/null +++ b/src/plugins/keep/keep.py @@ -0,0 +1,81 @@ +from gkeepapi.node import NodeLabels +from plugins.base_plugin.base_plugin import BasePlugin +from PIL import Image +from datetime import datetime, timezone +import logging +import pytz +import gpsoauth +import gkeepapi + +logger = logging.getLogger(__name__) +class Keep(BasePlugin): + def generate_settings_template(self): + template_params = super().generate_settings_template() + template_params['api_key'] = { + "required": True, + "service": "Google", + "expected_key": "G_EMAIL, G_ANDROID_ID, G_MASTER_TOKEN", + } + template_params['style_settings'] = True + return template_params + + def generate_image(self, settings, device_config): + note_id = settings.get('id') + if not note_id: + raise RuntimeError("Note id is required.") + + dimensions = device_config.get_resolution() + if device_config.get_config("orientation") == "vertical": + dimensions = dimensions[::-1] + + email = device_config.load_env_key("G_EMAIL") + password = device_config.load_env_key("G_PASSWORD") + android_id = device_config.load_env_key("G_ANDROID_ID") + + ### Get your master token via one of the two methods below + + ### Get token from cookie oauth + ### https://github.com/simon-weber/gpsoauth?tab=readme-ov-file#alternative-flow + # token_t = '...' + # master_response = gpsoauth.exchange_token(email, token_t, android_id) + # master_token = master_response['Token'] # if there's no token check the response for more details + # + # auth_response = gpsoauth.perform_oauth( + # email, master_token, android_id, + # service='sj', app='com.google.android.music', + # client_sig='38918a453d07199354f8b19af05ec6562ced5788') + # token = auth_response['Auth'] + # logger.info(f"Token data: {master_token}") + + ### Get token with urllib (not working with latest version of urllib as per https://github.com/urllib3/urllib3/issues/2101) + ### https://github.com/simon-weber/gpsoauth?tab=readme-ov-file#gpsoauth + # master_response = gpsoauth.perform_master_login(email, password, android_id) + # logger.info(f"Token data: {master_response}") + # master_token = master_response['Token'] + # auth_response = gpsoauth.perform_oauth( + # email, master_token, android_id, + # service='sj', app='com.google.android.music', + # client_sig='38918a453d07199354f8b19af05ec6562ced5788') + # token = auth_response['Auth'] + # logger.info(f"Token data: {token}") + + master_token = device_config.load_env_key("G_MASTER_TOKEN") + keep = gkeepapi.Keep() + success = keep.authenticate(email, master_token) + keep.sync() + + gnote = keep.get(note_id) + if not gnote: + raise RuntimeError("Note not found.") + + gnote_date_str = gnote.timestamps.edited.astimezone().strftime("%Y-%m-%d %H:%M") + + template_params = { + "title": gnote.title, + "note_item": gnote.text, + "date": "Edited: " + gnote_date_str, + "plugin_settings": settings + } + + image = self.render_image(dimensions, "keep.html", "keep.css", template_params) + return image diff --git a/src/plugins/keep/plugin-info.json b/src/plugins/keep/plugin-info.json new file mode 100644 index 000000000..be21dcd91 --- /dev/null +++ b/src/plugins/keep/plugin-info.json @@ -0,0 +1,5 @@ +{ + "display_name": "Keep", + "id": "keep", + "class": "Keep" +} diff --git a/src/plugins/keep/render/keep.css b/src/plugins/keep/render/keep.css new file mode 100644 index 000000000..97f9cb0a1 --- /dev/null +++ b/src/plugins/keep/render/keep.css @@ -0,0 +1,39 @@ +:root { + --used-height: calc(min(20dvw, 20dvh) + 10px); + --available-height: round(down, calc(100dvh - var(--used-height)), min(5dvw, 5dvh)); +} +.keep-container { + display: flex; + align-items: center; + justify-content: center; + font-family: "Jost"; + height: 100%; + width: 100%; +} +.keep-wrapper { + width: 90%; + text-align: center; + margin: 0; + padding: 0; +} +.title { + font-size: min(11dvw, 11dvh); + font-weight: bold; + letter-spacing: .3px; + line-height: 1; +} +.subtitle { + margin: min(2dvw, 2dvh); + font-size: min(5dvw, 5dvh); + line-height: 1; +} +.note_item { + display: -webkit-box; + -webkit-line-clamp: calc(var(--available-height) / min(5dvw, 5dvh)); + -webkit-box-orient: vertical; + line-height: 1; + font-size: min(5dvw, 5dvh); + overflow: hidden; + white-space: pre-wrap; + text-align: left; +} diff --git a/src/plugins/keep/render/keep.html b/src/plugins/keep/render/keep.html new file mode 100644 index 000000000..9f5b79843 --- /dev/null +++ b/src/plugins/keep/render/keep.html @@ -0,0 +1,13 @@ +{% extends "plugin.html" %} + +{% block content %} + +
+
+

{{title}}

+

{{date}}

+

{{note_item}}

+
+
+ +{% endblock %} diff --git a/src/plugins/keep/settings.html b/src/plugins/keep/settings.html new file mode 100644 index 000000000..fe5883af3 --- /dev/null +++ b/src/plugins/keep/settings.html @@ -0,0 +1,14 @@ +
+
+ + +
+
+ + diff --git a/src/templates/apikeys.html b/src/templates/apikeys.html index d0c6852e1..d4eac8585 100644 --- a/src/templates/apikeys.html +++ b/src/templates/apikeys.html @@ -6,7 +6,7 @@ API Keys