From 6ee003776bad40782e7160764a2bd2d64c978ee4 Mon Sep 17 00:00:00 2001 From: SamTV12345 <40429738+samtv12345@users.noreply.github.com> Date: Wed, 5 Aug 2026 22:28:49 +0200 Subject: [PATCH] feat: added podfetch enhanced --- Podfetch/Podfetch.php | 66 +++++++++++++++++++++++++++++++++-- Podfetch/app.json | 16 ++++----- Podfetch/config.blade.php | 18 ++++++++++ Podfetch/livestats.blade.php | 14 ++++++++ Podfetch/podfetch.png | Bin 13524 -> 4822 bytes 5 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 Podfetch/config.blade.php create mode 100644 Podfetch/livestats.blade.php diff --git a/Podfetch/Podfetch.php b/Podfetch/Podfetch.php index a52757d062..459bd928bd 100644 --- a/Podfetch/Podfetch.php +++ b/Podfetch/Podfetch.php @@ -1,7 +1,69 @@ url("/api/v1/info")); + echo $test->status; + } + + public function livestats() + { + $status = "inactive"; + + $res1 = parent::execute($this->url("/api/v1/podcasts")); + $podcasts = json_decode($res1->getBody()); + + $res2 = parent::execute($this->url("/api/v1/sys/info")); + $sysinfo = json_decode($res2->getBody()); + + $data = []; + if ($podcasts && is_array($podcasts)) { + $data["podcast_count"] = count($podcasts); + $status = "active"; + } + if ($sysinfo && isset($sysinfo->podcast_directory)) { + $data["disk_used"] = self::fmt($sysinfo->podcast_directory); + $free = array_sum(array_column($sysinfo->disks ?? [], 'available_space')); + $data["disk_free"] = self::fmt($free); + $status = "active"; + } + + return parent::getLiveStats($status, $data); + } + + private static function fmt($bytes) + { + if ($bytes >= 1099511627776) { + return round($bytes / 1099511627776, 1) . 'T'; + } + if ($bytes >= 1073741824) { + return round($bytes / 1073741824, 1) . 'G'; + } + return round($bytes / 1048576, 1) . 'M'; + } + + public function url($endpoint) + { + $api_url = parent::normaliseurl($this->config->url); + $username = $this->config->username; + $password = $this->config->password; + $rebuild_url = str_replace( + "http://", + "http://" . $username . ":" . $password . "@", + $api_url + ); + $rebuild_url = str_replace( + "https://", + "https://" . $username . ":" . $password . "@", + $rebuild_url + ); + $rebuild_url = rtrim($rebuild_url, "/"); + return $rebuild_url . $endpoint; + } } diff --git a/Podfetch/app.json b/Podfetch/app.json index 91f2514a0a..f6a1bbd9ee 100644 --- a/Podfetch/app.json +++ b/Podfetch/app.json @@ -1,10 +1,10 @@ { - "appid": "433dc2c56e482aa6d8bc5cfae5ac5e4ec3d0f752", - "name": "Podfetch", - "website": "https://podfetch.com/", - "license": "Apache License 2.0", - "description": "Podfetch es un gestor de podcasts autohospedado. Es una aplicación web que permite descargar podcasts y escucharlos en línea. Está escrita en Rust y utiliza React para el frontend. Además, incluye integración con GPodder, por lo que puedes seguir usando tu aplicación de podcasts actual.", - "enhanced": false, - "tile_background": "light", - "icon": "podfetch.png" + "appid": "433dc2c56e482aa6d8bc5cfae5ac5e4ec3d0f752", + "name": "PodFetch", + "website": "https://github.com/SamTV12345/PodFetch", + "license": "GPL-3.0", + "description": "Self-hosted podcast manager with GPodder sync, Audiobookshelf API, transcripts, and Chromecast support.", + "enhanced": true, + "tile_background": "light", + "icon": "PodFetch.png" } diff --git a/Podfetch/config.blade.php b/Podfetch/config.blade.php new file mode 100644 index 0000000000..26b4af285c --- /dev/null +++ b/Podfetch/config.blade.php @@ -0,0 +1,18 @@ +

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

+
+
+ + {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!} +
+
+ + {!! Form::text('config[username]', isset($item) ? $item->getconfig()->username : null, ['placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item']) !!} +
+
+ + {!! Form::input('password', 'config[password]', '', ['placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item']) !!} +
+
+ +
+
diff --git a/Podfetch/livestats.blade.php b/Podfetch/livestats.blade.php new file mode 100644 index 0000000000..01e0bb53dc --- /dev/null +++ b/Podfetch/livestats.blade.php @@ -0,0 +1,14 @@ + diff --git a/Podfetch/podfetch.png b/Podfetch/podfetch.png index f59e9ee118e92ad4bc9692872f7f7146cf45f1b4..d677a25376e40c0945c54e33ee684e5ef2382a13 100644 GIT binary patch literal 4822 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 E3*1Q1p#T5? literal 13524 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

wR_u%Vp696gtrsyXKoU3! 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