diff --git a/Gallery.iOS.OpenExtension/Info.plist b/Gallery.iOS.OpenExtension/Info.plist index 4dfee30..9bb9d28 100644 --- a/Gallery.iOS.OpenExtension/Info.plist +++ b/Gallery.iOS.OpenExtension/Info.plist @@ -29,8 +29,8 @@ com.apple.share-services CFBundleShortVersionString - 2.0.803 + 2.1.804 CFBundleVersion - 33 + 34 diff --git a/Gallery.iOS/Gallery.iOS.csproj b/Gallery.iOS/Gallery.iOS.csproj index 1b23cc6..a244586 100644 --- a/Gallery.iOS/Gallery.iOS.csproj +++ b/Gallery.iOS/Gallery.iOS.csproj @@ -15,6 +15,7 @@ true NSUrlSessionHandler automatic + true true @@ -188,7 +189,7 @@ - + @@ -220,4 +221,4 @@ - \ No newline at end of file + diff --git a/Gallery.iOS/Info.plist b/Gallery.iOS/Info.plist index 0cf352f..00d821d 100644 --- a/Gallery.iOS/Info.plist +++ b/Gallery.iOS/Info.plist @@ -79,9 +79,9 @@ CFBundleShortVersionString - 2.0.803 + 2.1.804 CFBundleVersion - 33 + 34 CFBundleDevelopmentRegion China diff --git a/Gallery/Illust/IllustCollectionPage.cs b/Gallery/Illust/IllustCollectionPage.cs index dd0c2b3..4c53429 100644 --- a/Gallery/Illust/IllustCollectionPage.cs +++ b/Gallery/Illust/IllustCollectionPage.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; -using Newtonsoft.Json; using Gallery.Resources; using Gallery.UI; using Gallery.UI.Theme; @@ -897,7 +898,6 @@ namespace Gallery.Illust ImageSource ProfileImage { get; } } - [JsonObject(MemberSerialization.OptIn)] public class IllustItem : BindableObject, IIllustItem { private static IllustItem empty; @@ -924,7 +924,6 @@ namespace Gallery.Illust public static readonly BindableProperty BookmarkIdProperty = BindableProperty.Create( nameof(BookmarkId), typeof(string), typeof(IllustItem)); - [JsonProperty] public string Title { get; set; } public int Rank { get; set; } public string RankTitle => Rank > 0 ? $"#{Rank} {Title}" : Title; @@ -950,49 +949,31 @@ namespace Gallery.Illust } public bool IsPlaying { get; set; } - [JsonProperty] public string Id { get; set; } - [JsonProperty] public string BookmarkId { get => (string)GetValue(BookmarkIdProperty); set => SetValue(BookmarkIdProperty, value); } - [JsonProperty] public DateTime FavoriteDateUtc { get; set; } - [JsonProperty] public string ImageUrl { get; set; } - [JsonProperty] public bool IsRestrict { get; set; } - [JsonProperty] public string[] Tags { get; set; } - [JsonProperty] public string ProfileUrl { get; set; } - [JsonProperty] public string UserId { get; set; } - [JsonProperty] public string UserName { get; set; } - [JsonProperty] public int Width { get; set; } - [JsonProperty] public int Height { get; set; } - [JsonProperty] public int PageCount { get; set; } - [JsonProperty] public double ImageHeightValue { get => ImageHeight.IsAuto ? -1 : ImageHeight.Value; set => ImageHeight = value > 0 ? value : GridLength.Auto; } - [JsonProperty] public int YesRank { get; set; } - [JsonProperty] public int RatingCount { get; set; } - [JsonProperty] public int ViewCount { get; set; } - [JsonProperty] public long UploadTimestamp { get; set; } - [JsonProperty] public IllustType IllustType { get; set; } public string PageCountText => $"{StyleDefinition.IconLayer} {PageCount}"; diff --git a/Gallery/Illust/RankingPage.xaml.cs b/Gallery/Illust/RankingPage.xaml.cs index 8958144..f938af2 100644 --- a/Gallery/Illust/RankingPage.xaml.cs +++ b/Gallery/Illust/RankingPage.xaml.cs @@ -177,9 +177,9 @@ namespace Gallery.Illust var data = Stores.LoadIllustRankingData(lastQueryKey, queryDate, currentPage, out lastError, force); if (data != null) { - if (int.TryParse(data.next, out int next)) + if (data.next != null) { - nextPage = next; + nextPage = data.next.Value; } var date = data.date; DateTime now; diff --git a/Gallery/Utils/HttpUtility.cs b/Gallery/Utils/HttpUtility.cs index 81c9772..411b502 100644 --- a/Gallery/Utils/HttpUtility.cs +++ b/Gallery/Utils/HttpUtility.cs @@ -6,9 +6,9 @@ using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; -using Newtonsoft.Json; namespace Gallery.Utils { @@ -116,7 +116,7 @@ namespace Gallery.Utils { try { - result = JsonConvert.DeserializeObject(content); + result = JsonSerializer.Deserialize(content); file = namehandler(result); rtn = true; } @@ -158,11 +158,11 @@ namespace Gallery.Utils error = null; if (nojson) { - return JsonConvert.DeserializeObject("{}"); + return JsonSerializer.Deserialize("{}"); } else { - return JsonConvert.DeserializeObject(content); + return JsonSerializer.Deserialize(content); } } catch (Exception ex) diff --git a/Gallery/Utils/IllustData.cs b/Gallery/Utils/IllustData.cs index 5e18898..012d5f6 100644 --- a/Gallery/Utils/IllustData.cs +++ b/Gallery/Utils/IllustData.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Newtonsoft.Json; +using System.Text.Json.Serialization; using Gallery.Illust; using Xamarin.Forms; @@ -9,54 +9,84 @@ namespace Gallery.Utils { public class IllustResponse { + [JsonInclude] public bool error; + [JsonInclude] public string message; + [JsonInclude] public T body; } public class BookmarkResultData { + [JsonInclude] public string last_bookmark_id; + [JsonInclude] public string stacc_status_id; } public class Illust { + [JsonInclude] public string illustId; + [JsonInclude] public string illustTitle; + [JsonInclude] public string id; + [JsonInclude] public string title; + [JsonInclude] public int illustType; + [JsonInclude] public int xRestrict; + [JsonInclude] public string url; + [JsonInclude] public string description; + [JsonInclude] public string[] tags; + [JsonInclude] public string userId; + [JsonInclude] public string userName; + [JsonInclude] public int width; + [JsonInclude] public int height; + [JsonInclude] public int pageCount; + [JsonInclude] public IllustBookmark bookmarkData; + [JsonInclude] public string alt; + [JsonInclude] public IllustUrls urls; + [JsonInclude] public string seriesId; + [JsonInclude] public string seriesTitle; + [JsonInclude] public string profileImageUrl; public class IllustUrls { - [JsonProperty("250x250")] + [JsonInclude] + [JsonPropertyName("250x250")] public string x250; - [JsonProperty("360x360")] + [JsonInclude] + [JsonPropertyName("360x360")] public string x360; - [JsonProperty("540x540")] + [JsonInclude] + [JsonPropertyName("540x540")] public string x540; } public class IllustBookmark { + [JsonInclude] public string id; - [JsonProperty("private")] + [JsonInclude] + [JsonPropertyName("private")] public bool isPrivate; } @@ -84,115 +114,174 @@ namespace Gallery.Utils public class User { + [JsonInclude] public string userId; + [JsonInclude] public string name; + [JsonInclude] public string image; + [JsonInclude] public string imageBig; + [JsonInclude] public bool premium; + [JsonInclude] public bool isFollowed; //public string background; + [JsonInclude] public int partial; } public class IllustFavoriteData : IllustResponse { } public class IllustFavoriteBody { + [JsonInclude] public int total; + [JsonInclude] public Illust[] works; } public class IllustData : IllustResponse { } public class IllustBody { + [JsonInclude] public Page page; + [JsonInclude] public Thumbnail thumbnails; + [JsonInclude] public User[] users; public class Page { + [JsonInclude] public int[] follow; + [JsonInclude] public Recommends recommend; + [JsonInclude] public RecommendByTag[] recommendByTags; + [JsonInclude] public Ranking ranking; + [JsonInclude] public RecommendUser[] recommendUser; + [JsonInclude] public EditorRecommend[] editorRecommend; + [JsonInclude] public string[] newPost; public class Recommends { + [JsonInclude] public string[] ids; } public class RecommendByTag { + [JsonInclude] public string tag; + [JsonInclude] public string[] ids; } public class Ranking { + [JsonInclude] public RankingItem[] items; + [JsonInclude] public string date; public class RankingItem { + [JsonInclude] public string rank; + [JsonInclude] public string id; } } public class RecommendUser { + [JsonInclude] public int id; + [JsonInclude] public string[] illustIds; } public class EditorRecommend { + [JsonInclude] public string illustId; + [JsonInclude] public string comment; } } public class Thumbnail { + [JsonInclude] public Illust[] illust; } } public class IllustPreloadBody { + [JsonInclude] public Dictionary illust; + [JsonInclude] public Dictionary user; public class Illust { + [JsonInclude] public string illustId; + [JsonInclude] public string illustTitle; + [JsonInclude] public string illustComment; + [JsonInclude] public string id; + [JsonInclude] public string title; + [JsonInclude] public string description; + [JsonInclude] public int illustType; + [JsonInclude] public DateTime createDate; + [JsonInclude] public DateTime uploadDate; + [JsonInclude] public int xRestrict; + [JsonInclude] public IllustUrls urls; + [JsonInclude] public IllustTag tags; + [JsonInclude] public string alt; + [JsonInclude] public string userId; + [JsonInclude] public string userName; + [JsonInclude] public string userAccount; //public Dictionary userIllusts; + [JsonInclude] public int width; + [JsonInclude] public int height; + [JsonInclude] public int pageCount; + [JsonInclude] public int bookmarkCount; + [JsonInclude] public int likeCount; + [JsonInclude] public int commentCount; + [JsonInclude] public int responseCount; + [JsonInclude] public int viewCount; + [JsonInclude] public bool isOriginal; + [JsonInclude] public IllustBookmark bookmarkData; public IllustItem CopyToItem(IllustItem item) @@ -223,38 +312,56 @@ namespace Gallery.Utils public class IllustBookmark { + [JsonInclude] public string id; - [JsonProperty("private")] + [JsonInclude] + [JsonPropertyName("private")] public bool isPrivate; } public class IllustUrls { + [JsonInclude] public string mini; + [JsonInclude] public string thumb; + [JsonInclude] public string small; + [JsonInclude] public string regular; + [JsonInclude] public string original; } public class IllustTag { + [JsonInclude] public string authorId; + [JsonInclude] public bool isLocked; + [JsonInclude] public IllustTagItem[] tags; + [JsonInclude] public bool writable; public class IllustTagItem { + [JsonInclude] public string tag; + [JsonInclude] public bool locked; + [JsonInclude] public bool deletable; + [JsonInclude] public string userId; + [JsonInclude] public IllustTranslate translation; + [JsonInclude] public string userName; public class IllustTranslate { + [JsonInclude] public string en; } } @@ -265,15 +372,22 @@ namespace Gallery.Utils public class IllustPageData : IllustResponse { } public class IllustPageBody { + [JsonInclude] public Urls urls; + [JsonInclude] public int width; + [JsonInclude] public int height; public class Urls { + [JsonInclude] public string thumb_mini; + [JsonInclude] public string small; + [JsonInclude] public string regular; + [JsonInclude] public string original; } } @@ -281,33 +395,43 @@ namespace Gallery.Utils public class IllustRecommendsData : IllustResponse { } public class IllustRecommendsBody { + [JsonInclude] public Illust[] illusts; + [JsonInclude] public string[] nextIds; } public class IllustUserListData : IllustResponse { } public class IllustUserListBody { + [JsonInclude] public Dictionary illusts; } public class IllustUserData : IllustResponse { } public class IllustUserBody { + [JsonInclude] public Dictionary works; } public class IllustUgoiraData : IllustResponse { } public class IllustUgoiraBody { + [JsonInclude] public string src; + [JsonInclude] public string originalSrc; + [JsonInclude] public string mime_type; + [JsonInclude] public Frame[] frames; public class Frame { + [JsonInclude] public string file; + [JsonInclude] public int delay; public string FilePath; diff --git a/Gallery/Utils/IllustLegacy.cs b/Gallery/Utils/IllustLegacy.cs index 63c1ef0..11b9349 100644 --- a/Gallery/Utils/IllustLegacy.cs +++ b/Gallery/Utils/IllustLegacy.cs @@ -1,76 +1,139 @@ using System.Linq; +using System.Text.Json; +using System.Text.Json.Serialization; using Gallery.Illust; namespace Gallery.Utils { public class IllustRankingData { + [JsonInclude] public Content[] contents; + [JsonInclude] public string mode; + [JsonInclude] public string content; + [JsonInclude] public int page; - public string prev; - public string next; + [JsonInclude] + [JsonConverter(typeof(Int32Converter))] + public int? prev; + [JsonInclude] + [JsonConverter(typeof(Int32Converter))] + public int? next; + [JsonInclude] public string date; + [JsonInclude] + [JsonConverter(typeof(StringConverter))] public string prev_date; + [JsonInclude] + [JsonConverter(typeof(StringConverter))] public string next_date; + [JsonInclude] public int rank_total; public class Content { + [JsonInclude] public string title; + [JsonInclude] public string date; + [JsonInclude] public string[] tags; + [JsonInclude] public string url; + [JsonInclude] public string illust_type; + [JsonInclude] public string illust_book_style; + [JsonInclude] public string illust_page_count; + [JsonInclude] public string user_name; + [JsonInclude] public string profile_img; + [JsonInclude] public ContentType illust_content_type; + [JsonInclude] public object illust_series; // bool, Series + [JsonInclude] public long illust_id; + [JsonInclude] public int width; + [JsonInclude] public int height; + [JsonInclude] public long user_id; + [JsonInclude] public int rank; + [JsonInclude] public int yes_rank; + [JsonInclude] public int rating_count; + [JsonInclude] public int view_count; + [JsonInclude] public long illust_upload_timestamp; + [JsonInclude] public string attr; + [JsonInclude] public bool is_bookmarked; + [JsonInclude] public bool bookmarkable; + [JsonInclude] public string bookmark_id; + [JsonInclude] public string bookmark_illust_restrict; public class ContentType { + [JsonInclude] public int sexual; + [JsonInclude] public bool lo; + [JsonInclude] public bool grotesque; + [JsonInclude] public bool violent; + [JsonInclude] public bool homosexual; + [JsonInclude] public bool drug; + [JsonInclude] public bool thoughts; + [JsonInclude] public bool antisocial; + [JsonInclude] public bool religion; + [JsonInclude] public bool original; + [JsonInclude] public bool furry; + [JsonInclude] public bool bl; + [JsonInclude] public bool yuri; } public class Series { + [JsonInclude] public string illust_series_caption; + [JsonInclude] public string illust_series_content_count; + [JsonInclude] public string illust_series_content_illust_id; + [JsonInclude] public string illust_series_content_order; + [JsonInclude] public string illust_series_create_datetime; + [JsonInclude] public string illust_series_id; + [JsonInclude] public string illust_series_title; + [JsonInclude] public string illust_series_user_id; + [JsonInclude] public string page_url; } @@ -121,21 +184,67 @@ namespace Gallery.Utils public class IllustGlobalData { + [JsonInclude] public string token; + [JsonInclude] public string oneSignalAppId; + [JsonInclude] public UserData userData; public class UserData { + [JsonInclude] public string id; + [JsonInclude] public string pixivId; + [JsonInclude] public string name; + [JsonInclude] public string profileImg; + [JsonInclude] public string profileImgBig; + [JsonInclude] public bool premium; + [JsonInclude] public int xRestrict; + [JsonInclude] public bool adult; + [JsonInclude] public bool safeMode; } } + + public class Int32Converter : JsonConverter + { + public override int? Read(ref Utf8JsonReader reader, System.Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Number) + { + return reader.GetInt32(); + } + return null; + } + + public override void Write(Utf8JsonWriter writer, int? value, JsonSerializerOptions options) + { + throw new System.NotImplementedException(); + } + } + + public class StringConverter : JsonConverter + { + public override string Read(ref Utf8JsonReader reader, System.Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + return reader.GetString(); + } + return null; + } + + public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) + { + throw new System.NotImplementedException(); + } + } } diff --git a/Gallery/Utils/Stores.cs b/Gallery/Utils/Stores.cs index 2a1a911..49bdf71 100644 --- a/Gallery/Utils/Stores.cs +++ b/Gallery/Utils/Stores.cs @@ -5,9 +5,9 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Text; -using System.Text.RegularExpressions; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; -using Newtonsoft.Json; using Gallery.Illust; using Xamarin.Essentials; using Xamarin.Forms; @@ -147,7 +147,7 @@ namespace Gallery.Utils } try { - return JsonConvert.DeserializeObject(content); + return JsonSerializer.Deserialize(content); } catch (Exception ex) { @@ -166,7 +166,7 @@ namespace Gallery.Utils string content; try { - content = JsonConvert.SerializeObject(obj, Formatting.None); + content = JsonSerializer.Serialize(obj); } catch (Exception ex) { @@ -651,6 +651,7 @@ namespace Gallery.Utils public FavoriteList Illusts { get; set; } } + [JsonConverter(typeof(FavoriteListConverter))] public class FavoriteList : List { public bool Changed { get; private set; } @@ -683,6 +684,120 @@ namespace Gallery.Utils } } + public class FavoriteListConverter : JsonConverter + { + public override FavoriteList Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var list = new FavoriteList(); + if (reader.TokenType != JsonTokenType.StartArray) + { + return list; + } + var item = new IllustItem(); + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndArray) + { + return list; + } + if (reader.TokenType == JsonTokenType.EndObject) + { + list.Add(item); + item = new IllustItem(); + } + else if (reader.TokenType == JsonTokenType.PropertyName) + { + var name = reader.GetString(); + reader.Read(); + switch (name) + { + case nameof(IllustItem.Title): item.Title = reader.GetString(); break; + case nameof(IllustItem.Id): item.Id = reader.GetString(); break; + case nameof(IllustItem.BookmarkId): item.BookmarkId = reader.GetString(); break; + case nameof(IllustItem.FavoriteDateUtc): item.FavoriteDateUtc = reader.GetDateTime(); break; + case nameof(IllustItem.ImageUrl): item.ImageUrl = reader.GetString(); break; + case nameof(IllustItem.IsRestrict): item.IsRestrict = reader.GetBoolean(); break; + case nameof(IllustItem.Tags): + if (reader.TokenType == JsonTokenType.StartArray) + { + var tags = new List(); + while (reader.Read()) + { + if (reader.TokenType == JsonTokenType.EndArray) + { + break; + } + if (reader.TokenType == JsonTokenType.String) + { + tags.Add(reader.GetString()); + } + } + item.Tags = tags.ToArray(); + } + break; + case nameof(IllustItem.ProfileUrl): item.ProfileUrl = reader.GetString(); break; + case nameof(IllustItem.UserId): item.UserId = reader.GetString(); break; + case nameof(IllustItem.UserName): item.UserName = reader.GetString(); break; + case nameof(IllustItem.Width): item.Width = reader.GetInt32(); break; + case nameof(IllustItem.Height): item.Height = reader.GetInt32(); break; + case nameof(IllustItem.PageCount): item.PageCount = reader.GetInt32(); break; + case nameof(IllustItem.ImageHeightValue): item.ImageHeightValue = reader.GetDouble(); break; + case nameof(IllustItem.YesRank): item.YesRank = reader.GetInt32(); break; + case nameof(IllustItem.RatingCount): item.RatingCount = reader.GetInt32(); break; + case nameof(IllustItem.ViewCount): item.ViewCount = reader.GetInt32(); break; + case nameof(IllustItem.UploadTimestamp): item.UploadTimestamp = reader.GetInt64(); break; + case nameof(IllustItem.IllustType): item.IllustType = (IllustType)reader.GetInt32(); break; + } + } + } + + throw new JsonException("unexpected favorite list ending"); + } + + public override void Write(Utf8JsonWriter writer, FavoriteList value, JsonSerializerOptions options) + { + writer.WriteStartArray(); + if (value != null) + { + for (var i = 0; i < value.Count; i++) + { + var item = value[i]; + writer.WriteStartObject(); + writer.WriteString(nameof(IllustItem.Title), item.Title); + writer.WriteString(nameof(IllustItem.Id), item.Id); + writer.WriteString(nameof(IllustItem.BookmarkId), item.BookmarkId); + writer.WriteString(nameof(IllustItem.FavoriteDateUtc), item.FavoriteDateUtc); + writer.WriteString(nameof(IllustItem.ImageUrl), item.ImageUrl); + writer.WriteBoolean(nameof(IllustItem.IsRestrict), item.IsRestrict); + if (item.Tags != null) + { + writer.WritePropertyName(nameof(IllustItem.Tags)); + writer.WriteStartArray(); + for (var n = 0; n < item.Tags.Length; n++) + { + writer.WriteStringValue(item.Tags[n]); + } + writer.WriteEndArray(); + } + writer.WriteString(nameof(IllustItem.ProfileUrl), item.ProfileUrl); + writer.WriteString(nameof(IllustItem.UserId), item.UserId); + writer.WriteString(nameof(IllustItem.UserName), item.UserName); + writer.WriteNumber(nameof(IllustItem.Width), item.Width); + writer.WriteNumber(nameof(IllustItem.Height), item.Height); + writer.WriteNumber(nameof(IllustItem.PageCount), item.PageCount); + writer.WriteNumber(nameof(IllustItem.ImageHeightValue), item.ImageHeightValue); + writer.WriteNumber(nameof(IllustItem.YesRank), item.YesRank); + writer.WriteNumber(nameof(IllustItem.RatingCount), item.RatingCount); + writer.WriteNumber(nameof(IllustItem.ViewCount), item.ViewCount); + writer.WriteNumber(nameof(IllustItem.UploadTimestamp), item.UploadTimestamp); + writer.WriteNumber(nameof(IllustItem.IllustType), (int)item.IllustType); + writer.WriteEndObject(); + } + } + writer.WriteEndArray(); + } + } + public enum SyncType { None = 0,