Полностью переписанное api
All checks were successful
Release / pack-and-publish (release) Successful in 36s

This commit is contained in:
FrigaT
2026-04-19 17:00:05 +03:00
parent 5541d0ad27
commit 36e28ce3fe
111 changed files with 1552 additions and 3358 deletions

View File

@@ -3,27 +3,31 @@ using YandexMusic.API.Models.Album;
namespace YandexMusic.API.Extensions.API;
/// <summary>
/// Методы-расширения для альбома
/// Методы-расширения для альбома.
/// </summary>
public static partial class YAlbumExtensions
public static class YAlbumExtensions
{
/// <summary>
/// Получает полную информацию об альбоме вместе с треками (если ещё не загружены).
/// </summary>
public static async Task<YAlbum> WithTracksAsync(this YAlbum album)
{
return album.Volumes != null
? album
: (await album.Context.API.Album.GetAsync(album.Context.Storage, album.Id))
.Result;
if (album.Volumes != null)
return album;
var result = await album.Context.API.Album.GetAsync(album.Id);
return result ?? album;
}
public static async Task<string> AddLikeAsync(this YAlbum album)
{
return (await album.Context.API.Library.AddAlbumLikeAsync(album.Context.Storage, album))
.Result;
}
/// <summary>
/// Добавляет альбом в список лайкнутых.
/// </summary>
public static async Task<string?> AddLikeAsync(this YAlbum album)
=> await album.Context.API.Library.AddAlbumLikeAsync(album);
public static async Task<string> RemoveLikeAsync(this YAlbum album)
{
return (await album.Context.API.Library.RemoveAlbumLikeAsync(album.Context.Storage, album))
.Result;
}
}
/// <summary>
/// Удаляет альбом из списка лайкнутых.
/// </summary>
public static async Task<string?> RemoveLikeAsync(this YAlbum album)
=> await album.Context.API.Library.RemoveAlbumLikeAsync(album);
}

View File

@@ -4,37 +4,37 @@ using YandexMusic.API.Models.Track;
namespace YandexMusic.API.Extensions.API;
/// <summary>
/// Методы-расширения для исполнителя
/// Методы-расширения для исполнителя.
/// </summary>
public static partial class YArtistExtensions
public static class YArtistExtensions
{
public static async Task<YArtistBriefInfo> BriefInfoAsync(this YArtist artist)
{
return (await artist.Context.API.Artist.GetAsync(artist.Context.Storage, artist.Id))
.Result;
}
/// <summary>
/// Получает расширенную информацию об исполнителе.
/// </summary>
public static async Task<YArtistBriefInfo?> BriefInfoAsync(this YArtist artist)
=> await artist.Context.API.Artist.GetAsync(artist.Id);
public static async Task<YTracksPage> GetTracksAsync(this YArtist artist, int page = 0, int pageSize = 20)
{
return (await artist.Context.API.Artist.GetTracksAsync(artist.Context.Storage, artist.Id, page, pageSize))
.Result;
}
/// <summary>
/// Получает страницу треков исполнителя.
/// </summary>
public static async Task<YTracksPage?> GetTracksAsync(this YArtist artist, int page = 0, int pageSize = 20)
=> await artist.Context.API.Artist.GetTracksAsync(artist.Id, page, pageSize);
public static async Task<List<YTrack>> GetAllTracksAsync(this YArtist artist)
{
return (await artist.Context.API.Artist.GetAllTracksAsync(artist.Context.Storage, artist.Id))
.Result.Tracks;
}
/// <summary>
/// Получает все треки исполнителя.
/// </summary>
public static async Task<List<YTrack>?> GetAllTracksAsync(this YArtist artist)
=> (await artist.Context.API.Artist.GetAllTracksAsync(artist.Id))?.Tracks;
public static async Task<string> AddLikeAsync(this YArtist artist)
{
return (await artist.Context.API.Library.AddArtistLikeAsync(artist.Context.Storage, artist))
.Result;
}
/// <summary>
/// Добавляет исполнителя в список лайкнутых.
/// </summary>
public static async Task<string?> AddLikeAsync(this YArtist artist)
=> await artist.Context.API.Library.AddArtistLikeAsync(artist);
public static async Task<string> RemoveLikeAsync(this YArtist artist)
{
return (await artist.Context.API.Library.RemoveArtistLikeAsync(artist.Context.Storage, artist))
.Result;
}
}
/// <summary>
/// Удаляет исполнителя из списка лайкнутых.
/// </summary>
public static async Task<string?> RemoveLikeAsync(this YArtist artist)
=> await artist.Context.API.Library.RemoveArtistLikeAsync(artist);
}

View File

@@ -4,73 +4,66 @@ using YandexMusic.API.Models.Track;
namespace YandexMusic.API.Extensions.API;
/// <summary>
/// Методы-расширения для плейлиста
/// Методы-расширения для плейлиста.
/// </summary>
public static partial class YPlaylistExtensions
public static class YPlaylistExtensions
{
private static bool CheckUser(YPlaylist playlist)
private static bool IsOwner(YPlaylist playlist)
=> playlist.Owner.Uid == playlist.Context.Storage.User.Uid;
/// <summary>
/// Получает полную информацию о плейлисте вместе с треками.
/// </summary>
public static async Task<YPlaylist?> WithTracksAsync(this YPlaylist playlist)
{
return playlist.Owner.Uid == playlist.Context.Storage.User.Uid;
if (playlist.Tracks != null)
return playlist;
return await playlist.Context.API.Playlist.GetAsync(playlist);
}
public static async Task<YPlaylist> WithTracksAsync(this YPlaylist playlist)
{
return playlist.Tracks != null
? playlist
: (await playlist.Context.API.Playlist.GetAsync(playlist.Context.Storage, playlist))
.Result;
}
/// <summary>
/// Добавляет плейлист в список лайкнутых.
/// </summary>
public static async Task<string?> AddLikeAsync(this YPlaylist playlist)
=> await playlist.Context.API.Library.AddPlaylistLikeAsync(playlist);
public static async Task<string> AddLikeAsync(this YPlaylist playlist)
{
return (await playlist.Context.API.Library.AddPlaylistLikeAsync(playlist.Context.Storage, playlist))
.Result;
}
/// <summary>
/// Удаляет плейлист из списка лайкнутых.
/// </summary>
public static async Task<string?> RemoveLikeAsync(this YPlaylist playlist)
=> await playlist.Context.API.Library.RemovePlaylistLikeAsync(playlist);
public static async Task<string> RemoveLikeAsync(this YPlaylist playlist)
{
return (await playlist.Context.API.Library.RemovePlaylistLikeAsync(playlist.Context.Storage, playlist))
.Result;
}
public static async Task<YPlaylist> RenameAsync(this YPlaylist playlist, string newName)
{
return CheckUser(playlist)
? (await playlist.Context.API.Playlist.RenameAsync(playlist.Context.Storage, playlist, newName))
.Result
: playlist;
}
/// <summary>
/// Переименовывает плейлист (только для владельца).
/// </summary>
public static async Task<YPlaylist?> RenameAsync(this YPlaylist playlist, string newName)
=> IsOwner(playlist) ? await playlist.Context.API.Playlist.RenameAsync(playlist, newName) : playlist;
/// <summary>
/// Удаляет плейлист (только для владельца).
/// </summary>
public static async Task<bool> DeleteAsync(this YPlaylist playlist)
=> IsOwner(playlist) && await playlist.Context.API.Playlist.DeleteAsync(playlist);
/// <summary>
/// Вставляет треки в начало плейлиста (только для владельца).
/// </summary>
public static async Task<YPlaylist?> InsertTracksAsync(this YPlaylist playlist, params YTrack[] tracks)
=> IsOwner(playlist) ? await playlist.Context.API.Playlist.InsertTracksAsync(playlist, tracks) : playlist;
/// <summary>
/// Удаляет треки из плейлиста (только для владельца).
/// </summary>
public static async Task<YPlaylist?> RemoveTracksAsync(this YPlaylist playlist, params YTrack[] tracks)
=> IsOwner(playlist) ? await playlist.Context.API.Playlist.DeleteTracksAsync(playlist, tracks) : playlist;
/// <summary>
/// Загружает трек в плейлист (только для владельца).
/// </summary>
public static async Task<bool> UploadTrackAsync(this YPlaylist playlist, string filePath, string fileName)
{
return CheckUser(playlist) && await playlist.Context.API.Playlist.DeleteAsync(playlist.Context.Storage, playlist);
if (!IsOwner(playlist)) return false;
var result = await playlist.Context.API.UserGeneratedContent.UploadTrackToPlaylistAsync(playlist, fileName, filePath);
return result == "CREATED";
}
public static async Task<YPlaylist> InsertTracksAsync(this YPlaylist playlist, params YTrack[] tracks)
{
return CheckUser(playlist)
? (await playlist.Context.API.Playlist.InsertTracksAsync(playlist.Context.Storage, playlist, tracks))
.Result
: playlist;
}
public static async Task<YPlaylist> RemoveTracksAsync(this YPlaylist playlist, params YTrack[] tracks)
{
return CheckUser(playlist)
? (await playlist.Context.API.Playlist.DeleteTracksAsync(playlist.Context.Storage, playlist, tracks))
.Result
: playlist;
}
public static async Task<bool> UploadTracksAsync(this YPlaylist playlist, string filePath, string fileName)
{
if (!CheckUser(playlist))
return false;
string target = (await playlist.Context.API.UserGeneratedContent.GetUgcUploadLinkAsync(playlist.Context.Storage, playlist, fileName))
.PostTarget;
return (await playlist.Context.API.UserGeneratedContent.UploadUgcTrackAsync(playlist.Context.Storage, target, filePath))
.Result == "CREATED";
}
}
}

View File

@@ -4,24 +4,25 @@ using YandexMusic.API.Models.Track;
namespace YandexMusic.API.Extensions.API;
/// <summary>
/// Методы-расширения для радиостанции
/// Методы-расширения для радиостанции.
/// </summary>
public static partial class YStationResultExtensions
public static class YStationResultExtensions
{
public static async Task<List<YSequenceItem>> GetTracksAsync(this YStation station, string prevTrackId = "")
{
return (await station.Context.API.Radio.GetStationTracksAsync(station.Context.Storage, station, prevTrackId))
.Result.Sequence;
}
/// <summary>
/// Получает список треков для радиостанции.
/// </summary>
public static async Task<List<YSequenceItem>?> GetTracksAsync(this YStation station, string prevTrackId = "")
=> (await station.Context.API.Radio.GetStationTracksAsync(station, prevTrackId))?.Sequence;
public static async Task<string> SetSettings2Async(this YStation station, YStationSettings2 settings)
{
return (await station.Context.API.Radio.SetStationSettings2Async(station.Context.Storage, station, settings))
.Result;
}
/// <summary>
/// Устанавливает настройки станции.
/// </summary>
public static async Task<string?> SetSettings2Async(this YStation station, YStationSettings2 settings)
=> await station.Context.API.Radio.SetStationSettings2Async(station, settings);
public static Task<string> SendFeedBackAsync(this YStation station, YStationFeedbackType type, YTrack track = null, string batchId = "", double totalPlayedSeconds = 0)
{
return station.Context.API.Radio.SendStationFeedBackAsync(station.Context.Storage, station, type, track, batchId, totalPlayedSeconds);
}
}
/// <summary>
/// Отправляет обратную связь о прослушивании.
/// </summary>
public static Task<string?> SendFeedbackAsync(this YStation station, YStationFeedbackType type, YTrack? track = null, string batchId = "", double totalPlayedSeconds = 0)
=> station.Context.API.Radio.SendStationFeedbackAsync(station, type, track, batchId, totalPlayedSeconds);
}

View File

@@ -3,58 +3,61 @@ using YandexMusic.API.Models.Track;
namespace YandexMusic.API.Extensions.API;
/// <summary>
/// Методы-расширения для трека
/// Методы-расширения для трека.
/// </summary>
public static partial class YTrackExtensions
public static class YTrackExtensions
{
public static Task<string> GetLinkAsync(this YTrack track)
{
return track.Context.API.Track.GetFileLinkAsync(track.Context.Storage, track);
}
/// <summary>
/// Получает прямую ссылку на скачивание трека.
/// </summary>
public static Task<string?> GetLinkAsync(this YTrack track)
=> track.Context.API.Track.GetFileLinkAsync(track);
/// <summary>
/// Сохраняет трек в файл.
/// </summary>
public static Task SaveAsync(this YTrack track, string filePath)
{
return track.Context.API.Track.ExtractToFileAsync(track.Context.Storage, track, filePath);
}
=> track.Context.API.Track.ExtractToFileAsync(track, filePath);
public static async Task<int> AddLikeAsync(this YTrack track)
{
return (await track.Context.API.Library.AddTrackLikeAsync(track.Context.Storage, track))
.Result.Revision;
}
/// <summary>
/// Добавляет трек в список лайкнутых.
/// </summary>
public static async Task<int?> AddLikeAsync(this YTrack track)
=> await track.Context.API.Library.AddTrackLikeAsync(track);
public static async Task<int> RemoveLikeAsync(this YTrack track)
{
return (await track.Context.API.Library.RemoveTrackLikeAsync(track.Context.Storage, track))
.Result.Revision;
}
/// <summary>
/// Удаляет трек из списка лайкнутых.
/// </summary>
public static async Task<int?> RemoveLikeAsync(this YTrack track)
=> await track.Context.API.Library.RemoveTrackLikeAsync(track);
public static async Task<int> AddDislikeAsync(this YTrack track)
{
return (await track.Context.API.Library.AddTrackDislikeAsync(track.Context.Storage, track))
.Result.Revision;
}
/// <summary>
/// Добавляет трек в список дизлайкнутых.
/// </summary>
public static async Task<int?> AddDislikeAsync(this YTrack track)
=> await track.Context.API.Library.AddTrackDislikeAsync(track);
public static async Task<int> RemoveDislikeAsync(this YTrack track)
{
return (await track.Context.API.Library.RemoveTrackDislikeAsync(track.Context.Storage, track))
?.Result.Revision ?? -1;
}
/// <summary>
/// Удаляет трек из списка дизлайкнутых.
/// </summary>
public static async Task<int?> RemoveDislikeAsync(this YTrack track)
=> await track.Context.API.Library.RemoveTrackDislikeAsync(track);
public static Task<string> SendPlayTrackInfoAsync(this YTrack track, string from, bool fromCache = false, string playId = "", string playlistId = "", double totalPlayedSeconds = 0, double endPositionSeconds = 0)
{
return track.Context.API.Track.SendPlayTrackInfoAsync(track.Context.Storage, track, from, fromCache, playId, playlistId, totalPlayedSeconds);
}
/// <summary>
/// Отправляет информацию о воспроизведении трека.
/// </summary>
public static Task<string?> SendPlayTrackInfoAsync(this YTrack track, string from, bool fromCache = false, string playId = "", string playlistId = "", double totalPlayedSeconds = 0, double endPositionSeconds = 0)
=> track.Context.API.Track.SendPlayTrackInfoAsync(track, from, fromCache, playId, playlistId, totalPlayedSeconds, endPositionSeconds);
public static async Task<YTrackSupplement> SupplementAsync(this YTrack track)
{
return (await track.Context.API.Track.GetSupplementAsync(track.Context.Storage, track))
.Result;
}
/// <summary>
/// Получает дополнительную информацию о треке.
/// </summary>
public static async Task<YTrackSupplement?> SupplementAsync(this YTrack track)
=> await track.Context.API.Track.GetSupplementAsync(track);
public static async Task<YTrackSimilar> SimilarAsync(this YTrack track)
{
return (await track.Context.API.Track.GetSimilarAsync(track.Context.Storage, track))
.Result;
}
}
/// <summary>
/// Получает похожие треки.
/// </summary>
public static async Task<YTrackSimilar?> SimilarAsync(this YTrack track)
=> await track.Context.API.Track.GetSimilarAsync(track);
}