using YandexMusic.API.Models.Landing;
using YandexMusic.API.Models.Landing.Entity.Entities;
using YandexMusic.API.Models.Playlist;
using YandexMusic.API.Models.Track;
using YandexMusic.API.Requests.Playlist;
namespace YandexMusic.API;
/// API для работы с плейлистами.
public class YPlaylistAPI : YCommonAPI
{
public YPlaylistAPI(YandexMusicApi api) : base(api) { }
public async Task> GetPersonalPlaylistsAsync()
{
var landing = await Api.Landing.GetAsync(YLandingBlockType.PersonalPlaylists);
var block = landing?.Blocks?.FirstOrDefault(b => b.Type == YLandingBlockType.PersonalPlaylists);
if (block?.Entities == null)
return new List();
var tasks = block.Entities
.OfType()
.Select(e => GetAsync(e.Data?.Data?.Owner?.Uid ?? Api.Storage.User.Uid, e.Data?.Data?.Kind ?? ""))
.Where(t => t != null)
.ToList();
var results = await Task.WhenAll(tasks);
return results.Where(p => p != null).ToList()!;
}
public Task GetAsync(string user, string kind)
=> new YGetPlaylistBuilder(Api).ExecuteAsync((user, kind));
public Task GetAsync(string uuid)
=> new YGetPlaylistByUuidBuilder(Api).ExecuteAsync(uuid);
public Task GetAsync(YPlaylist playlist)
=> GetAsync(playlist.Owner.Uid, playlist.Kind);
public Task?> GetAsync(IEnumerable<(string user, string kind)> ids)
=> new YGetPlaylistsBuilder(Api).ExecuteAsync(ids);
public Task?> FavoritesAsync()
=> new YGetPlaylistFavoritesBuilder(Api).ExecuteAsync(null!);
public async Task OfTheDayAsync()
=> (await GetPersonalPlaylistsAsync()).FirstOrDefault(p => p?.GeneratedPlaylistType == YGeneratedPlaylistType.PlaylistOfTheDay.ToString());
public async Task DejaVuAsync()
=> (await GetPersonalPlaylistsAsync()).FirstOrDefault(p => p?.GeneratedPlaylistType == YGeneratedPlaylistType.NeverHeard.ToString());
public async Task PremiereAsync()
=> (await GetPersonalPlaylistsAsync()).FirstOrDefault(p => p?.GeneratedPlaylistType == YGeneratedPlaylistType.RecentTracks.ToString());
public async Task MissedAsync()
=> (await GetPersonalPlaylistsAsync()).FirstOrDefault(p => p?.GeneratedPlaylistType == YGeneratedPlaylistType.MissedLikes.ToString());
public async Task KinopoiskAsync()
=> (await GetPersonalPlaylistsAsync()).FirstOrDefault(p => p?.GeneratedPlaylistType == YGeneratedPlaylistType.Kinopoisk.ToString());
public Task CreateAsync(string name)
=> new YPlaylistCreateBuilder(Api).ExecuteAsync(name);
public Task RenameAsync(string kind, string name)
=> new YPlaylistRenameBuilder(Api).ExecuteAsync((kind, name));
public Task RenameAsync(YPlaylist playlist, string name)
=> RenameAsync(playlist.Kind, name);
public async Task DeleteAsync(string kind)
{
try
{
await new YPlaylistRemoveBuilder(Api).ExecuteAsync(kind);
return true;
}
catch
{
return false;
}
}
public Task DeleteAsync(YPlaylist playlist)
=> DeleteAsync(playlist.Kind);
public async Task InsertTracksAsync(YPlaylist playlist, IEnumerable tracks)
{
var change = await new YPlaylistChangeBuilder(Api).ExecuteAsync((playlist, new[]
{
new YPlaylistChange
{
Operation = YPlaylistChangeType.Insert,
At = 0,
Tracks = tracks.Select(t => t.GetKey())
}
}));
return change != null ? await GetAsync(change) : null;
}
public async Task DeleteTracksAsync(YPlaylist playlist, IEnumerable tracks)
{
var distinctTracks = tracks.Distinct().ToList();
var indices = distinctTracks
.Select(t => playlist.Tracks?.FindIndex(ct => ct.Track?.GetKey() == t.GetKey()) ?? -1)
.Where(i => i != -1)
.ToList();
var changes = indices.Select(i => new YPlaylistChange
{
Operation = YPlaylistChangeType.Delete,
From = i,
To = i + 1,
Tracks = new[] { playlist.Tracks![i].Track!.GetKey() }
});
var change = await new YPlaylistChangeBuilder(Api).ExecuteAsync((playlist, changes));
return change != null ? await GetAsync(change) : null;
}
}