From bcadc316bc94bfa00bd969dc48cbe57f45e96f1b Mon Sep 17 00:00:00 2001 From: AnthonyAxenov Date: Sun, 4 Dec 2022 23:19:40 +0800 Subject: [PATCH] =?UTF-8?q?404=20+=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20+=20=D0=B4=D0=BE=D0=BA=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B8=20=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/Controllers/Controller.php | 20 ++++- src/app/Controllers/HomeController.php | 64 ++++++-------- src/app/Controllers/PlaylistController.php | 86 +++++++++++++------ src/app/Core/BasicPlaylist.php | 13 ++- src/app/Core/Bootstrapper.php | 25 +++++- src/app/Core/Playlist.php | 33 ++++++- src/app/Core/PlaylistProcessor.php | 73 ++++++++++++++-- src/app/Core/RedirectedPlaylist.php | 13 ++- .../Exceptions/PlaylistNotFoundException.php | 15 ++++ src/app/Extensions/TwigFunctions.php | 2 +- src/app/helpers.php | 2 +- src/config/app.php | 2 +- src/public/index.php | 2 +- src/views/notfound.twig | 18 ++++ 14 files changed, 285 insertions(+), 83 deletions(-) create mode 100644 src/app/Exceptions/PlaylistNotFoundException.php create mode 100644 src/views/notfound.twig diff --git a/src/app/Controllers/Controller.php b/src/app/Controllers/Controller.php index 3939f8a..cbb6e03 100644 --- a/src/app/Controllers/Controller.php +++ b/src/app/Controllers/Controller.php @@ -1,9 +1,27 @@ status(404)->sendHeaders(); + view('notfound', ['id' => $id]); + } } diff --git a/src/app/Controllers/HomeController.php b/src/app/Controllers/HomeController.php index 0f1edc5..8d67ab3 100644 --- a/src/app/Controllers/HomeController.php +++ b/src/app/Controllers/HomeController.php @@ -1,25 +1,35 @@ ini = new PlaylistProcessor(); } /** - * @return int + * Возвращает размер одной страницы списка плейлистов + * + * @return int Указанный в конфиге размер либо 10, если он выходит за диапазоны от 5 до 100 */ protected function getPageSize(): int { @@ -28,19 +38,25 @@ class HomeController extends Controller } /** + * Отображает главную страницу на указанной странице списка плейлистов + * + * @param int $page + * @return void * @throws Exception */ - public function index(int $page = 1) + public function index(int $page = 1): void { + // если пришёл любой get-параметр, то считаем его как id плейлиста и перебрасываем на страницу о нём if (Flight::request()->query->count() > 0) { $id = Flight::request()->query->keys()[0]; Flight::redirect(base_url($id)); die; } + // иначе формируем и сортируем список при необходимости, рисуем страницу $per_page = $this->getPageSize(); $list = $this->ini->playlists->where('redirect_id', null); - if (config('app.sort_by')) { - $list = $list->sortBy(config('app.sort_by')); + if ($sort_by = config('app.sort_by')) { + $list = $list->sortBy($sort_by); } $list = $list->forPage($page, $per_page); view('list', [ @@ -55,41 +71,13 @@ class HomeController extends Controller } /** + * Отображает страницу FAQ + * + * @return void * @throws Exception */ - public function faq() + public function faq(): void { view('faq'); } - - /** - * @throws Exception - */ - public function details(string $id): void - { - $playlist = $this->ini->playlist($id); - if ($playlist instanceof RedirectedPlaylist) { - Flight::redirect(base_url($playlist->redirect_id . '/info')); - } - view('details', [ - 'id' => $id, - 'playlist' => $playlist->toArray(), - 'info' => $this->ini->parse($id), - ]); - } - - /** - * @throws Exception - */ - public function ajax(string $id): void - { - $playlist = $this->ini->playlist($id); - if ($playlist instanceof RedirectedPlaylist) { - Flight::redirect(base_url($playlist->redirect_id . '/getInfo')); - } - Flight::json([ - 'playlist' => $playlist->toArray(), - 'info' => $this->ini->parse($id), - ]); - } } diff --git a/src/app/Controllers/PlaylistController.php b/src/app/Controllers/PlaylistController.php index 5308cab..e850647 100644 --- a/src/app/Controllers/PlaylistController.php +++ b/src/app/Controllers/PlaylistController.php @@ -1,66 +1,102 @@ ini = new PlaylistProcessor(); } /** + * Отправляет запрос с клиента по прямой ссылке плейлиста + * + * @param $id + * @return void * @throws Exception */ - public function download($id) + public function download($id): void { - $playlist = $this->ini->playlist($id); - if ($playlist instanceof RedirectedPlaylist) { - Flight::redirect(base_url($playlist->redirect_id)); - die; + try { + $playlist = $this->ini->playlist($id); + if ($playlist instanceof RedirectedPlaylist) { + Flight::redirect(base_url($playlist->redirect_id)); + die; + } + Flight::redirect($playlist->pls); + } catch (PlaylistNotFoundException) { + $this->notFound($id); } - header('Location: ' . $playlist->pls); die; } /** + * Отображает страницу описания плейлиста + * + * @param string $id + * @return void * @throws Exception */ public function details(string $id): void { - $playlist = $this->ini->playlist($id); - if ($playlist instanceof RedirectedPlaylist) { - Flight::redirect(base_url($playlist->redirect_id . '/details')); - die; + try { + $playlist = $this->ini->playlist($id); + if ($playlist instanceof RedirectedPlaylist) { + Flight::redirect(base_url($playlist->redirect_id . '/details')); + die; + } + view('details', [ + ...$playlist->toArray(), + ...$this->ini->parse($id), + ]); + } catch (PlaylistNotFoundException) { + $this->notFound($id); } - view('details', [ - ...$playlist->toArray(), - ...$this->ini->parse($id), - ]); } /** + * Возвращает JSON с описанием плейлиста + * + * @param string $id + * @return void * @throws Exception */ public function json(string $id): void { - $playlist = $this->ini->playlist($id); - if ($playlist instanceof RedirectedPlaylist) { - Flight::redirect(base_url($playlist->redirect_id . '/json')); - die; + try { + $playlist = $this->ini->playlist($id); + if ($playlist instanceof RedirectedPlaylist) { + Flight::redirect(base_url($playlist->redirect_id . '/json')); + die; + } + Flight::json([ + ...$playlist->toArray(), + ...$this->ini->parse($id), + ]); + } catch (PlaylistNotFoundException) { + Flight::response()->status(404)->sendHeaders(); + Flight::json(['error' => ['message' => 'Playlist not found']]); } - Flight::json([ - ...$playlist->toArray(), - ...$this->ini->parse($id), - ]); } } diff --git a/src/app/Core/BasicPlaylist.php b/src/app/Core/BasicPlaylist.php index ecd30c3..8a958fe 100644 --- a/src/app/Core/BasicPlaylist.php +++ b/src/app/Core/BasicPlaylist.php @@ -1,15 +1,26 @@ id); diff --git a/src/app/Core/Bootstrapper.php b/src/app/Core/Bootstrapper.php index 00b0176..0cb8cff 100644 --- a/src/app/Core/Bootstrapper.php +++ b/src/app/Core/Bootstrapper.php @@ -1,6 +1,6 @@ loadEnv(root_path() . '/.env'); } + /** + * Загружает конфигурацию приложения в контейнер + * + * @return void + */ public static function bootSettings(): void { $settings = Arr::dot(require_once config_path('app.php')); @@ -31,6 +44,11 @@ final class Bootstrapper Flight::set('config', $settings); } + /** + * Загружает шаблонизатор и его расщирения + * + * @return void + */ public static function bootTwig(): void { $filesystemLoader = new FilesystemLoader(config('views.path')); @@ -47,6 +65,11 @@ final class Bootstrapper ); } + /** + * Загружает маршруты + * + * @return void + */ public static function bootRoutes(): void { Flight::route( diff --git a/src/app/Core/Playlist.php b/src/app/Core/Playlist.php index 0f2948a..33534cc 100644 --- a/src/app/Core/Playlist.php +++ b/src/app/Core/Playlist.php @@ -1,27 +1,51 @@ url = base_url($id); @@ -31,6 +55,9 @@ class Playlist extends BasicPlaylist $this->src = empty($params['src']) ? null : $params['src']; } + /** + * @inheritDoc + */ public function toArray(): array { return [ diff --git a/src/app/Core/PlaylistProcessor.php b/src/app/Core/PlaylistProcessor.php index 954845b..1ddac61 100644 --- a/src/app/Core/PlaylistProcessor.php +++ b/src/app/Core/PlaylistProcessor.php @@ -1,17 +1,30 @@ playlists->keys()->toArray()); + return $this->playlists->keys()->contains($id); } + /** + * Возвращает из коллекции указанный плейлист, если он существует + * + * @param string $id + * @return Playlist|RedirectedPlaylist + * @throws PlaylistNotFoundException + */ public function playlist(string $id): Playlist|RedirectedPlaylist { - !$this->hasId($id) && throw new \InvalidArgumentException("Плейлист с ID=$id не найден"); + !$this->hasId($id) && throw new PlaylistNotFoundException($id); return $this->playlists[$id]; } + /** + * Проверяет доступность плейлиста на третьей стороне + * + * @param string $id + * @return bool + * @throws PlaylistNotFoundException + */ public function check(string $id): bool { $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, $this->playlist($id)['pls']); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curl, CURLOPT_TIMEOUT, 5); - curl_setopt($curl, CURLOPT_HEADER, 0); - curl_setopt($curl, CURLOPT_NOBODY, 1); + curl_setopt_array($curl, [ + CURLOPT_URL => $this->playlist($id)->pls, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 5, + CURLOPT_HEADER => false, + CURLOPT_NOBODY => true, + ]); curl_exec($curl); $code = curl_getinfo($curl, CURLINFO_RESPONSE_CODE); curl_close($curl); return $code < 400; } + /** + * Получает содержимое плейлиста с третьей стороны + * + * @param string $id + * @return array + * @throws PlaylistNotFoundException + */ protected function fetch(string $id): array { $curl = curl_init(); @@ -72,6 +114,12 @@ final class PlaylistProcessor ]; } + /** + * Возвращает статус проверки плейлиста по коду ошибки curl + * + * @param int $curl_err_code + * @return string + */ protected function guessStatus(int $curl_err_code): string { return match ($curl_err_code) { @@ -82,6 +130,13 @@ final class PlaylistProcessor }; } + /** + * Парсит полученный от третьей стороны плейлист + * + * @param string $id + * @return array Информация о составе плейлиста + * @throws PlaylistNotFoundException + */ public function parse(string $id): array { $fetched = $this->fetch($id); @@ -110,6 +165,8 @@ final class PlaylistProcessor } /** + * Возвращает дату последнего обновления списка плейлистов + * * @return string */ public function updatedAt(): string diff --git a/src/app/Core/RedirectedPlaylist.php b/src/app/Core/RedirectedPlaylist.php index d5d4b65..6c55947 100644 --- a/src/app/Core/RedirectedPlaylist.php +++ b/src/app/Core/RedirectedPlaylist.php @@ -1,13 +1,19 @@ [ diff --git a/src/public/index.php b/src/public/index.php index e83a9a2..046f1ce 100644 --- a/src/public/index.php +++ b/src/public/index.php @@ -1,6 +1,6 @@ Плейлист не найден +{% endblock %} + +{% block content %} +
+
+

+ Плейлист {{ id }} не найден +

+ + Перейти к списку + +
+
+{% endblock %}