Добавлен пункт "мои плейлисты"

This commit is contained in:
FrigaT
2026-04-23 18:05:07 +03:00
parent 362762a813
commit d6da8460cc
7 changed files with 161 additions and 24 deletions

View File

@@ -28,13 +28,13 @@ public class YandexSearchController : ControllerBase
[HttpGet("search")]
public async Task<ActionResult<ApiResponse<YandexSearchResult>>> SearchQuery(
[FromQuery] string query,
[FromQuery] int limit = 20,
[FromQuery] string query = "",
[FromQuery] int limit = 40,
[FromQuery] TrackSearchType searchType = TrackSearchType.All,
[FromQuery] bool byId = false,
[FromQuery] string? shared_id = null)
{
if (string.IsNullOrWhiteSpace(query))
if (string.IsNullOrWhiteSpace(query) && searchType != TrackSearchType.MyPlaylists)
return BadRequest(ApiResponse<YandexSearchResult>.Fail(new ErrorResponse
{
StatusCode = 400,
@@ -46,6 +46,8 @@ public class YandexSearchController : ControllerBase
if (userId.HasValue)
user = await _userManager.FindByIdAsync(userId.Value.ToString());
var byShareId = false;
// Если нет пользователя или у него нет токена, пробуем через shared_id
if (user == null || string.IsNullOrEmpty(user.YandexAccessToken))
{
@@ -61,6 +63,8 @@ public class YandexSearchController : ControllerBase
var owner = await _userManager.FindByIdAsync(playlist.CreatorUserId.ToString());
if (owner == null) return StatusCode(500, "Не удалось найти владельца плейлиста.");
user = owner;
byShareId = true;
}
if (string.IsNullOrEmpty(user.YandexAccessToken))
@@ -74,7 +78,16 @@ public class YandexSearchController : ControllerBase
if (byId)
{
results = await _yandexService.SearchTracksByIdAsync(user, query, searchType, limit);
results = await _yandexService.SearchTracksByIdAsync(user, query, searchType);
}
else if (searchType == TrackSearchType.MyPlaylists)
{
if (byShareId)
{
return Unauthorized("Необходимо подключение профиля к яндекс музыке.");
}
results = await _yandexService.SearchMyPlaylists(user);
}
else
{

View File

@@ -10,24 +10,24 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.6" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="10.0.7" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" Version="10.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="10.0.7" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="10.0.7" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.7" />
<PackageReference Include="AspNet.Security.OAuth.Yandex" Version="10.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.6">
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.7">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.6" />
<PackageReference Include="Microsoft.Extensions.Caching.SqlServer" Version="10.0.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.7" />
<PackageReference Include="Microsoft.Extensions.Caching.SqlServer" Version="10.0.7" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.23.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="10.1.7" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="10.1.7" />
<PackageReference Include="YandexMusic" Version="0.0.15" />
<PackageReference Include="YandexMusic" Version="0.0.16" />
</ItemGroup>
<ItemGroup>

View File

@@ -161,11 +161,56 @@ public class YandexMusicService
};
}
public async Task<YandexSearchResult> SearchMyPlaylists(ApplicationUser user)
{
YandexSearchResult result = new();
await AuthorizeIfNot(user);
var favoritesPlaylist = await Api.Playlist.FavoritesAsync();
result.Playlists = favoritesPlaylist?.Select(t => new YandexPlaylist
{
Uuid = t.PlaylistUuid,
Kind = t.Kind,
OwnerUid = t.Owner?.Uid ?? string.Empty,
Title = t.Title,
Description = t.Description,
CoverUrl = t.Cover.GetUrl(),
TrackCount = t.TrackCount,
}).ToList();
var personalPlaylists = await Api.Playlist.GetPersonalPlaylistsAsync();
result.PersonalPlaylists = personalPlaylists?.Select(t => new YandexPlaylist
{
Uuid = t.PlaylistUuid,
Kind = t.Kind,
OwnerUid = t.Owner?.Uid ?? string.Empty,
Title = t.Title,
Description = t.Description,
CoverUrl = t.Cover.GetUrl(),
TrackCount = t.TrackCount,
}).ToList();
var likedPlaylists = (await Api.Library.GetLikedPlaylistsAsync())?.Select(t => t.Playlist).ToList();
result.LikedPlaylists = likedPlaylists?.Select(t => new YandexPlaylist
{
Uuid = t.PlaylistUuid,
Kind = t.Kind,
OwnerUid = t.Owner?.Uid ?? string.Empty,
Title = t.Title,
Description = t.Description,
CoverUrl = t.Cover.GetUrl(),
TrackCount = t.TrackCount,
}).ToList();
return result;
}
public async Task<YandexSearchResult> SearchTracksByIdAsync(
ApplicationUser user,
string id,
TrackSearchType searchType,
int limit = 20
TrackSearchType searchType
)
{
YandexSearchResult result = new();
@@ -254,8 +299,8 @@ public class YandexMusicService
TrackCount = p.TrackCount,
}).ToList();
result.Tracks = artist.PopularTracks.Select(t => new YandexTrack
var allTraks = await artist.Artist.GetAllTracksAsync();
result.Tracks = allTraks?.Select(t => new YandexTrack
{
TrackId = t.Id,
Title = t.Title,