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 Операции над плейлистами
}
}