From 5cd52c22f0c8531f56b039e8d67c71202ccef2cc Mon Sep 17 00:00:00 2001 From: lalka2018 <99399973+lalka2016@users.noreply.github.com> Date: Thu, 2 Nov 2023 20:56:02 +0300 Subject: [PATCH] ? MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Переделан метод в классе user для получения друзей с проигрываемыми песнями. Теперь среди них могут появляться и группы (хз стоит ли оставлять это или нет). Так же больше не показываются удалённые пользователи - Трек у плеера теперь двигается немного плавнее. Ещё теперь нету смешных багов с подсказкой времени, когда можно было увести её за экран или промотать дальше трека. Переключить повторение трека теперь можно нажатием кнопки R. - Длинное название трека больше не сносит время - Наверное, теперь аудиозаписи нормально отображаются в темах midnight и modern - Аудиозаписи больше не крашаются, если пользователь неавторизован. - Немного переделан миниплеер. - В миниплеере теперь громкость берётся из локалсторейджа. - Улучшено редактирование аудиозаписей. Теперь данные в дата атрибуты нормально сохраняются, а так же слова песни и метка "explicit" меняются - Удалён css, оставшийся ещё от public technical preview 1, а так же путь /audios{num} - При наведении на трек теперь пропадает время, и на его месте появляются кнопки - Стандартная аватарка в midnight теперь инвертируется - В админке в редактировании аудио теперь показывается дата редактирования, дата создания, длина и оригинальный файл аудио. Так же на странице редактирования больше нет вылетов, если вы задали несуществующий аккаунт --- VKAPI/Handlers/Audio.php | 42 ++----- Web/Models/Entities/Audio.php | 14 +-- Web/Models/Entities/Club.php | 19 +-- Web/Models/Entities/Traits/TAudioStatuses.php | 1 + Web/Models/Entities/User.php | 41 ++++--- Web/Presenters/AdminPresenter.php | 6 + Web/Presenters/AudioPresenter.php | 8 +- Web/Presenters/WallPresenter.php | 2 +- Web/Presenters/templates/Admin/EditMusic.xml | 18 ++- Web/Presenters/templates/Audio/bigplayer.xml | 10 +- Web/Presenters/templates/Audio/player.xml | 85 +++++++------- Web/Presenters/templates/Audio/tabs.xml | 13 +- Web/routes.yml | 2 - Web/static/css/audios.css | 111 ++++++++---------- Web/static/css/main.css | 2 +- Web/static/img/audios_controls.png | Bin 3719 -> 3706 bytes Web/static/img/play_buttons.gif | Bin 103 -> 103 bytes Web/static/js/al_music.js | 76 +++++++----- install/sqls/gamma-00000-disco.sql | 3 +- locales/en.strings | 2 + locales/ru.strings | 2 + themepacks/midnight/stylesheet.css | 91 +++++++++++++- themepacks/openvk_modern/stylesheet.css | 47 ++++++-- 23 files changed, 363 insertions(+), 232 deletions(-) diff --git a/VKAPI/Handlers/Audio.php b/VKAPI/Handlers/Audio.php index 9670a7ff..3ffb0be4 100644 --- a/VKAPI/Handlers/Audio.php +++ b/VKAPI/Handlers/Audio.php @@ -359,7 +359,7 @@ final class Audio extends VKAPIRequestHandler $this->fail(201, "Insufficient permissions to listen this audio"); $group = NULL; - if(!is_null($group)) { + if(!is_null($gid)) { $group = (new Clubs)->get($gid); if(!$group) $this->fail(0404, "Not Found"); @@ -396,7 +396,7 @@ final class Audio extends VKAPIRequestHandler $this->fail(203,"Insufficient rights to this group"); $ids[] = $id; - $this->beacon($song->getId(), $id * -1); + $this->beacon($song ? $song->getId() : 0, $id * -1); } return $ids; @@ -409,40 +409,14 @@ final class Audio extends VKAPIRequestHandler if(!in_array($filter, ["all", "friends", "groups"])) $this->fail(8, "Invalid filter $filter"); - $dbContext = DatabaseConnection::i()->getContext(); - $entityIds = []; - $query = $dbContext->table("subscriptions")->select("model, target") - ->where("follower", $this->getUser()->getId()); - - if($filter != "all") - $query = $query->where("model = ?", "openvk\\Web\\Models\\Entities\\" . ($filter == "groups" ? "Club" : "User")); - - foreach($query as $_rel) { - $id = $_rel->target; - if($_rel->model === "openvk\\Web\\Models\\Entities\\Club") - $id *= -1; - - $entityIds[] = $id; - } - - $audioIds = []; - $threshold = $active === 0 ? 3600 : 120; - foreach($entityIds as $ent) { - $lastListen = $dbContext->table("audio_listens")->where("entity", $ent) - ->where("time >= ?", time() - $threshold)->fetch(); - if(!$lastListen) - continue; - - $audio = (new Audios)->get($lastListen->audio); - $audioIds[$ent] = $this->toSafeAudioStruct($audio, $hash); - } - + $broadcastList = $this->getUser()->getBroadcastList($filter); $items = []; - foreach($audioIds as $ent => $audio) { - $entity = ($ent < 0 ? (new Groups($this->getUser())) : (new Users($this->getUser()))) - ->get((string) abs($ent)); + foreach($broadcastList as $res) { + $struct = $res->toVkApiStruct(); + $status = $res->getCurrentAudioStatus(); - $entity->status_audio = $audio; + $struct->status_audio = $status ? $this->toSafeAudioStruct($status) : NULL; + $items[] = $struct; } return (object) [ diff --git a/Web/Models/Entities/Audio.php b/Web/Models/Entities/Audio.php index 0fe110e3..05022b8c 100644 --- a/Web/Models/Entities/Audio.php +++ b/Web/Models/Entities/Audio.php @@ -305,19 +305,15 @@ class Audio extends Media function listen($entity, Playlist $playlist = NULL): bool { - $entityId = $entity->getId(); - if($entity instanceof Club) - $entityId *= -1; - $listensTable = DatabaseConnection::i()->getContext()->table("audio_listens"); $lastListen = $listensTable->where([ - "entity" => $entityId, + "entity" => $entity->getRealId(), "audio" => $this->getId(), ])->order("index DESC")->fetch(); if(!$lastListen || (time() - $lastListen->time >= $this->getLength())) { $listensTable->insert([ - "entity" => $entityId, + "entity" => $entity->getRealId(), "audio" => $this->getId(), "time" => time(), "playlist" => $playlist ? $playlist->getId() : NULL, @@ -331,11 +327,11 @@ class Audio extends Media $playlist->incrementListens(); $playlist->save(); } - - $entity->setLast_played_track($this->getId()); - $entity->save(); } + $entity->setLast_played_track($this->getId()); + $entity->save(); + return true; } diff --git a/Web/Models/Entities/Club.php b/Web/Models/Entities/Club.php index 126c5127..b8b8838a 100644 --- a/Web/Models/Entities/Club.php +++ b/Web/Models/Entities/Club.php @@ -389,34 +389,39 @@ class Club extends RowModel return $this->isEveryoneCanUploadAudios() || $this->canBeModifiedBy($user); } + + function getAudiosCollectionSize() + { + return (new \openvk\Web\Models\Repositories\Audios)->getClubCollectionSize($this); + } function toVkApiStruct(?User $user = NULL): object { - $res = []; + $res = (object)[]; $res->id = $this->getId(); $res->name = $this->getName(); $res->screen_name = $this->getShortCode(); $res->is_closed = 0; $res->deactivated = NULL; - $res->is_admin = $this->canBeModifiedBy($user); + $res->is_admin = $user && $this->canBeModifiedBy($user); - if($this->canBeModifiedBy($user)) { + if($user && $this->canBeModifiedBy($user)) { $res->admin_level = 3; } - $res->is_member = $this->getSubscriptionStatus($user) ? 1 : 0; + $res->is_member = $user && $this->getSubscriptionStatus($user) ? 1 : 0; $res->type = "group"; $res->photo_50 = $this->getAvatarUrl("miniscule"); $res->photo_100 = $this->getAvatarUrl("tiny"); $res->photo_200 = $this->getAvatarUrl("normal"); - $res->can_create_topic = $this->canBeModifiedBy($user) ? 1 : ($this->isEveryoneCanCreateTopics() ? 1 : 0); + $res->can_create_topic = $user && $this->canBeModifiedBy($user) ? 1 : ($this->isEveryoneCanCreateTopics() ? 1 : 0); - $res->can_post = $this->canBeModifiedBy($user) ? 1 : ($this->canPost() ? 1 : 0); + $res->can_post = $user && $this->canBeModifiedBy($user) ? 1 : ($this->canPost() ? 1 : 0); - return (object) $res; + return $res; } use Traits\TBackDrops; diff --git a/Web/Models/Entities/Traits/TAudioStatuses.php b/Web/Models/Entities/Traits/TAudioStatuses.php index d49c4b29..0d687b68 100644 --- a/Web/Models/Entities/Traits/TAudioStatuses.php +++ b/Web/Models/Entities/Traits/TAudioStatuses.php @@ -7,6 +7,7 @@ trait TAudioStatuses { function isBroadcastEnabled(): bool { + if($this->getRealId() < 0) return true; return (bool) $this->getRecord()->audio_broadcast_enabled; } diff --git a/Web/Models/Entities/User.php b/Web/Models/Entities/User.php index ac903404..f669b08f 100644 --- a/Web/Models/Entities/User.php +++ b/Web/Models/Entities/User.php @@ -1250,25 +1250,38 @@ class User extends RowModel return $res; } - function getFriendsAudios() + function getAudiosCollectionSize() { - $friendsCount = $this->getFriendsCount(); - $friends = $this->getFriends(max(rand(1, (int)ceil($friendsCount / 6)), 1), 6); + return (new \openvk\Web\Models\Repositories\Audios)->getUserCollectionSize($this); + } - $shuffleSeed = openssl_random_pseudo_bytes(6); - $shuffleSeed = hexdec(bin2hex($shuffleSeed)); + function getBroadcastList(string $filter = "friends", bool $shuffle = false) + { + $dbContext = DatabaseConnection::i()->getContext(); + $entityIds = []; + $query = $dbContext->table("subscriptions")->where("follower", $this->getRealId()); + + if($filter != "all") + $query = $query->where("model = ?", "openvk\\Web\\Models\\Entities\\" . ($filter == "groups" ? "Club" : "User")); + + foreach($query as $_rel) { + $entityIds[] = $_rel->model == "openvk\\Web\\Models\\Entities\\Club" ? $_rel->target * -1 : $_rel->target; + } + + if($shuffle) { + $shuffleSeed = openssl_random_pseudo_bytes(6); + $shuffleSeed = hexdec(bin2hex($shuffleSeed)); + + $entityIds = knuth_shuffle($entityIds, $shuffleSeed); + } - $friends = knuth_shuffle($friends, $shuffleSeed); $returnArr = []; - foreach($friends as $friend) { - $returnArr[] = [ - "id" => $friend->getRealId(), - "name" => $friend->getCanonicalName(), - "avatar" => $friend->getAvatarURL("miniscule"), - "tracksCount" => (new \openvk\Web\Models\Repositories\Audios)->getUserCollectionSize($friend), - "nowListening" => $friend->getCurrentAudioStatus(), - ]; + foreach($entityIds as $id) { + $entit = $id > 0 ? (new Users)->get($id) : (new Clubs)->get(abs($id)); + + if($id > 0 && $entit->isDeleted()) return; + $returnArr[] = $entit; } return $returnArr; diff --git a/Web/Presenters/AdminPresenter.php b/Web/Presenters/AdminPresenter.php index 0a1d5314..658d2f4b 100644 --- a/Web/Presenters/AdminPresenter.php +++ b/Web/Presenters/AdminPresenter.php @@ -615,6 +615,12 @@ final class AdminPresenter extends OpenVKPresenter $audio = $this->audios->get($audio_id); $this->template->audio = $audio; + try { + $this->template->owner = $audio->getOwner()->getId(); + } catch(\Throwable $e) { + $this->template->owner = 1; + } + if ($_SERVER["REQUEST_METHOD"] === "POST") { $audio->setName($this->postParam("name")); $audio->setPerformer($this->postParam("performer")); diff --git a/Web/Presenters/AudioPresenter.php b/Web/Presenters/AudioPresenter.php index a673e7d1..76a56eeb 100644 --- a/Web/Presenters/AudioPresenter.php +++ b/Web/Presenters/AudioPresenter.php @@ -110,8 +110,8 @@ final class AudioPresenter extends OpenVKPresenter $this->template->mode = $mode; $this->template->page = $page; - if(in_array($mode, ["list", "new", "popular"])) - $this->template->friendsAudios = $this->user->identity->getFriendsAudios(); + if(in_array($mode, ["list", "new", "popular"]) && $this->user->identity) + $this->template->friendsAudios = $this->user->identity->getBroadcastList("all", true); } function renderEmbed(int $owner, int $id): void @@ -246,9 +246,11 @@ final class AudioPresenter extends OpenVKPresenter function renderListen(int $id): void { if ($_SERVER["REQUEST_METHOD"] === "POST") { - $this->assertUserLoggedIn(); $this->assertNoCSRF(); + if(is_null($this->user)) + $this->returnJson(["success" => false]); + $audio = $this->audios->get($id); if ($audio && !$audio->isDeleted() && !$audio->isWithdrawn()) { diff --git a/Web/Presenters/WallPresenter.php b/Web/Presenters/WallPresenter.php index db90f2b8..a01c8262 100644 --- a/Web/Presenters/WallPresenter.php +++ b/Web/Presenters/WallPresenter.php @@ -331,7 +331,7 @@ final class WallPresenter extends OpenVKPresenter } } - if(empty($this->postParam("text")) && sizeof($photos) < 1 && sizeof($videos) && sizeof($audios) < 1 && !$poll && !$note) + if(empty($this->postParam("text")) && sizeof($photos) < 1 && sizeof($videos) < 1 && sizeof($audios) < 1 && !$poll && !$note) $this->flashFail("err", tr("failed_to_publish_post"), tr("post_is_empty_or_too_big")); try { diff --git a/Web/Presenters/templates/Admin/EditMusic.xml b/Web/Presenters/templates/Admin/EditMusic.xml index 80ec12b8..c2584760 100644 --- a/Web/Presenters/templates/Admin/EditMusic.xml +++ b/Web/Presenters/templates/Admin/EditMusic.xml @@ -15,6 +15,14 @@ +