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; } }