Переработана страница поиска и добавления треков в плейлист

This commit is contained in:
FrigaT
2026-04-15 14:07:33 +03:00
parent c7bd97462a
commit e00b7a735c
26 changed files with 497 additions and 170 deletions

View File

@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.DataProtection;
using PlaylistShared.Api.Entities;
using PlaylistShared.Shared.DTO;
using PlaylistShared.Shared.Enums;
using YandexMusic;
using YandexMusic.API.Extensions.API;
using YandexMusic.API.Models.Playlist;
@@ -107,12 +108,26 @@ public class YandexMusicService
}
}
public async Task<List<YandexTrack>> SearchTracksAsync(ApplicationUser user, string query, int limit = 20)
public async Task<List<YandexTrack>> SearchTracksAsync(
ApplicationUser user,
string query,
TrackSearchType? searchType = TrackSearchType.All,
int limit = 20
)
{
var client = await CreateClientAsync(user);
if (client == null) return new List<YandexTrack>();
var searchResult = await client.SearchAsync(query, YandexMusic.API.Models.Common.YSearchType.Track, page: 0, pageSize: limit);
var ySerchType = searchType switch
{
TrackSearchType.Artist => YandexMusic.API.Models.Common.YSearchType.Artist,
TrackSearchType.Album => YandexMusic.API.Models.Common.YSearchType.Album,
TrackSearchType.Playlist => YandexMusic.API.Models.Common.YSearchType.Playlist,
TrackSearchType.Track => YandexMusic.API.Models.Common.YSearchType.Track,
_ => YandexMusic.API.Models.Common.YSearchType.All
};
var searchResult = await client.SearchAsync(query, ySerchType, page: 0, pageSize: limit);
if (searchResult?.Tracks?.Results == null) return new List<YandexTrack>();
return searchResult.Tracks.Results.Select(t => new YandexTrack
@@ -124,4 +139,48 @@ public class YandexMusicService
DurationMs = t.DurationMs,
}).ToList();
}
public async Task<List<YandexTrack>> SearchTracksByIdAsync(
ApplicationUser user,
string id,
TrackSearchType searchType,
int limit = 20
)
{
var client = await CreateClientAsync(user);
if (client == null) return new List<YandexTrack>();
var ySerchType = searchType switch
{
TrackSearchType.Artist => YandexMusic.API.Models.Common.YSearchType.Artist,
TrackSearchType.Album => YandexMusic.API.Models.Common.YSearchType.Album,
TrackSearchType.Playlist => YandexMusic.API.Models.Common.YSearchType.Playlist,
TrackSearchType.Track => YandexMusic.API.Models.Common.YSearchType.Track,
_ => YandexMusic.API.Models.Common.YSearchType.All
};
IEnumerable<YTrack> searchResult = searchType switch
{
TrackSearchType.Playlist => (await client.GetPlaylistAsync(id)).Tracks.Select(t => t.Track),
TrackSearchType.Track => (await client.GetTracksAsync([id])),
TrackSearchType.Album => (await client.GetAlbumAsync(id)).Volumes.SelectMany(t => t),
TrackSearchType.Artist => (await client.GetArtistAsync(id)).Albums.SelectMany(t => t.Volumes.SelectMany(v => v)),
_ => new List<YTrack>()
};
if (searchType != TrackSearchType.Track)
{
searchResult = searchResult.Distinct();
if (limit > 0) searchResult = searchResult.Take(limit);
}
return searchResult.Select(t => new YandexTrack
{
TrackId = t.Id,
Title = t.Title,
Artists = t.Artists?.Select(a => a.Name).ToList() ?? new List<string>(),
CoverUri = t.CoverUri ?? string.Empty,
DurationMs = t.DurationMs,
}).ToList();
}
}