using YandexMusic.API.Common; using YandexMusic.API.Models.Common; 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 partial class YPlaylistAPI : YCommonAPI { #region Вспомогательные функции /// /// Получение персональных плейлистов /// /// Хранилище /// Тип /// Плейлист private async Task> GetPersonalPlaylist(AuthStorage storage, YGeneratedPlaylistType type) { List> list = await GetPersonalPlaylistsAsync(storage); return list.FirstOrDefault(e => string.Equals(e.Result.GeneratedPlaylistType, type.ToString(), StringComparison.CurrentCultureIgnoreCase)); } /// /// Изменение плейлиста /// /// Хранилище /// Плейлист /// Список изменений /// Плейлист после изменений private Task> ChangePlaylist(AuthStorage storage, YPlaylist playlist, IEnumerable changes) { return new YPlaylistChangeBuilder(api, storage) .Build((playlist, changes)) .GetResponseAsync(); } private IEnumerable RemoveIdentical(IEnumerable tracks) { return tracks.Distinct(); } #endregion Вспомогательные функции public YPlaylistAPI(YandexMusicApi yandex) : base(yandex) { } #region Список с главной /// /// Получение списка персональных плейлистов /// /// Хранилище /// public async Task>> GetPersonalPlaylistsAsync(AuthStorage storage) { YResponse landing = await api.Landing.GetAsync(storage, YLandingBlockType.PersonalPlaylists); IEnumerable>> tasks = landing .Result .Blocks .FirstOrDefault(b => b.Type == YLandingBlockType.PersonalPlaylists) ?.Entities .Select(e => api.Playlist.GetAsync(storage, ((YLandingEntityPersonalPlaylist)e).Data?.Data)); return tasks == null ? new List>() : new List>(await Task.WhenAll(tasks)); } #endregion Список с главной #region Стандартные плейлисты /// /// Избранное /// /// Хранилище /// public Task>> FavoritesAsync(AuthStorage storage) { return new YGetPlaylistFavoritesBuilder(api, storage) .Build(null) .GetResponseAsync(); } /// /// Плейлист дня /// /// Хранилище /// public Task> OfTheDayAsync(AuthStorage storage) { return GetPersonalPlaylist(storage, YGeneratedPlaylistType.PlaylistOfTheDay); } /// /// Дежавю /// /// Хранилище /// public Task> DejaVuAsync(AuthStorage storage) { return GetPersonalPlaylist(storage, YGeneratedPlaylistType.NeverHeard); } /// /// Премьера /// /// Хранилище /// public Task> PremiereAsync(AuthStorage storage) { return GetPersonalPlaylist(storage, YGeneratedPlaylistType.RecentTracks); } /// /// Тайник /// /// Хранилище /// public Task> MissedAsync(AuthStorage storage) { return GetPersonalPlaylist(storage, YGeneratedPlaylistType.MissedLikes); } /// /// Кинопоиск /// /// Хранилище /// public Task> KinopoiskAsync(AuthStorage storage) { return GetPersonalPlaylist(storage, YGeneratedPlaylistType.Kinopoisk); } #endregion Стандартные плейлисты #region Получение плейлиста /// /// Получение плейлиста /// /// Хранилище /// Uid пользователя-владельца плейлиста /// Тип /// public Task> GetAsync(AuthStorage storage, string user, string kind) { return new YGetPlaylistBuilder(api, storage) .Build((user, kind)) .GetResponseAsync(); } /// /// Получение плейлиста по uuid /// /// Хранилище /// uuid /// public Task> GetAsync(AuthStorage storage, string uuid) { return new YGetPlaylistByUuidBuilder(api, storage) .Build(uuid) .GetResponseAsync(); } /// /// Получение плейлистов /// /// Хранилище /// Список пар пользователь:тип /// public Task>> GetAsync(AuthStorage storage, IEnumerable<(string user, string kind)> ids) { return new YGetPlaylistsBuilder(api, storage) .Build(ids) .GetResponseAsync(); } /// /// Получение плейлиста /// /// Хранилище /// Описание плейлиста, для которого будут запрошены треки /// public Task> GetAsync(AuthStorage storage, YPlaylist playlist) { return new YGetPlaylistBuilder(api, storage) .Build((playlist.Owner.Uid, playlist.Kind)) .GetResponseAsync(); } #endregion Получение плейлиста #region Операции над плейлистами /// /// Создание /// /// Хранилище /// Заголовок /// public Task> CreateAsync(AuthStorage storage, string name) { return new YPlaylistCreateBuilder(api, storage) .Build(name) .GetResponseAsync(); } /// /// Переименование /// /// Хранилище /// Идентификатор плейлиста /// Заголовок /// public Task> RenameAsync(AuthStorage storage, string kinds, string name) { return new YPlaylistRenameBuilder(api, storage) .Build((kinds, name)) .GetResponseAsync(); } /// /// Переименование /// /// Хранилище /// Плейлист /// Заголовок /// public Task> RenameAsync(AuthStorage storage, YPlaylist playlist, string name) { return RenameAsync(storage, playlist.Kind, name); } /// /// Удаление /// /// Хранилище /// Тип /// public async Task DeleteAsync(AuthStorage storage, string kinds) { try { await new YPlaylistRemoveBuilder(api, storage) .Build(kinds) .GetResponseAsync(); return true; } catch (Exception ex) { Console.WriteLine(ex); } return false; } /// /// Удаление /// /// Хранилище /// Плейлист /// public Task DeleteAsync(AuthStorage storage, YPlaylist playlist) { return DeleteAsync(storage, playlist.Kind); } /// /// Добавление трека /// /// Хранилище /// Плейлист /// Треки для добавления /// public async Task> InsertTracksAsync(AuthStorage storage, YPlaylist playlist, IEnumerable tracks) { YResponse change = await ChangePlaylist(storage, playlist, new List { new() { Operation = YPlaylistChangeType.Insert, At = 0, Tracks = tracks.Select(t => t.GetKey()) } }); return await GetAsync(storage, change.Result); } /// /// Удаление треков /// /// Хранилище /// Плейлист /// Треки для удаления /// public Task> DeleteTracksAsync(AuthStorage storage, YPlaylist playlist, IEnumerable tracks) { List changes = RemoveIdentical(tracks) .Select(t => playlist.Tracks.Select(c => c.Track).ToList().IndexOf(t)) .Where(i => i != -1) .Select(i => { YTrackContainer t = playlist.Tracks[i]; return new YPlaylistChange { Operation = YPlaylistChangeType.Delete, From = i, To = i + 1, Tracks = new List { t.Track.GetKey() } }; }) .ToList(); return ChangePlaylist(storage, playlist, changes); } #endregion Операции над плейлистами } }