From 941a265045f46e353e2397e8f80d025974caa050 Mon Sep 17 00:00:00 2001 From: Guerra24 Date: Fri, 26 Jul 2024 17:01:07 -0600 Subject: [PATCH] Drop support for 0.9.0 and lower Add summary support Add tank api provider Add suggestion tags feature Reorganize archive's special tags --- LRReader.Shared/Models/Main/Archive.cs | 12 +- LRReader.Shared/Models/Main/Tags.cs | 19 +- LRReader.Shared/Models/Main/Tankoubons.cs | 31 ++ LRReader.Shared/Providers/ArchivesProvider.cs | 324 +++++++++--------- .../Providers/TankoubonsProvider.cs | 86 +++++ LRReader.Shared/Services/Api.cs | 12 +- LRReader.Shared/Services/Settings.cs | 20 ++ LRReader.Shared/Services/Updates.cs | 4 +- .../ViewModels/ArchiveEditViewModel.cs | 7 +- .../ViewModels/ArchivesPageViewModel.cs | 6 +- .../ViewModels/Base/ArchiveBaseViewModel.cs | 3 + .../ViewModels/SearchResultsViewModel.cs | 9 +- .../LRReader.UWP.Installer.csproj | 2 +- LRReader.UWP.Installer/packages.lock.json | 6 +- LRReader.UWP/Strings/en/Tabs.resw | 3 + LRReader.UWP/Strings/es/Tabs.resw | 3 + LRReader.UWP/Strings/ru/Tabs.resw | 3 + LRReader.UWP/Strings/zh-cn/Tabs.resw | 3 + .../Views/Content/Settings/General.xaml | 25 ++ .../Views/Content/Settings/Server.xaml | 5 +- LRReader.UWP/Views/Controls/ArchiveList.xaml | 19 +- .../Views/Controls/ArchiveList.xaml.cs | 7 +- .../Views/Tabs/Content/ArchiveEdit.xaml | 6 + .../Views/Tabs/Content/ArchiveTabContent.xaml | 23 +- .../Tabs/Content/ArchivesTabContent.xaml | 19 +- .../Tabs/Content/ArchivesTabContent.xaml.cs | 7 +- 26 files changed, 446 insertions(+), 218 deletions(-) create mode 100644 LRReader.Shared/Models/Main/Tankoubons.cs create mode 100644 LRReader.Shared/Providers/TankoubonsProvider.cs diff --git a/LRReader.Shared/Models/Main/Archive.cs b/LRReader.Shared/Models/Main/Archive.cs index 11e3f53..53d1825 100644 --- a/LRReader.Shared/Models/Main/Archive.cs +++ b/LRReader.Shared/Models/Main/Archive.cs @@ -22,19 +22,19 @@ public class Archive : IEquatable public string title { get; set; } = null!; public int pagecount { get; set; } public int progress { get; set; } - public long? lastreadtime { get; set; } // 0.9.0 + public long lastreadtime { get; set; } [JsonIgnore] - public string LastReadTimeString => lastreadtime == null ? "" : DateTimeOffset.FromUnixTimeSeconds((long)lastreadtime).ToLocalTime().ToString(); + public string LastReadTimeString => DateTimeOffset.FromUnixTimeSeconds(lastreadtime).ToLocalTime().ToString(); - public long? size { get; set; } // 0.9.10 + public long size { get; set; } [JsonIgnore] - public string SizeString => size == null ? "" : string.Format("{0:n2} MB", size / 1024f / 1024f); + public string SizeString => string.Format("{0:n2} MB", size / 1024f / 1024f); - public string? filename { get; set; } // 0.9.10 + public string filename { get; set; } = null!; - public string? summary { get; set; } // 0.9.10 + public string summary { get; set; } = null!; [JsonIgnore] public string TagsClean { get; set; } = null!; diff --git a/LRReader.Shared/Models/Main/Tags.cs b/LRReader.Shared/Models/Main/Tags.cs index 3e73b92..618842b 100644 --- a/LRReader.Shared/Models/Main/Tags.cs +++ b/LRReader.Shared/Models/Main/Tags.cs @@ -1,15 +1,10 @@ - -namespace LRReader.Shared.Models.Main +namespace LRReader.Shared.Models.Main; + +public class TagStats { - public class TagStats - { - public string @namespace { get; set; } = null!; - public string text { get; set; } = null!; - public int weight { get; set; } + public string @namespace { get; set; } = null!; + public string text { get; set; } = null!; + public int weight { get; set; } - public string GetNamespacedTag() - { - return string.IsNullOrEmpty(@namespace) ? text : @namespace + ":" + text; - } - } + public string GetNamespacedTag() => string.IsNullOrEmpty(@namespace) ? text : @namespace + ":" + text; } diff --git a/LRReader.Shared/Models/Main/Tankoubons.cs b/LRReader.Shared/Models/Main/Tankoubons.cs new file mode 100644 index 0000000..0981b04 --- /dev/null +++ b/LRReader.Shared/Models/Main/Tankoubons.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace LRReader.Shared.Models.Main +{ + public class Tankoubons + { + public List archives { get; set; } = null!; + public string id { get; set; } = null!; + public string name { get; set; } = null!; + public List? full_data { get; set; } + } + + public class TankoubonsList + { + public List result { get; set; } = null!; + public int filtered { get; set; } + public int total { get; set; } + } + + public class TankoubonsItem + { + public Tankoubons result { get; set; } = null!; + public int filtered { get; set; } + public int total { get; set; } + } + + public class ArchiveTankoubons : GenericApiResult + { + public List tankoubons { get; set; } = null!; + } +} diff --git a/LRReader.Shared/Providers/ArchivesProvider.cs b/LRReader.Shared/Providers/ArchivesProvider.cs index 81f7fb6..2e90e0e 100644 --- a/LRReader.Shared/Providers/ArchivesProvider.cs +++ b/LRReader.Shared/Providers/ArchivesProvider.cs @@ -9,223 +9,235 @@ using RestSharp; using static LRReader.Shared.Services.Service; -namespace LRReader.Shared.Providers +namespace LRReader.Shared.Providers; + +public static class ArchivesProvider { - public static class ArchivesProvider + + public static async Task Validate() { + var client = Api.Client; - public static async Task Validate() - { - var client = Api.Client; + var rq = new RestRequest("api/archives"); - var rq = new RestRequest("api/archives"); + var r = await client.ExecuteHeadAsync(rq); - var r = await client.ExecuteHeadAsync(rq); + if (r.StatusCode != HttpStatusCode.OK) + return false; - if (r.StatusCode != HttpStatusCode.OK) - return false; + //var decoded = GetArchives(); + //return decoded != null; + return true; + } - //var decoded = GetArchives(); - //return decoded != null; - return true; - } + public static async Task?> GetArchives() + { + var client = Api.Client; - public static async Task?> GetArchives() - { - var client = Api.Client; + var rq = new RestRequest("api/archives"); - var rq = new RestRequest("api/archives"); + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); - var r = await client.ExecuteGetAsync(rq); + return await r.GetResult>().ConfigureAwait(false); + } - return await r.GetResult>(); - } + public static async Task GetArchive(string id) + { + var client = Api.Client; - public static async Task GetArchive(string id) - { - var client = Api.Client; + var rq = new RestRequest("api/archives/{id}/metadata"); + rq.AddUrlSegment("id", id); - var rq = new RestRequest("api/archives/{id}/metadata"); - rq.AddUrlSegment("id", id); + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); - var r = await client.ExecuteGetAsync(rq); + return await r.GetResult().ConfigureAwait(false); + } - return await r.GetResult(); - } + public static async Task GetArchiveCategories(string id) + { + var client = Api.Client; - public static async Task GetArchiveCategories(string id) - { - var client = Api.Client; + var rq = new RestRequest("api/archives/{id}/categories"); + rq.AddUrlSegment("id", id); - var rq = new RestRequest("api/archives/{id}/categories"); - rq.AddUrlSegment("id", id); + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); - var r = await client.ExecuteGetAsync(rq); + return await r.GetResult().ConfigureAwait(false); + } - return await r.GetResult(); - } + public static async Task GetThumbnail(string id, bool noFallback = false, int page = 0) + { + var client = Api.Client; + + var rq = new RestRequest("api/archives/{id}/thumbnail"); + rq.AddUrlSegment("id", id); + rq.AddQueryParameter("no_fallback", noFallback.ToString().ToLower()); + rq.AddQueryParameter("page", page.ToString()); - public static async Task GetThumbnail(string id, bool noFallback = false, int page = 0) + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); + + switch (r.StatusCode) { - var client = Api.Client; - - var rq = new RestRequest("api/archives/{id}/thumbnail"); - rq.AddUrlSegment("id", id); - rq.AddQueryParameter("no_fallback", noFallback.ToString().ToLower()); - rq.AddQueryParameter("page", page.ToString()); - - var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); - - switch (r.StatusCode) - { - case HttpStatusCode.Accepted: - return new ThumbnailRequest { Job = await r.GetResult().ConfigureAwait(false) }; - case HttpStatusCode.OK: - return new ThumbnailRequest { Thumbnail = r.RawBytes }; - default: - return null; - } + case HttpStatusCode.Accepted: + return new ThumbnailRequest { Job = await r.GetResult().ConfigureAwait(false) }; + case HttpStatusCode.OK: + return new ThumbnailRequest { Thumbnail = r.RawBytes }; + default: + return null; } + } - public static async Task ExtractArchive(string id) - { - var client = Api.Client; + public static async Task ExtractArchive(string id) + { + var client = Api.Client; - var rq = new RestRequest("api/archives/{id}/files"); - rq.AddUrlSegment("id", id); + var rq = new RestRequest("api/archives/{id}/files"); + rq.AddUrlSegment("id", id); - var r = await client.ExecuteGetAsync(rq); + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); - return await r.GetResult(); - } + return await r.GetResult().ConfigureAwait(false); + } - public static async Task DownloadArchive(string id) - { - var client = Api.Client; + public static async Task DownloadArchive(string id) + { + var client = Api.Client; - var rq = new RestRequest("api/archives/{id}/download"); - rq.AddUrlSegment("id", id); + var rq = new RestRequest("api/archives/{id}/download"); + rq.AddUrlSegment("id", id); - var r = await client.ExecuteGetAsync(rq); + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); - if (!string.IsNullOrEmpty(r.ErrorMessage)) - { - WeakReferenceMessenger.Default.Send(new ShowNotification("Network Error", r.ErrorMessage, severity: NotificationSeverity.Error)); + if (!string.IsNullOrEmpty(r.ErrorMessage)) + { + WeakReferenceMessenger.Default.Send(new ShowNotification("Network Error", r.ErrorMessage, severity: NotificationSeverity.Error)); + return null; + } + switch (r.StatusCode) + { + case HttpStatusCode.OK: + var download = new DownloadPayload(); + var header = r.ContentHeaders.First(h => h.Name?.Equals("Content-Disposition") ?? false).Value as string; + var parms = header?.Split(';').Select(s => s.Trim()); + var natr = parms.First(s => s.StartsWith("filename")); + var nameAndType = natr.Substring(natr.IndexOf("\"") + 1, natr.Length - natr.IndexOf("\"") - 2); + + download.Data = r.RawBytes!; + download.Name = nameAndType.Substring(0, nameAndType.LastIndexOf(".")); + download.Type = nameAndType.Substring(nameAndType.LastIndexOf(".")); + return download; + default: + var error = await r.GetError(); + WeakReferenceMessenger.Default.Send(new ShowNotification(error.operation, error.error, severity: NotificationSeverity.Error)); return null; - } - switch (r.StatusCode) - { - case HttpStatusCode.OK: - var download = new DownloadPayload(); - var header = r.ContentHeaders.First(h => h.Name?.Equals("Content-Disposition") ?? false).Value as string; - var parms = header?.Split(';').Select(s => s.Trim()); - var natr = parms.First(s => s.StartsWith("filename")); - var nameAndType = natr.Substring(natr.IndexOf("\"") + 1, natr.Length - natr.IndexOf("\"") - 2); - - download.Data = r.RawBytes!; - download.Name = nameAndType.Substring(0, nameAndType.LastIndexOf(".")); - download.Type = nameAndType.Substring(nameAndType.LastIndexOf(".")); - return download; - default: - var error = await r.GetError(); - WeakReferenceMessenger.Default.Send(new ShowNotification(error.operation, error.error, severity: NotificationSeverity.Error)); - return null; - } } + } - public static async Task ChangeThumbnail(string id, int page) - { - var client = Api.Client; + public static async Task ChangeThumbnail(string id, int page) + { + var client = Api.Client; - var rq = new RestRequest("api/archives/{id}/thumbnail"); - rq.AddUrlSegment("id", id); - rq.AddQueryParameter("page", page); + var rq = new RestRequest("api/archives/{id}/thumbnail"); + rq.AddUrlSegment("id", id); + rq.AddQueryParameter("page", page); - var r = await client.ExecutePutAsync(rq); + var r = await client.ExecutePutAsync(rq).ConfigureAwait(false); - return await r.GetResult(); - } + return await r.GetResult().ConfigureAwait(false); + } - public static async Task ClearNewArchive(string id) - { - var client = Api.Client; + public static async Task ClearNewArchive(string id) + { + var client = Api.Client; - var rq = new RestRequest("api/archives/{id}/isnew"); - rq.AddUrlSegment("id", id); + var rq = new RestRequest("api/archives/{id}/isnew"); + rq.AddUrlSegment("id", id); - var r = await client.ExecuteDeleteAsync(rq); + var r = await client.ExecuteDeleteAsync(rq).ConfigureAwait(false); - return await r.GetResult(); - } + return await r.GetResult().ConfigureAwait(false); + } - public static async Task UpdateArchive(string id, string title = "", string tags = "") - { - var client = Api.Client; + public static async Task UpdateArchive(string id, string title = "", string tags = "", string summary = "") + { + var client = Api.Client; - var rq = new RestRequest("api/archives/{id}/metadata"); - rq.AddUrlSegment("id", id); - rq.AddQueryParameter("title", title); - rq.AddQueryParameter("tags", tags); + var rq = new RestRequest("api/archives/{id}/metadata"); + rq.AddUrlSegment("id", id); + rq.AddQueryParameter("title", title); + rq.AddQueryParameter("tags", tags); + rq.AddQueryParameter("summary", summary); - var r = await client.ExecutePutAsync(rq); + var r = await client.ExecutePutAsync(rq).ConfigureAwait(false); - return await r.GetResult(); - } + return await r.GetResult().ConfigureAwait(false); + } - public static async Task DeleteArchive(string id) - { - var client = Api.Client; + public static async Task DeleteArchive(string id) + { + var client = Api.Client; - var rq = new RestRequest("api/archives/{id}"); - rq.AddUrlSegment("id", id); + var rq = new RestRequest("api/archives/{id}"); + rq.AddUrlSegment("id", id); - var r = await client.ExecuteDeleteAsync(rq); + var r = await client.ExecuteDeleteAsync(rq).ConfigureAwait(false); - return await r.GetResult(); - } + return await r.GetResult().ConfigureAwait(false); + } + + public static async Task GetImage(string path) + { + if (string.IsNullOrEmpty(path)) + return null; + var client = Api.Client; + + var rq = new RestRequest(path); - public static async Task GetImage(string path) + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); + + switch (r.StatusCode) { - if (string.IsNullOrEmpty(path)) + case HttpStatusCode.OK: + return r.RawBytes; + default: return null; - var client = Api.Client; + } + } - var rq = new RestRequest(path); + public static async Task UpdateProgress(string id, int progress) + { + var client = Api.Client; - var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); + var rq = new RestRequest("api/archives/{id}/progress/{progress}"); + rq.AddUrlSegment("id", id); + rq.AddParameter("progress", progress, ParameterType.UrlSegment); - switch (r.StatusCode) - { - case HttpStatusCode.OK: - return r.RawBytes; - default: - return null; - } - } + var r = await client.ExecutePutAsync(rq).ConfigureAwait(false); - public static async Task UpdateProgress(string id, int progress) - { - var client = Api.Client; + return await r.GetResult().ConfigureAwait(false); + } - var rq = new RestRequest("api/archives/{id}/progress/{progress}"); - rq.AddUrlSegment("id", id); - rq.AddParameter("progress", progress, ParameterType.UrlSegment); + public static async Task RegenerateThumbnails(bool force = false) + { + var client = Api.Client; - var r = await client.ExecutePutAsync(rq); + var rq = new RestRequest("api/regen_thumbs"); + rq.AddQueryParameter("force", (force ? 1 : 0).ToString()); - return await r.GetResult(); - } + var r = await client.ExecutePostAsync(rq).ConfigureAwait(false); - public static async Task RegenerateThumbnails(bool force = false) - { - var client = Api.Client; + return await r.GetResult().ConfigureAwait(false); + } + + public static async Task GetTankoubons(string id) + { + var client = Api.Client; - var rq = new RestRequest("api/regen_thumbs"); - rq.AddQueryParameter("force", (force ? 1 : 0).ToString()); + var rq = new RestRequest("api/archives/{id}/tankoubons"); + rq.AddUrlSegment("id", id); - var r = await client.ExecutePostAsync(rq); + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); - return await r.GetResult(); - } + return await r.GetResult().ConfigureAwait(false); } } diff --git a/LRReader.Shared/Providers/TankoubonsProvider.cs b/LRReader.Shared/Providers/TankoubonsProvider.cs new file mode 100644 index 0000000..2da54b5 --- /dev/null +++ b/LRReader.Shared/Providers/TankoubonsProvider.cs @@ -0,0 +1,86 @@ +using System.Threading.Tasks; +using LRReader.Shared.Models.Main; +using RestSharp; +using static LRReader.Shared.Services.Service; + +namespace LRReader.Shared.Providers; + +public static class TankoubonsProvider +{ + + public static async Task GetTankoubons(int page = 0) + { + var client = Api.Client; + + var rq = new RestRequest("api/tankoubons"); + rq.AddQueryParameter("page", page.ToString()); + + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); + + return await r.GetResult().ConfigureAwait(false); + } + + public static async Task GetTankoubon(string id, int page = 0) + { + var client = Api.Client; + + var rq = new RestRequest("api/tankoubons/{id}"); + rq.AddUrlSegment("id", id); + rq.AddQueryParameter("include_full_data", "0"); + rq.AddQueryParameter("page", page.ToString()); + + var r = await client.ExecuteGetAsync(rq).ConfigureAwait(false); + + return await r.GetResult().ConfigureAwait(false); + } + + public static async Task CreateTankoubon(string name) + { + var client = Api.Client; + + var rq = new RestRequest("api/tankoubons"); + rq.AddQueryParameter("name", name); + + var r = await client.ExecutePutAsync(rq).ConfigureAwait(false); + + return await r.GetResult().ConfigureAwait(false); + } + + public static async Task AddArchive(string id, string archive) + { + var client = Api.Client; + + var rq = new RestRequest("api/tankoubons/{id}/{archive}"); + rq.AddUrlSegment("id", id); + rq.AddUrlSegment("archive", archive); + + var r = await client.ExecutePutAsync(rq).ConfigureAwait(false); + + return await r.GetResult().ConfigureAwait(false); + } + + public static async Task RemoveArchive(string id, string archive) + { + var client = Api.Client; + + var rq = new RestRequest("api/tankoubons/{id}/{archive}"); + rq.AddUrlSegment("id", id); + rq.AddUrlSegment("archive", archive); + + var r = await client.ExecuteDeleteAsync(rq).ConfigureAwait(false); + + return await r.GetResult().ConfigureAwait(false); + } + + public static async Task DeleteTankoubon(string id, string archive) + { + var client = Api.Client; + + var rq = new RestRequest("api/tankoubons/{id}"); + rq.AddUrlSegment("id", id); + + var r = await client.ExecuteDeleteAsync(rq).ConfigureAwait(false); + + return await r.GetResult().ConfigureAwait(false); + } +} diff --git a/LRReader.Shared/Services/Api.cs b/LRReader.Shared/Services/Api.cs index 1b1bba8..42f4d26 100644 --- a/LRReader.Shared/Services/Api.cs +++ b/LRReader.Shared/Services/Api.cs @@ -89,21 +89,11 @@ public class ControlFlags { public bool ProgressTracking = false; - public bool V085; - public bool V088; - public bool V0881; - public bool BrokenCache; - public bool V085Edit => V085 & Service.Settings.Profile.HasApiKey; - public void Check(ServerInfo serverInfo) { - V085 = serverInfo.version >= new Version(0, 8, 5); - V088 = serverInfo.version >= new Version(0, 8, 8); - V0881 = serverInfo.version == new Version(0, 8, 81); - - BrokenCache = V088 || V0881; + BrokenCache = true; ProgressTracking = serverInfo.server_tracks_progress; } diff --git a/LRReader.Shared/Services/Settings.cs b/LRReader.Shared/Services/Settings.cs index aaef233..3a5fed7 100644 --- a/LRReader.Shared/Services/Settings.cs +++ b/LRReader.Shared/Services/Settings.cs @@ -293,6 +293,26 @@ public bool ShowMap set => SettingsStorage.StoreObjectRoamed(value); } + public int MaxSuggestedTags + { + get => SettingsStorage.GetObjectRoamed(25); + set + { + SettingsStorage.StoreObjectRoamed(value); + OnPropertyChanged(); + } + } + + public bool ShowSuggestedTags + { + get => SettingsStorage.GetObjectRoamed(false); + set + { + SettingsStorage.StoreObjectRoamed(value); + OnPropertyChanged(); + } + } + public static readonly int CurrentLocalVersion = 4; public int SettingsVersionLocal { diff --git a/LRReader.Shared/Services/Updates.cs b/LRReader.Shared/Services/Updates.cs index 5714376..3309a8f 100644 --- a/LRReader.Shared/Services/Updates.cs +++ b/LRReader.Shared/Services/Updates.cs @@ -13,8 +13,8 @@ public abstract class UpdatesService protected readonly ISettingsStorageService SettingsStorage; protected readonly SettingsService Settings; - public Version MIN_VERSION = new Version(0, 8, 4); - public Version MAX_VERSION = new Version(0, 9, 10); + public Version MIN_VERSION = new Version(0, 9, 10); + public Version MAX_VERSION = new Version(0, 9, 21); protected readonly RestClient client; diff --git a/LRReader.Shared/ViewModels/ArchiveEditViewModel.cs b/LRReader.Shared/ViewModels/ArchiveEditViewModel.cs index 84998d8..08ed6e0 100644 --- a/LRReader.Shared/ViewModels/ArchiveEditViewModel.cs +++ b/LRReader.Shared/ViewModels/ArchiveEditViewModel.cs @@ -35,6 +35,8 @@ public partial class ArchiveEditViewModel : ObservableObject [ObservableProperty] private string _title = ""; [ObservableProperty] + private string _summary = ""; + [ObservableProperty] private string _tags = ""; [ObservableProperty] private object? _thumbnail; @@ -83,6 +85,7 @@ public async Task LoadArchive(Archive archive) { Archive = archive; Title = archive.title; + Summary = archive.summary; ReloadTagsList(archive.tags); await Hide.InvokeAsync(false); @@ -101,6 +104,7 @@ private async Task ReloadArchive() if (result != null) { Title = result.title; + Summary = result.summary; ReloadTagsList(result.tags); Thumbnail = await ImageProcessing.ByteToBitmap(await Images.GetThumbnailCached(Archive.arcid), decodeHeight: 275); } @@ -136,10 +140,11 @@ private async Task SaveArchive() tags = Tags; else tags = BuildTags(); - var result = await ArchivesProvider.UpdateArchive(Archive.arcid, Title, tags); + var result = await ArchivesProvider.UpdateArchive(Archive.arcid, Title, tags, Summary); if (result) { Archive.title = Title; + Archive.summary = Summary; Archive.tags = tags; Archive.UpdateTags(); if (UseTextTags) diff --git a/LRReader.Shared/ViewModels/ArchivesPageViewModel.cs b/LRReader.Shared/ViewModels/ArchivesPageViewModel.cs index 12fbf17..64e24d1 100644 --- a/LRReader.Shared/ViewModels/ArchivesPageViewModel.cs +++ b/LRReader.Shared/ViewModels/ArchivesPageViewModel.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Linq; +using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using LRReader.Shared.Messages; using LRReader.Shared.Services; @@ -48,6 +49,9 @@ public void LoadBookmarks() SortBy.Add(n); SortByIndex = SortBy.IndexOf(Settings.SortByDefault); OrderBy = Settings.OrderByDefault; + SuggestedTags.Clear(); + foreach (var tag in Archives.TagStats.OrderByDescending(t => t.weight).Take(Settings.MaxSuggestedTags).ToList()) + SuggestedTags.Add(tag.GetNamespacedTag()); if (Settings.OpenBookmarksStart && Archives.Archives.Count > 0) foreach (var b in Settings.Profile.Bookmarks) { diff --git a/LRReader.Shared/ViewModels/Base/ArchiveBaseViewModel.cs b/LRReader.Shared/ViewModels/Base/ArchiveBaseViewModel.cs index 4d15fa0..7420470 100644 --- a/LRReader.Shared/ViewModels/Base/ArchiveBaseViewModel.cs +++ b/LRReader.Shared/ViewModels/Base/ArchiveBaseViewModel.cs @@ -165,6 +165,9 @@ public async Task LoadArchive() Archive.progress = result.progress; Archive.extension = result.extension; Archive.lastreadtime = result.lastreadtime; + Archive.size = result.size; + Archive.filename = result.filename; + Archive.summary = result.summary; Archive.UpdateTags(); OnPropertyChanged("Archive"); } diff --git a/LRReader.Shared/ViewModels/SearchResultsViewModel.cs b/LRReader.Shared/ViewModels/SearchResultsViewModel.cs index 280a547..bd35a55 100644 --- a/LRReader.Shared/ViewModels/SearchResultsViewModel.cs +++ b/LRReader.Shared/ViewModels/SearchResultsViewModel.cs @@ -28,7 +28,7 @@ public partial class SearchResultsViewModel : ObservableObject, IRecipient ArchiveList { get; } = new ObservableCollection(); + public ObservableCollection ArchiveList { get; } = new(); [ObservableProperty] private int _page = 0; [ObservableProperty] @@ -53,11 +53,12 @@ public bool ControlsEnabled set => SetProperty(ref _controlsEnabled, value); } protected bool _internalLoadingArchives; - public ObservableCollection Suggestions = new ObservableCollection(); - public ObservableCollection SortBy = new ObservableCollection(); + public ObservableCollection Suggestions = new(); + public ObservableCollection SortBy = new(); [ObservableProperty] private int _sortByIndex = -1; public Order OrderBy = Order.Ascending; + public ObservableCollection SuggestedTags = new(); public SearchResultsViewModel(SettingsService settings, ArchivesService archives, IDispatcherService dispatcher, ApiService api) { @@ -70,6 +71,8 @@ public SearchResultsViewModel(SettingsService settings, ArchivesService archives SortBy.Add(n); SortByIndex = _sortByIndex = SortBy.IndexOf(Settings.SortByDefault); OrderBy = Settings.OrderByDefault; + foreach (var tag in Archives.TagStats.OrderByDescending(t => t.weight).Take(Settings.MaxSuggestedTags).ToList()) + SuggestedTags.Add(tag.GetNamespacedTag()); WeakReferenceMessenger.Default.Register(this); } diff --git a/LRReader.UWP.Installer/LRReader.UWP.Installer.csproj b/LRReader.UWP.Installer/LRReader.UWP.Installer.csproj index adce8fd..d61cd90 100644 --- a/LRReader.UWP.Installer/LRReader.UWP.Installer.csproj +++ b/LRReader.UWP.Installer/LRReader.UWP.Installer.csproj @@ -38,7 +38,7 @@ - 3.0.4 + 3.0.5 diff --git a/LRReader.UWP.Installer/packages.lock.json b/LRReader.UWP.Installer/packages.lock.json index ea0707f..e7c9ebe 100644 --- a/LRReader.UWP.Installer/packages.lock.json +++ b/LRReader.UWP.Installer/packages.lock.json @@ -31,9 +31,9 @@ }, "WPF-UI": { "type": "Direct", - "requested": "[3.0.4, )", - "resolved": "3.0.4", - "contentHash": "Jbt8nJ4MSC/WBhqx6iXOW06Rt2UUNVxA8+23AOSM63jlOIhU6e6P4BIw8rL/UnRPycOdA2vntYl5i7k53E0AGg==" + "requested": "[3.0.5, )", + "resolved": "3.0.5", + "contentHash": "vha596eFVZ0j/zjpPrYxqaBNZzr17ROOihQ/xqgTVPMx5cmHAVKPulbaUmHKXo0QHGkqvwaPNxYH/HTS/UroTQ==" }, "Microsoft.NETCore.Platforms": { "type": "Transitive", diff --git a/LRReader.UWP/Strings/en/Tabs.resw b/LRReader.UWP/Strings/en/Tabs.resw index 0097141..8fcb2fb 100644 --- a/LRReader.UWP/Strings/en/Tabs.resw +++ b/LRReader.UWP/Strings/en/Tabs.resw @@ -234,6 +234,9 @@ Save + + Summary + Tags diff --git a/LRReader.UWP/Strings/es/Tabs.resw b/LRReader.UWP/Strings/es/Tabs.resw index 2dcadee..85bc0b9 100644 --- a/LRReader.UWP/Strings/es/Tabs.resw +++ b/LRReader.UWP/Strings/es/Tabs.resw @@ -234,6 +234,9 @@ Guardar + + Resumen + Etiquetas diff --git a/LRReader.UWP/Strings/ru/Tabs.resw b/LRReader.UWP/Strings/ru/Tabs.resw index 85521b1..e526a07 100644 --- a/LRReader.UWP/Strings/ru/Tabs.resw +++ b/LRReader.UWP/Strings/ru/Tabs.resw @@ -234,6 +234,9 @@ Сохранить + + Summary + Теги diff --git a/LRReader.UWP/Strings/zh-cn/Tabs.resw b/LRReader.UWP/Strings/zh-cn/Tabs.resw index b13aa17..0bc46e9 100644 --- a/LRReader.UWP/Strings/zh-cn/Tabs.resw +++ b/LRReader.UWP/Strings/zh-cn/Tabs.resw @@ -234,6 +234,9 @@ 保存 + + Summary + 标签 diff --git a/LRReader.UWP/Views/Content/Settings/General.xaml b/LRReader.UWP/Views/Content/Settings/General.xaml index d06252e..e48d16b 100644 --- a/LRReader.UWP/Views/Content/Settings/General.xaml +++ b/LRReader.UWP/Views/Content/Settings/General.xaml @@ -54,6 +54,31 @@ + + + + + + + + + + + + + + + + + diff --git a/LRReader.UWP/Views/Content/Settings/Server.xaml b/LRReader.UWP/Views/Content/Settings/Server.xaml index adc1024..2fefaf9 100644 --- a/LRReader.UWP/Views/Content/Settings/Server.xaml +++ b/LRReader.UWP/Views/Content/Settings/Server.xaml @@ -6,7 +6,6 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:muxc="using:Microsoft.UI.Xaml.Controls" - xmlns:services="using:LRReader.Shared.Services" xmlns:tools="using:LRReader.UWP.Views.Content.Tools" xmlns:content="using:LRReader.UWP.Views.Content" DataContext="{Binding SettingsPageInstance, Source={StaticResource Locator}}" @@ -155,8 +154,8 @@