Обнновлено до .net10
This commit is contained in:
@@ -1,11 +1,10 @@
|
||||
using YandexMusic.API.Models.Album;
|
||||
|
||||
namespace YandexMusic.API.Models.Search.Album
|
||||
namespace YandexMusic.API.Models.Search.Album;
|
||||
|
||||
public class YSearchAlbumModel : YAlbum
|
||||
{
|
||||
public class YSearchAlbumModel : YAlbum
|
||||
{
|
||||
public List<string> AvailableRegions { get; set; }
|
||||
public int OriginalReleaseYear { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
}
|
||||
public List<string> AvailableRegions { get; set; }
|
||||
public int OriginalReleaseYear { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using YandexMusic.API.Models.Common.Cover;
|
||||
|
||||
namespace YandexMusic.API.Models.Search.Artist
|
||||
namespace YandexMusic.API.Models.Search.Artist;
|
||||
|
||||
public class YSearchArtist
|
||||
{
|
||||
public class YSearchArtist
|
||||
{
|
||||
public bool Composer { get; set; }
|
||||
[JsonConverter(typeof(YCoverConverter))]
|
||||
public YCover Cover { get; set; }
|
||||
public List<string> Decomposed { get; set; }
|
||||
public string Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public bool Various { get; set; }
|
||||
}
|
||||
public bool Composer { get; set; }
|
||||
[JsonConverter(typeof(YCoverConverter))]
|
||||
public YCover Cover { get; set; }
|
||||
public List<string> Decomposed { get; set; }
|
||||
public string Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public bool Various { get; set; }
|
||||
}
|
||||
@@ -1,10 +1,9 @@
|
||||
namespace YandexMusic.API.Models.Search.Artist
|
||||
namespace YandexMusic.API.Models.Search.Artist;
|
||||
|
||||
public class YSearchArtistCounter
|
||||
{
|
||||
public class YSearchArtistCounter
|
||||
{
|
||||
public int? AlsoAlbums { get; set; }
|
||||
public int? AlsoTracks { get; set; }
|
||||
public int? DirectAlbums { get; set; }
|
||||
public int? Tracks { get; set; }
|
||||
}
|
||||
public int? AlsoAlbums { get; set; }
|
||||
public int? AlsoTracks { get; set; }
|
||||
public int? DirectAlbums { get; set; }
|
||||
public int? Tracks { get; set; }
|
||||
}
|
||||
@@ -1,11 +1,10 @@
|
||||
using YandexMusic.API.Models.Artist;
|
||||
using YandexMusic.API.Models.Search.Track;
|
||||
|
||||
namespace YandexMusic.API.Models.Search.Artist
|
||||
namespace YandexMusic.API.Models.Search.Artist;
|
||||
|
||||
public class YSearchArtistModel : YArtist
|
||||
{
|
||||
public class YSearchArtistModel : YArtist
|
||||
{
|
||||
public List<YSearchTrackModel> PopularTracks { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
}
|
||||
public List<YSearchTrackModel> PopularTracks { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
}
|
||||
@@ -1,10 +1,9 @@
|
||||
using YandexMusic.API.Models.Playlist;
|
||||
|
||||
namespace YandexMusic.API.Models.Search.Playlist
|
||||
namespace YandexMusic.API.Models.Search.Playlist;
|
||||
|
||||
public class YSearchPlaylistModel : YPlaylist
|
||||
{
|
||||
public class YSearchPlaylistModel : YPlaylist
|
||||
{
|
||||
public string CoverUri { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
}
|
||||
public string CoverUri { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
}
|
||||
@@ -1,13 +1,12 @@
|
||||
using YandexMusic.API.Models.Search.Album;
|
||||
using YandexMusic.API.Models.Track;
|
||||
|
||||
namespace YandexMusic.API.Models.Search.Track
|
||||
namespace YandexMusic.API.Models.Search.Track;
|
||||
|
||||
public class YSearchTrackModel : YTrack
|
||||
{
|
||||
public class YSearchTrackModel : YTrack
|
||||
{
|
||||
public new List<YSearchAlbumModel> Albums { get; set; }
|
||||
public bool AvailableAsRbt { get; set; }
|
||||
public bool Explicit { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
}
|
||||
public new List<YSearchAlbumModel> Albums { get; set; }
|
||||
public bool AvailableAsRbt { get; set; }
|
||||
public bool Explicit { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
namespace YandexMusic.API.Models.Search.Track
|
||||
namespace YandexMusic.API.Models.Search.Track;
|
||||
|
||||
public enum YSearchTrackType
|
||||
{
|
||||
public enum YSearchTrackType
|
||||
{
|
||||
Music
|
||||
}
|
||||
Music,
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
namespace YandexMusic.API.Models.Search.User
|
||||
namespace YandexMusic.API.Models.Search.User;
|
||||
|
||||
public class YSearchUserModel
|
||||
{
|
||||
public class YSearchUserModel
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -1,13 +1,12 @@
|
||||
namespace YandexMusic.API.Models.Search.Video
|
||||
namespace YandexMusic.API.Models.Search.Video;
|
||||
|
||||
public class YSearchVideoModel
|
||||
{
|
||||
public class YSearchVideoModel
|
||||
{
|
||||
public int Duration { get; set; }
|
||||
public string HtmlAutoPlayVideoPlayer { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
public string Text { get; set; }
|
||||
public string ThumbnailUrl { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string YoutubeUrl { get; set; }
|
||||
}
|
||||
public int Duration { get; set; }
|
||||
public string HtmlAutoPlayVideoPlayer { get; set; }
|
||||
public List<string> Regions { get; set; }
|
||||
public string Text { get; set; }
|
||||
public string ThumbnailUrl { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string YoutubeUrl { get; set; }
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using YandexMusic.API.Models.Common;
|
||||
using YandexMusic.API.Models.Search.Album;
|
||||
using YandexMusic.API.Models.Search.Artist;
|
||||
@@ -22,7 +23,7 @@ namespace YandexMusic.API.Models.Search
|
||||
public int Page { get; set; }
|
||||
public int PerPage { get; set; }
|
||||
public YSearchResult<YSearchPlaylistModel> Playlists { get; set; }
|
||||
[JsonProperty("podcast_episodes")]
|
||||
[JsonPropertyName("podcast_episodes")]
|
||||
public YSearchResult<YSearchTrackModel> PodcastEpisode { get; set; }
|
||||
public string SearchRequestId { get; set; }
|
||||
public string Text { get; set; }
|
||||
|
||||
@@ -1,70 +1,14 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using YandexMusic.API.Models.Common;
|
||||
using YandexMusic.API.Models.Search.Album;
|
||||
using YandexMusic.API.Models.Search.Artist;
|
||||
using YandexMusic.API.Models.Search.Playlist;
|
||||
using YandexMusic.API.Models.Search.Track;
|
||||
using YandexMusic.API.Models.Search.Video;
|
||||
|
||||
namespace YandexMusic.API.Models.Search
|
||||
namespace YandexMusic.API.Models.Search;
|
||||
|
||||
/// <summary>Лучший результат поиска.</summary>
|
||||
[JsonConverter(typeof(YSearchBestConverter))]
|
||||
public class YSearchBest
|
||||
{
|
||||
/// <summary>
|
||||
/// Конвертер для поля Result
|
||||
/// </summary>
|
||||
internal class YSearchBestConverter : JsonConverter
|
||||
{
|
||||
public override bool CanConvert(Type objectType)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||
{
|
||||
if (reader.TokenType == JsonToken.Null)
|
||||
return null;
|
||||
|
||||
JObject obj = JObject.Load(reader);
|
||||
JsonObjectContract contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(objectType);
|
||||
YSearchBest best = existingValue as YSearchBest ?? (YSearchBest)contract.DefaultCreator();
|
||||
|
||||
best.Type = (YSearchType)Enum.Parse(typeof(YSearchType), obj["type"].ToString(), true);
|
||||
|
||||
switch (best.Type)
|
||||
{
|
||||
case YSearchType.Track:
|
||||
best.Result = JsonConvert.DeserializeObject<YSearchTrackModel>(obj["result"].ToString());
|
||||
break;
|
||||
case YSearchType.Album:
|
||||
best.Result = JsonConvert.DeserializeObject<YSearchAlbumModel>(obj["result"].ToString());
|
||||
break;
|
||||
case YSearchType.Artist:
|
||||
best.Result = JsonConvert.DeserializeObject<YSearchArtistModel>(obj["result"].ToString());
|
||||
break;
|
||||
case YSearchType.Playlist:
|
||||
best.Result = JsonConvert.DeserializeObject<YSearchPlaylistModel>(obj["result"].ToString());
|
||||
break;
|
||||
case YSearchType.PodcastEpisode:
|
||||
best.Result = JsonConvert.DeserializeObject<YSearchTrackModel>(obj["result"].ToString());
|
||||
break;
|
||||
case YSearchType.Video:
|
||||
best.Result = JsonConvert.DeserializeObject<YSearchVideoModel>(obj["result"].ToString());
|
||||
break;
|
||||
}
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override bool CanWrite => false;
|
||||
}
|
||||
|
||||
[JsonConverter(typeof(YSearchBestConverter))]
|
||||
public class YSearchBest
|
||||
{
|
||||
public dynamic Result { get; set; }
|
||||
public YSearchType Type { get; set; }
|
||||
}
|
||||
/// <summary>Тип найденного объекта.</summary>
|
||||
public YSearchType Type { get; set; }
|
||||
/// <summary>Найденный объект (тип зависит от Type).</summary>
|
||||
public object? Result { get; set; }
|
||||
}
|
||||
73
YandexMusic.API/Models/Search/YSearchBestConverter.cs
Normal file
73
YandexMusic.API/Models/Search/YSearchBestConverter.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using YandexMusic.API.Models.Common;
|
||||
using YandexMusic.API.Models.Search.Album;
|
||||
using YandexMusic.API.Models.Search.Artist;
|
||||
using YandexMusic.API.Models.Search.Playlist;
|
||||
using YandexMusic.API.Models.Search.Track;
|
||||
using YandexMusic.API.Models.Search.Video;
|
||||
|
||||
namespace YandexMusic.API.Models.Search;
|
||||
|
||||
/// <summary>Конвертер для лучшего результата поиска (поле Best). Десериализует в конкретный тип в зависимости от значения поля type.</summary>
|
||||
public class YSearchBestConverter : JsonConverter<YSearchBest>
|
||||
{
|
||||
public override YSearchBest? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
{
|
||||
if (reader.TokenType != JsonTokenType.StartObject)
|
||||
throw new JsonException("Ожидается объект Best");
|
||||
|
||||
using var doc = JsonDocument.ParseValue(ref reader);
|
||||
var root = doc.RootElement;
|
||||
|
||||
var typeProp = root.GetProperty("type");
|
||||
var typeStr = typeProp.GetString();
|
||||
if (!Enum.TryParse<YSearchType>(typeStr, true, out var searchType))
|
||||
throw new JsonException($"Неизвестный тип поиска: {typeStr}");
|
||||
|
||||
var resultElement = root.GetProperty("result");
|
||||
var resultRaw = resultElement.GetRawText();
|
||||
|
||||
object? result = null;
|
||||
|
||||
switch (searchType)
|
||||
{
|
||||
case YSearchType.Track:
|
||||
result = JsonSerializer.Deserialize<YSearchTrackModel>(resultRaw, options);
|
||||
break;
|
||||
case YSearchType.Album:
|
||||
result = JsonSerializer.Deserialize<YSearchAlbumModel>(resultRaw, options);
|
||||
break;
|
||||
case YSearchType.Artist:
|
||||
result = JsonSerializer.Deserialize<YSearchArtistModel>(resultRaw, options);
|
||||
break;
|
||||
case YSearchType.Playlist:
|
||||
result = JsonSerializer.Deserialize<YSearchPlaylistModel>(resultRaw, options);
|
||||
break;
|
||||
case YSearchType.PodcastEpisode:
|
||||
result = JsonSerializer.Deserialize<YSearchTrackModel>(resultRaw, options);
|
||||
break;
|
||||
case YSearchType.Video:
|
||||
result = JsonSerializer.Deserialize<YSearchVideoModel>(resultRaw, options);
|
||||
break;
|
||||
default:
|
||||
result = null;
|
||||
break;
|
||||
}
|
||||
|
||||
return new YSearchBest
|
||||
{
|
||||
Type = searchType,
|
||||
Result = result
|
||||
};
|
||||
}
|
||||
|
||||
public override void Write(Utf8JsonWriter writer, YSearchBest value, JsonSerializerOptions options)
|
||||
{
|
||||
writer.WriteStartObject();
|
||||
writer.WriteString("type", value.Type.ToString().ToLowerInvariant());
|
||||
writer.WritePropertyName("result");
|
||||
JsonSerializer.Serialize(writer, value.Result, options);
|
||||
writer.WriteEndObject();
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,9 @@
|
||||
namespace YandexMusic.API.Models.Search
|
||||
namespace YandexMusic.API.Models.Search;
|
||||
|
||||
public class YSearchResult<T>
|
||||
{
|
||||
public class YSearchResult<T>
|
||||
{
|
||||
public int Order { get; set; }
|
||||
public int PerPage { get; set; }
|
||||
public List<T> Results { get; set; }
|
||||
public int Total { get; set; }
|
||||
}
|
||||
public int Order { get; set; }
|
||||
public int PerPage { get; set; }
|
||||
public List<T> Results { get; set; }
|
||||
public int Total { get; set; }
|
||||
}
|
||||
@@ -1,8 +1,7 @@
|
||||
namespace YandexMusic.API.Models.Search
|
||||
namespace YandexMusic.API.Models.Search;
|
||||
|
||||
public class YSearchSuggest
|
||||
{
|
||||
public class YSearchSuggest
|
||||
{
|
||||
public YSearchBest Best { get; set; }
|
||||
public List<string> Suggestions { get; set; }
|
||||
}
|
||||
public YSearchBest Best { get; set; }
|
||||
public List<string> Suggestions { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user