From be65f81a4aa3a26ad221f34c0c46b88d9a1d0a63 Mon Sep 17 00:00:00 2001 From: mrilyew <99399973+mrilyew@users.noreply.github.com> Date: Fri, 28 Mar 2025 17:04:13 +0300 Subject: [PATCH] fix(audio, favorites): big patch #1259 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Аудио - Добавлена вкладка в аудио "загруженное" которую я забыл добавить в октябре 2023. Она показывает загруженные аудио в порядке возрастания. Есть так же идеи для вкладок "недавно прослушанное" и "ваши друзья слушают" (последняя добавит иммерсивности, или как это называется, персональности на сайт, хотя по факту она просто соберёт id всех друзей и выдаст их недавние добавления в коллекцию), но тогда будет нагромождение вкладок и придётся какое то сворачивание добавлять. - Если аудио больше 10 и ты на странице аудио, то показывается мелкая кнопка в правом нижнем углу которая развернёт счётчик и пагинатор. - Если аудио обрабатывается (processed как я назвал в css) то появится кнопка "всё равно хочу воспроизвести". - При переключении трека меняется заголовок вкладки - Если ты вызвал контекстное меню но оно ушло за экран, то оно будет повыше. # Уязвимости - Убрана уязвимость в audio api что можно было посмотреть айди владельца удалённого аудио. В целом непонятно использование id в тексте ошибки, поскольку он не должен изменятся и быть обобщённым, по типу access to audio denied. Но да ладно, коду три года всё таки. - Удалённый контент заменяется "[deleted]" в /fave. Я бы на самом деле не добавлял это, но меня испугал последний абзац fixed #1258 поэтому добавил. --- VKAPI/Handlers/Audio.php | 6 +-- Web/Presenters/AudioPresenter.php | 13 +++++ Web/Presenters/templates/Audio/List.xml | 32 +++++++++++- Web/Presenters/templates/Audio/bigplayer.xml | 4 ++ Web/Presenters/templates/Audio/tabs.xml | 3 +- Web/Presenters/templates/User/Fave.xml | 40 ++++++++------- Web/routes.yml | 2 + Web/static/css/audios.css | 30 ++++++++++- Web/static/css/main.css | 8 +++ Web/static/js/al_music.js | 53 +++++++++++++++++--- locales/en.strings | 10 +++- locales/ru.strings | 10 +++- 12 files changed, 180 insertions(+), 31 deletions(-) diff --git a/VKAPI/Handlers/Audio.php b/VKAPI/Handlers/Audio.php index b84475a4..df9cf935 100644 --- a/VKAPI/Handlers/Audio.php +++ b/VKAPI/Handlers/Audio.php @@ -18,7 +18,7 @@ final class Audio extends VKAPIRequestHandler if (!$audio) { $this->fail(0o404, "Audio not found"); } elseif (!$audio->canBeViewedBy($this->getUser())) { - $this->fail(201, "Access denied to audio(" . $audio->getPrettyId() . ")"); + $this->fail(201, "Access denied to audio(" . $audio->getId() . ")"); } # рофлан ебало @@ -201,7 +201,7 @@ final class Audio extends VKAPIRequestHandler $this->fail(15, "Access denied"); } - if ($uploaded_only) { + if ($uploaded_only && $owner_id == $this->getUser()->getRealId()) { return DatabaseConnection::i()->getContext()->table("audios") ->where([ "deleted" => false, @@ -283,7 +283,7 @@ final class Audio extends VKAPIRequestHandler } $dbCtx = DatabaseConnection::i()->getContext(); - if ($uploaded_only == 1) { + if ($uploaded_only == 1 && $owner_id == $this->getUser()->getRealId()) { if ($owner_id <= 0) { $this->fail(8, "uploaded_only can only be used with owner_id > 0"); } diff --git a/Web/Presenters/AudioPresenter.php b/Web/Presenters/AudioPresenter.php index db341f83..61b0edbb 100644 --- a/Web/Presenters/AudioPresenter.php +++ b/Web/Presenters/AudioPresenter.php @@ -78,6 +78,10 @@ final class AudioPresenter extends OpenVKPresenter } elseif ($mode === "new") { $audios = $this->audios->getNew(); $audiosCount = $audios->size(); + } elseif ($mode === "uploaded") { + $stream = $this->audios->getByUploader($this->user->identity); + $audios = $stream->page($page, 10); + $audiosCount = $stream->size(); } elseif ($mode === "playlists") { if ($owner < 0) { $entity = (new Clubs())->get(abs($owner)); @@ -130,6 +134,11 @@ final class AudioPresenter extends OpenVKPresenter } } + public function renderUploaded() + { + $this->renderList(null, "uploaded"); + } + public function renderEmbed(int $owner, int $id): void { $audio = $this->audios->getByOwnerAndVID($owner, $id); @@ -841,6 +850,10 @@ final class AudioPresenter extends OpenVKPresenter $audios = [$found_audio]; $audiosCount = 1; break; + case "uploaded": + $stream = $this->audios->getByUploader($this->user->identity); + $audios = $stream->page($page, $perPage); + $audiosCount = $stream->size(); } $pagesCount = ceil($audiosCount / $perPage); diff --git a/Web/Presenters/templates/Audio/List.xml b/Web/Presenters/templates/Audio/List.xml index 1483ce95..fe078cef 100644 --- a/Web/Presenters/templates/Audio/List.xml +++ b/Web/Presenters/templates/Audio/List.xml @@ -9,6 +9,8 @@ {/if} {elseif $mode == 'new'} {_audio_new} + {elseif $mode == 'uploaded'} + {_my_audios_small_uploaded} {elseif $mode == 'popular'} {_audio_popular} {elseif $mode == 'alone_audio'} @@ -32,6 +34,12 @@ +
+ {_my_audios_small} + » + {_my_audios_small_uploaded} +
+
{_audios} » @@ -58,7 +66,7 @@ {block content} {* ref: https://archive.li/P32em *} - {include "bigplayer.xml"} + {include "bigplayer.xml", buttonsShow_summary => $audiosCount > 10} + +
diff --git a/Web/Presenters/templates/Audio/bigplayer.xml b/Web/Presenters/templates/Audio/bigplayer.xml index fcda029a..d30b7a07 100644 --- a/Web/Presenters/templates/Audio/bigplayer.xml +++ b/Web/Presenters/templates/Audio/bigplayer.xml @@ -52,5 +52,9 @@
+ +
+
-
+
diff --git a/Web/Presenters/templates/Audio/tabs.xml b/Web/Presenters/templates/Audio/tabs.xml index 8ff7bb1b..b818d44b 100644 --- a/Web/Presenters/templates/Audio/tabs.xml +++ b/Web/Presenters/templates/Audio/tabs.xml @@ -2,6 +2,7 @@
{_my_music} + {_my_audios_small_uploaded} {* TODO: show upload link as and plusick (little plus) in button up*} {_upload_audio} {_audio_new} @@ -13,7 +14,7 @@ {_new_playlist} - {if !$isMy && $mode !== 'popular' && $mode !== 'new' && $mode != 'alone_audio'} + {if !$isMy && $mode !== 'popular' && $mode !== 'new' && $mode != 'alone_audio' && $mode != 'uploaded'}
{if $ownerId > 0}{_music_user}{else}{_music_club}{/if} diff --git a/Web/Presenters/templates/User/Fave.xml b/Web/Presenters/templates/User/Fave.xml index 50ead41f..29814c39 100644 --- a/Web/Presenters/templates/User/Fave.xml +++ b/Web/Presenters/templates/User/Fave.xml @@ -36,24 +36,30 @@ {if $count > 0} {foreach $data as $dat} - {if $section == "posts"} -
- {include "../components/post.xml", post => $dat, commentSection => true} -
- {elseif $section == "comments"} -
- {include "../components/comment.xml", comment => $dat, correctLink => true, no_reply_button => true} -
- {elseif $section == "photos"} -
- - {$dat->getDescription()} - -
- {elseif $section == "videos"} -
- {include "../components/video.xml", video => $dat} + {if $dat->isDeleted()} +
+ [deleted]
+ {else} + {if $section == "posts"} +
+ {include "../components/post.xml", post => $dat, commentSection => true} +
+ {elseif $section == "comments"} +
+ {include "../components/comment.xml", comment => $dat, correctLink => true, no_reply_button => true} +
+ {elseif $section == "photos"} +
+ + {$dat->getDescription()} + +
+ {elseif $section == "videos"} +
+ {include "../components/video.xml", video => $dat} +
+ {/if} {/if} {/foreach} {else} diff --git a/Web/routes.yml b/Web/routes.yml index 8014b0ef..9738b740 100644 --- a/Web/routes.yml +++ b/Web/routes.yml @@ -201,6 +201,8 @@ routes: handler: "Audio->upload" - url: "/audios{num}" handler: "Audio->list" + - url: "/audios/uploaded" + handler: "Audio->uploaded" - url: "/audio{num}/listen" handler: "Audio->listen" - url: "/audio{num}_{num}" diff --git a/Web/static/css/audios.css b/Web/static/css/audios.css index cd49b006..89bce6f5 100644 --- a/Web/static/css/audios.css +++ b/Web/static/css/audios.css @@ -52,6 +52,34 @@ height: 46px; } +.bigPlayer .bigPlayerWrapper .absoluteButtons { + position: absolute; + bottom: 0; + right: 0; +} + +.bigPlayer .bigPlayerWrapper .absoluteButtons > div { + width: 8px; + height: 8px; + font-size: 9px; + + display: flex; + align-items: center; + justify-content: center; + background: #ebebeb; + border: 1px solid #c3c3c3; + border-bottom: unset; + border-right: unset; + color: #c3c3c3; + cursor: pointer; + user-select: none; +} + +.bigPlayer .bigPlayerWrapper .absoluteButtons > div:active { + background: #c3c3c3; + color: #ebebeb; +} + /* Play button and arrows */ .bigPlayer .playButtons { display: flex; @@ -313,7 +341,7 @@ opacity: 0.8; } -.audioEmbed.processed { +.audioEmbed.processed .playerButton { filter: opacity(0.6); } diff --git a/Web/static/css/main.css b/Web/static/css/main.css index 81601b67..c4d0b6c0 100644 --- a/Web/static/css/main.css +++ b/Web/static/css/main.css @@ -3039,6 +3039,10 @@ a.poll-retract-vote { gap: 1px; } +.verticalGrayTabsPad { + padding: 0px 0px 0px 8px; +} + .searchList hr, .verticalGrayTabs hr { width: 153px; margin-left: 0px; @@ -4278,3 +4282,7 @@ hr { height: 30px; background-position-y: 9px; } + +.deleted_mark_average { + padding: 5px 61px; +} diff --git a/Web/static/js/al_music.js b/Web/static/js/al_music.js index 9e166d58..94ba615f 100644 --- a/Web/static/js/al_music.js +++ b/Web/static/js/al_music.js @@ -54,6 +54,9 @@ window.player = new class { current_track_id = 0 tracks = [] + // time type: + // 0 - shows remaining time before end + // 1 - shows full track time get timeType() { return localStorage.getItem('audio.timeType') ?? 0 } @@ -62,6 +65,7 @@ window.player = new class { localStorage.setItem('audio.timeType', value) } + //