From 84c025b9a6ce9f0ee9026706a0adf77f6da2296f Mon Sep 17 00:00:00 2001 From: Lucas Araujo Date: Tue, 9 Sep 2025 22:13:07 +0200 Subject: [PATCH 1/3] feat: add MySpeed app integration with live stats and config - Implement MySpeed app with live statistics display for download/upload speeds - Add configuration page with URL override option - Include app icon and metadata in app.json --- MySpeed/MySpeed.php | 42 ++++++++++++++++++++++++++++++++++++ MySpeed/app.json | 10 +++++++++ MySpeed/config.blade.php | 11 ++++++++++ MySpeed/livestats.blade.php | 10 +++++++++ MySpeed/myspeed.png | Bin 0 -> 3857 bytes 5 files changed, 73 insertions(+) create mode 100644 MySpeed/MySpeed.php create mode 100644 MySpeed/app.json create mode 100644 MySpeed/config.blade.php create mode 100644 MySpeed/livestats.blade.php create mode 100644 MySpeed/myspeed.png diff --git a/MySpeed/MySpeed.php b/MySpeed/MySpeed.php new file mode 100644 index 0000000000..ed945f0902 --- /dev/null +++ b/MySpeed/MySpeed.php @@ -0,0 +1,42 @@ +url('api/info/version')); + echo $test->status; + } + + public function livestats() + { + $status = 'inactive'; + $res = parent::execute($this->url('api/speedtests/statistics')); + $details = json_decode($res->getBody()); + + $data = []; + + if ($details) { + $status = 'active'; + $data = [ + 'avg_down' => floor($details->download->avg), + 'avg_up' => floor($details->upload->avg) + + ]; + } + + return parent::getLiveStats($status, $data); + } + + public function url($endpoint) + { + $api_url = parent::normaliseurl($this->config->url) . $endpoint; + return $api_url; + } +} diff --git a/MySpeed/app.json b/MySpeed/app.json new file mode 100644 index 0000000000..6738e1fac1 --- /dev/null +++ b/MySpeed/app.json @@ -0,0 +1,10 @@ +{ + "appid": "ac2f9c8aee6a960204b0fb387d33185679217db2", + "name": "MySpeed", + "website": "https://myspeed.dev", + "license": "MIT License", + "description": "MySpeed is a speed test analysis software that records your internet speed for up to 30 days.", + "enhanced": true, + "tile_background": "dark", + "icon": "myspeed.png" +} \ No newline at end of file diff --git a/MySpeed/config.blade.php b/MySpeed/config.blade.php new file mode 100644 index 0000000000..4505127af7 --- /dev/null +++ b/MySpeed/config.blade.php @@ -0,0 +1,11 @@ +

{{ __('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')) !!} +
+
+ +
+
+ diff --git a/MySpeed/livestats.blade.php b/MySpeed/livestats.blade.php new file mode 100644 index 0000000000..2717f52636 --- /dev/null +++ b/MySpeed/livestats.blade.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/MySpeed/myspeed.png b/MySpeed/myspeed.png new file mode 100644 index 0000000000000000000000000000000000000000..076418d546409400fac96da7bbe696fc04550e27 GIT binary patch literal 3857 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 O62L&$M5kWMHSRyrKM{Zc literal 0 HcmV?d00001 From 5204ada377a043daf174e0e6f2bc6ffa1b68d974 Mon Sep 17 00:00:00 2001 From: Lucas Araujo Date: Wed, 10 Sep 2025 20:22:28 +0200 Subject: [PATCH 2/3] style: format constructor with consistent spacing --- MySpeed/MySpeed.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MySpeed/MySpeed.php b/MySpeed/MySpeed.php index ed945f0902..7a01056d6d 100644 --- a/MySpeed/MySpeed.php +++ b/MySpeed/MySpeed.php @@ -6,7 +6,9 @@ class MySpeed extends \App\SupportedApps implements \App\EnhancedApps { public $config; - public function __construct() {} + public function __construct() { + + } public function test() { From 4818944c8925bff1ab47fac43a5cb31e86f26366 Mon Sep 17 00:00:00 2001 From: Lucas Araujo Date: Sat, 13 Sep 2025 17:32:41 +0200 Subject: [PATCH 3/3] refactor: remove empty line in MySpeed constructor --- MySpeed/MySpeed.php | 1 - 1 file changed, 1 deletion(-) diff --git a/MySpeed/MySpeed.php b/MySpeed/MySpeed.php index 7a01056d6d..6b55fb512a 100644 --- a/MySpeed/MySpeed.php +++ b/MySpeed/MySpeed.php @@ -7,7 +7,6 @@ class MySpeed extends \App\SupportedApps implements \App\EnhancedApps public $config; public function __construct() { - } public function test()