From 50df2d80d9c7a8a82c22815e78c26931ff5c1064 Mon Sep 17 00:00:00 2001 From: Lucas Araujo Date: Mon, 8 Sep 2025 20:29:29 +0200 Subject: [PATCH 1/3] feat: add Readeck integration with live stats and config Add support for Readeck application including live stats display for bookmarks count and configuration options for API key and URL override --- Readeck/Readeck.php | 54 ++++++++++++++++++++++++++++++++++++ Readeck/app.json | 10 +++++++ Readeck/config.blade.php | 15 ++++++++++ Readeck/livestats.blade.php | 6 ++++ Readeck/readeck.png | Bin 0 -> 4044 bytes 5 files changed, 85 insertions(+) create mode 100644 Readeck/Readeck.php create mode 100644 Readeck/app.json create mode 100644 Readeck/config.blade.php create mode 100644 Readeck/livestats.blade.php create mode 100644 Readeck/readeck.png diff --git a/Readeck/Readeck.php b/Readeck/Readeck.php new file mode 100644 index 0000000000..f7d423c36d --- /dev/null +++ b/Readeck/Readeck.php @@ -0,0 +1,54 @@ +url("api/contacts")); + echo $test->status; + } + + public function livestats() + { + $status = 'inactive'; + $res = parent::execute( + $this->url('api/bookmarks?is_archived=false'), + $this->attrs() + ); + + $details = json_decode($res->getBody()); + + $data = []; + + if ($details) { + $status = 'active'; + $data["bookmarks_count"] = count($details); + } + + return parent::getLiveStats($status, $data); + } + + public function url($endpoint) + { + $api_url = parent::normaliseurl($this->config->url) . $endpoint; + return $api_url; + } + + public function attrs() + { + $apikey = $this->config->apikey; + $attrs = [ + "headers" => [ + "content-type" => "application/json", + "Authorization" => "Bearer " . $apikey, + ], + ]; + return $attrs; + } +} diff --git a/Readeck/app.json b/Readeck/app.json new file mode 100644 index 0000000000..390c1b09ef --- /dev/null +++ b/Readeck/app.json @@ -0,0 +1,10 @@ +{ + "appid": "9ebfa3a7bc09302c2d7c55713d121bf073c9cc63", + "name": "Readeck", + "website": "https://readeck.org/", + "license": "GNU Affero General Public License v3.0", + "description": "Readeck is a simple web application that lets you save the precious readable content of web pages you like and want to keep forever.\r\nSee it as a bookmark manager and a read later tool.", + "enhanced": true, + "tile_background": "dark", + "icon": "readeck.png" +} \ No newline at end of file diff --git a/Readeck/config.blade.php b/Readeck/config.blade.php new file mode 100644 index 0000000000..a5710954d2 --- /dev/null +++ b/Readeck/config.blade.php @@ -0,0 +1,15 @@ +

{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')

+
+
+ + {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!} +
+
+ + {!! Form::text('config[apikey]', null, array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!} +
+
+ +
+
+ diff --git a/Readeck/livestats.blade.php b/Readeck/livestats.blade.php new file mode 100644 index 0000000000..8fc7bb15c9 --- /dev/null +++ b/Readeck/livestats.blade.php @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/Readeck/readeck.png b/Readeck/readeck.png new file mode 100644 index 0000000000000000000000000000000000000000..ee8655faf409c4f9f7234eec0b4fea08d78afc51 GIT binary patch literal 4044 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 iG{$|6sE0glI)Oe9NE? literal 0 HcmV?d00001 From 28bdb5b7a522b306623a90dfb91d81415aff0030 Mon Sep 17 00:00:00 2001 From: Lucas Araujo Date: Wed, 10 Sep 2025 20:19:31 +0200 Subject: [PATCH 2/3] style: fix constructor formatting in Readeck class --- Readeck/Readeck.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Readeck/Readeck.php b/Readeck/Readeck.php index f7d423c36d..5ec772158b 100644 --- a/Readeck/Readeck.php +++ b/Readeck/Readeck.php @@ -6,7 +6,9 @@ class Readeck extends \App\SupportedApps implements \App\EnhancedApps { public $config; - public function __construct() {} + public function __construct() { + + } public function test() { From c8de8d72b6c39d0f839fd64a37ce944e5244938e Mon Sep 17 00:00:00 2001 From: Lucas Araujo Date: Sat, 13 Sep 2025 17:24:43 +0200 Subject: [PATCH 3/3] refactor: remove empty constructor from Readeck class --- Readeck/Readeck.php | 1 - 1 file changed, 1 deletion(-) diff --git a/Readeck/Readeck.php b/Readeck/Readeck.php index 5ec772158b..53d4aef825 100644 --- a/Readeck/Readeck.php +++ b/Readeck/Readeck.php @@ -7,7 +7,6 @@ class Readeck extends \App\SupportedApps implements \App\EnhancedApps public $config; public function __construct() { - } public function test()