From 9095caae73b5e721f8d47ecad4b80a9b267e3f6f Mon Sep 17 00:00:00 2001 From: lalka2018 <99399973+lalka2016@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:29:25 +0300 Subject: [PATCH] Implement playlists listens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - У плейлистов теперь есть прослушивания в общем. - Прослушивания у большого плеера теперь засчитываются, если трек был дослушан до конца - В объекте плейлистов теперь возвращается listens и cover_url - Получение плееров через /audios/context переписано, повторяющийся код удалён, правда сильно количество строк сократить не получилось - Теперь цвета плеера темнее, а иконка проигрывания изменена - Теперь, если очередь из треков кончилась, то плеер перенаправляет вас в начало очереди. --- Web/Models/Entities/Audio.php | 8 +- Web/Models/Entities/Playlist.php | 26 ++ Web/Presenters/AudioPresenter.php | 25 +- .../templates/Audio/EditPlaylist.xml | 4 +- .../templates/Audio/NewPlaylist.xml | 4 +- Web/Presenters/templates/Audio/Playlist.xml | 7 +- Web/static/css/audios.css | 7 +- Web/static/img/audio.png | Bin 364 -> 560 bytes Web/static/js/al_music.js | 313 ++++++++---------- Web/static/js/al_playlists.js | 113 +++++++ locales/en.strings | 7 + locales/ru.strings | 7 + 12 files changed, 329 insertions(+), 192 deletions(-) create mode 100644 Web/static/js/al_playlists.js diff --git a/Web/Models/Entities/Audio.php b/Web/Models/Entities/Audio.php index 84e263aa..4fab06be 100644 --- a/Web/Models/Entities/Audio.php +++ b/Web/Models/Entities/Audio.php @@ -303,7 +303,7 @@ class Audio extends Media return true; } - function listen($entity): bool + function listen($entity, Playlist $playlist = NULL): bool { $entityId = $entity->getId(); if($entity instanceof Club) @@ -320,11 +320,17 @@ class Audio extends Media "entity" => $entityId, "audio" => $this->getId(), "time" => time(), + "playlist" => $playlist ? $playlist->getId() : NULL, ]); if($entity instanceof User) { $this->stateChanges("listens", ($this->getListens() + 1)); $this->save(); + + if($playlist) { + $playlist->incrementListens(); + $playlist->save(); + } } return true; diff --git a/Web/Models/Entities/Playlist.php b/Web/Models/Entities/Playlist.php index 685f4cc5..89b4155b 100644 --- a/Web/Models/Entities/Playlist.php +++ b/Web/Models/Entities/Playlist.php @@ -137,6 +137,11 @@ class Playlist extends MediaCollection return htmlspecialchars($this->getRecord()->description, ENT_DISALLOWED | ENT_XHTML); } + function getListens() + { + return $this->getRecord()->listens; + } + function toVkApiStruct(?User $user = NULL): object { $oid = $this->getOwner()->getId(); @@ -155,6 +160,8 @@ class Playlist extends MediaCollection "accessible" => $this->canBeViewedBy($user), "editable" => $this->canBeModifiedBy($user), "bookmarked" => $this->isBookmarkedBy($user), + "listens" => $this->getListens(), + "cover_url" => $this->getCoverURL(), ]; } @@ -227,4 +234,23 @@ class Playlist extends MediaCollection { return "/playlist" . $this->getOwner()->getRealId() . "_" . $this->getId(); } + + function incrementListens() + { + $this->stateChanges("listens", ($this->getListens() + 1)); + } + + function getMetaDescription(): string + { + $length = $this->getLengthInMinutes(); + + $props = []; + $props[] = tr("audios_count", $this->size()); + $props[] = "" . tr("listens_count", $this->getListens()) . ""; + if($length > 0) $props[] = tr("minutes_count", $length); + $props[] = tr("created_playlist") . " " . $this->getPublicationTime(); + # if($this->getEditTime()) $props[] = tr("updated_playlist") . " " . $this->getEditTime(); + + return implode(" • ", $props); + } } \ No newline at end of file diff --git a/Web/Presenters/AudioPresenter.php b/Web/Presenters/AudioPresenter.php index 9cdbc095..2b5786c1 100644 --- a/Web/Presenters/AudioPresenter.php +++ b/Web/Presenters/AudioPresenter.php @@ -249,11 +249,26 @@ final class AudioPresenter extends OpenVKPresenter $audio = $this->audios->get($id); if ($audio && !$audio->isDeleted() && !$audio->isWithdrawn()) { - $listen = $audio->listen($this->user->identity); - $this->returnJson(["success" => $listen]); + if(!empty($this->postParam("playlist"))) { + $playlist = (new Audios)->getPlaylist((int)$this->postParam("playlist")); + + if(!$playlist || $playlist->isDeleted() || !$playlist->canBeViewedBy($this->user->identity) || !$playlist->hasAudio($audio)) + $playlist = NULL; + } + + $listen = $audio->listen($this->user->identity, $playlist); + + $returnArr = ["success" => $listen]; + + if($playlist) + $returnArr["new_playlists_listens"] = $playlist->getListens(); + + $this->returnJson($returnArr); } $this->returnJson(["success" => false]); + } else { + $this->redirect("/"); } } @@ -338,7 +353,7 @@ final class AudioPresenter extends OpenVKPresenter if ($_SERVER["REQUEST_METHOD"] !== "POST") { header("HTTP/1.1 405 Method Not Allowed"); - exit(","); + $this->redirect("/"); } $playlist = $this->audios->getPlaylist($id); @@ -471,7 +486,7 @@ final class AudioPresenter extends OpenVKPresenter if ($_SERVER["REQUEST_METHOD"] !== "POST") { header("HTTP/1.1 405 Method Not Allowed"); - exit(":)"); + $this->redirect("/"); } $audio = $this->audios->get($audio_id); @@ -582,7 +597,7 @@ final class AudioPresenter extends OpenVKPresenter { if ($_SERVER["REQUEST_METHOD"] !== "POST") { header("HTTP/1.1 405 Method Not Allowed"); - exit(""); + $this->redirect("/"); } $ctx_type = $this->postParam("context"); diff --git a/Web/Presenters/templates/Audio/EditPlaylist.xml b/Web/Presenters/templates/Audio/EditPlaylist.xml index de55d8f6..a7f1c751 100644 --- a/Web/Presenters/templates/Audio/EditPlaylist.xml +++ b/Web/Presenters/templates/Audio/EditPlaylist.xml @@ -53,7 +53,7 @@ -
+