Доработана страница отображения ПЛ

This commit is contained in:
FrigaT
2026-04-24 10:37:14 +03:00
parent ecb12a7d4a
commit 14fcd7dff9
2 changed files with 70 additions and 15 deletions

View File

@@ -5,11 +5,33 @@ public static class LongExtensions
/// <summary> /// <summary>
/// Преобразует миллисекунды в формат Минуты:Секунды /// Преобразует миллисекунды в формат Минуты:Секунды
/// </summary> /// </summary>
public static string FormatDuration(this long ms) public static string FormatDuration(this long ms, FormatDurationType format = FormatDurationType.mmss)
{ {
var seconds = ms / 1000; var seconds = ms / 1000;
var mins = seconds / 60;
var secs = seconds % 60; var mm = seconds / 60;
return $"{mins}:{secs:D2}"; var ss = seconds % 60;
if (format == FormatDurationType.mmss || mm < 60)
{
return $"{mm}:{ss:D2}";
}
else if (format == FormatDurationType.hhmmss)
{
var hh = mm / 60;
mm = mm / 60;
return $"{hh}:{mm:D2}:{ss:D2}";
}
else
{
return $"{mm}:{ss:D2}";
}
}
public enum FormatDurationType
{
mmss,
hhmmss,
} }
} }

View File

@@ -46,6 +46,11 @@
OnClick="SharePlaylist" OnClick="SharePlaylist"
Size="Size.Medium" /> Size="Size.Medium" />
<MudIconButton Icon="@CustomIcons.Yandex"
Href="@($"https://music.yandex.ru/playlists/{_playlist?.YandexPlaylistUuid}")"
Target="_blank"
Size="Size.Medium" />
@if (_isCreator && _isAuthenticated) @if (_isCreator && _isAuthenticated)
{ {
<MudIconButton Icon="@Icons.Material.Filled.Settings" OnClick="OpenPermissionsDialog" Size="Size.Medium" /> <MudIconButton Icon="@Icons.Material.Filled.Settings" OnClick="OpenPermissionsDialog" Size="Size.Medium" />
@@ -127,6 +132,12 @@
<MudMenuItem Icon="@Icons.Material.Filled.Share" <MudMenuItem Icon="@Icons.Material.Filled.Share"
OnClick="SharePlaylist" OnClick="SharePlaylist"
Label="Поделиться" /> Label="Поделиться" />
<MudMenuItem Icon="@CustomIcons.Yandex"
Href="@($"https://music.yandex.ru/playlists/{_playlist?.YandexPlaylistUuid}")"
Label="Открыть в ЯМ"
Target="_blank" />
@if (_isCreator && _isAuthenticated) @if (_isCreator && _isAuthenticated)
{ {
<MudMenuItem Icon="@Icons.Material.Filled.Settings" <MudMenuItem Icon="@Icons.Material.Filled.Settings"
@@ -186,9 +197,22 @@
<MudImage Src="@_playlist.CoverUrl.FormatCoverUrl(60, 60)" Height="60" Width="60" Class="rounded shadow-sm" /> <MudImage Src="@_playlist.CoverUrl.FormatCoverUrl(60, 60)" Height="60" Width="60" Class="rounded shadow-sm" />
} }
<MudText Typo="Typo.h6" Color="Color.Primary"> <MudStack Spacing="0" Class="pb-1">
@_playlist?.Title <MudText Typo="Typo.h6" Color="Color.Primary">
</MudText> @_playlist?.Title
</MudText>
@if (_tracksLoading)
{
<MudSkeleton Width="200px" Height="20px" SkeletonType="SkeletonType.Text" />
}
else
{
<MudText Typo="Typo.caption" Color="Color.Secondary">
@($"Треков: {_playlistTrackCount} • Продолжительность: {_playlistDurationMs.FormatDuration(LongExtensions.FormatDurationType.hhmmss)}")
</MudText>
}
</MudStack>
</MudStack> </MudStack>
} }
}; };
@@ -405,6 +429,14 @@
/// Список добавленных в плейлист треков. /// Список добавленных в плейлист треков.
/// </summary> /// </summary>
private List<YandexTrack> _tracks = new(); private List<YandexTrack> _tracks = new();
/// <summary>
/// Продолжительность плейлиста.
/// </summary>
long _playlistDurationMs;
/// <summary>
/// Кол-во треков в ПЛ.
/// </summary>
int _playlistTrackCount;
/// <summary>Свойства плейлиста.</summary> /// <summary>Свойства плейлиста.</summary>
private SharedPlaylistDto? _playlist; private SharedPlaylistDto? _playlist;
@@ -554,7 +586,9 @@
if (response?.Success == true && response.Data != null) if (response?.Success == true && response.Data != null)
{ {
_tracks = response.Data.Tracks; _tracks = response.Data.Tracks;
await GenerateUniqTrackIds(); _existingTrackIds = _tracks.Select(t => t.TrackId).ToHashSet();
_playlistDurationMs = _tracks.Sum(t => t.DurationMs);
_playlistTrackCount = _tracks.Count();
} }
else else
{ {
@@ -573,11 +607,6 @@
} }
} }
private async Task GenerateUniqTrackIds()
{
_existingTrackIds = _tracks.Select(t => t.TrackId).ToHashSet();
}
/// <summary>Удаление трека из списка плейлиста</summary> /// <summary>Удаление трека из списка плейлиста</summary>
private async Task OnRemoveTrack(YandexTrack track) private async Task OnRemoveTrack(YandexTrack track)
{ {
@@ -607,7 +636,9 @@
{ {
Snackbar.Add($"Трек \"{track.Title}\" добавлен", Severity.Success, c => c.SnackbarVariant = Variant.Outlined); Snackbar.Add($"Трек \"{track.Title}\" добавлен", Severity.Success, c => c.SnackbarVariant = Variant.Outlined);
_tracks.Insert(0, track); _tracks.Insert(0, track);
await GenerateUniqTrackIds(); _existingTrackIds.Add(track.TrackId);
_playlistDurationMs += track.DurationMs;
_playlistTrackCount += 1;
} }
else else
{ {
@@ -636,7 +667,9 @@
{ {
Snackbar.Add("Трек удалён", Severity.Success); Snackbar.Add("Трек удалён", Severity.Success);
_tracks.Remove(track); _tracks.Remove(track);
await GenerateUniqTrackIds(); _existingTrackIds.Remove(track.TrackId);
_playlistDurationMs -= track.DurationMs;
_playlistTrackCount -= 1;
} }
else else
{ {