diff --git a/Gallery.Share/App.cs b/Gallery.Share/App.cs index 7f5e265..a9e4dc0 100644 --- a/Gallery.Share/App.cs +++ b/Gallery.Share/App.cs @@ -15,6 +15,7 @@ namespace Gallery public static AppTheme CurrentTheme { get; private set; } public static PlatformCulture CurrentCulture { get; private set; } + public static Dictionary RefreshTimes { get; } = new(); public static List GallerySources { get; } = new() { new Yandere.GallerySource(), // https://yande.re diff --git a/Gallery.Share/Resources/UI/GalleryCollectionPage.cs b/Gallery.Share/Resources/UI/GalleryCollectionPage.cs index 06202ac..02f254f 100644 --- a/Gallery.Share/Resources/UI/GalleryCollectionPage.cs +++ b/Gallery.Share/Resources/UI/GalleryCollectionPage.cs @@ -12,12 +12,7 @@ namespace Gallery.Resources.UI { public abstract class GalleryCollectionPage : GalleryScrollableCollectionPage { - protected readonly IGallerySource source; - - public GalleryCollectionPage(IGallerySource source) - { - this.source = source; - } + public GalleryCollectionPage(IGallerySource source) : base(source) { } } public interface IGalleryCollectionPage @@ -59,15 +54,46 @@ namespace Gallery.Resources.UI set => SetValue(IsBottomLoadingProperty, value); } + public IGallerySource Source { get; } public GalleryCollection GalleryCollection { get; set; } + public DateTime LastUpdated + { + get + { + if (App.RefreshTimes.TryGetValue(Source.Route, out var time)) + { +#if DEBUG + Log.Print($"get last updated time for: {Source.Route}, {time}"); +#endif + return time; + } +#if DEBUG + Log.Print($"cannot get last updated time for: {Source.Route}"); +#endif + return default; + } + set + { +#if DEBUG + Log.Print($"set last updated time for: {Source.Route} to {value}"); +#endif + App.RefreshTimes[Source.Route] = value; + } + } protected virtual ActivityIndicator LoadingIndicator => null; protected virtual double IndicatorMarginTop => 16; - protected bool Expired => lastUpdated == default || (DateTime.Now - lastUpdated).TotalMinutes > EXPIRED_MINUTES; + protected bool Expired + { + get + { + var lastUpdated = LastUpdated; + return lastUpdated == default || (DateTime.Now - lastUpdated).TotalMinutes > EXPIRED_MINUTES; + } + } protected readonly Command commandGalleryItemTapped; - protected DateTime lastUpdated; protected double topOffset; protected string lastError; @@ -75,8 +101,9 @@ namespace Gallery.Resources.UI private readonly Stack tasks = new(); private T galleryData; - public GalleryCollectionPage() + public GalleryCollectionPage(IGallerySource source) { + Source = source; commandGalleryItemTapped = new Command(OnGalleryItemTapped); } @@ -107,14 +134,14 @@ namespace Gallery.Resources.UI } InvalidateCollection(); Gallery = null; - lastUpdated = default; + LastUpdated = default; } protected override void OnAppearing() { base.OnAppearing(); - if (lastUpdated == default) + if (Expired) { StartLoading(); } @@ -391,9 +418,9 @@ namespace Gallery.Resources.UI Log.Error("gallery.load", "failed to load gallery data."); return; } - if (force) + if (force || Expired) { - lastUpdated = DateTime.Now; + LastUpdated = DateTime.Now; } var data = DoGetGalleryList(galleryData, out int tag).Where(i => i != null); @@ -469,6 +496,8 @@ namespace Gallery.Resources.UI private double lastRefreshY = double.MinValue; private double offset; + public GalleryScrollableCollectionPage(IGallerySource source) : base(source) { } + protected bool IsScrollingDown(double y) { if (y > lastScrollY) diff --git a/Gallery.Share/Views/GalleryPage.xaml.cs b/Gallery.Share/Views/GalleryPage.xaml.cs index f50d684..658d47b 100644 --- a/Gallery.Share/Views/GalleryPage.xaml.cs +++ b/Gallery.Share/Views/GalleryPage.xaml.cs @@ -33,7 +33,7 @@ namespace Gallery.Views protected override async Task DoloadGalleryData(bool force) { - var result = await source.GetRecentItemsAsync(currentPage); + var result = await Source.GetRecentItemsAsync(currentPage); return result; } diff --git a/Gallery.Util/Converter.cs b/Gallery.Util/Converter.cs index 2c8bd0b..f61d48c 100644 --- a/Gallery.Util/Converter.cs +++ b/Gallery.Util/Converter.cs @@ -55,6 +55,8 @@ namespace Gallery.Util case nameof(GalleryItem.RawUrl): item.RawUrl = reader.GetString(); break; case nameof(GalleryItem.Width): item.Width = reader.GetInt32(); break; case nameof(GalleryItem.Height): item.Height = reader.GetInt32(); break; + case nameof(GalleryItem.BookmarkId): item.BookmarkId = reader.GetString(); break; + case nameof(GalleryItem.IsRawPage): item.IsRawPage = reader.GetBoolean(); break; } } } @@ -91,6 +93,8 @@ namespace Gallery.Util writer.WriteString(nameof(GalleryItem.RawUrl), value.RawUrl); writer.WriteNumber(nameof(GalleryItem.Width), value.Width); writer.WriteNumber(nameof(GalleryItem.Height), value.Height); + writer.WriteString(nameof(GalleryItem.BookmarkId), value.BookmarkId); + writer.WriteBoolean(nameof(GalleryItem.IsRawPage), value.IsRawPage); writer.WriteEndObject(); } diff --git a/Gallery.Util/Gallery.Util.csproj b/Gallery.Util/Gallery.Util.csproj index 228032b..6d01bdc 100644 --- a/Gallery.Util/Gallery.Util.csproj +++ b/Gallery.Util/Gallery.Util.csproj @@ -2,7 +2,6 @@ netstandard2.1 - true ..\Ref\Tsanie.snk diff --git a/Gallery.Util/Model/GalleryItem.cs b/Gallery.Util/Model/GalleryItem.cs index 9de299b..c6818ce 100644 --- a/Gallery.Util/Model/GalleryItem.cs +++ b/Gallery.Util/Model/GalleryItem.cs @@ -19,31 +19,26 @@ namespace Gallery.Util.Model public static readonly BindableProperty IsFavoriteProperty = BindableProperty.Create(nameof(IsFavorite), typeof(bool), typeof(GalleryItem)); public static readonly BindableProperty BookmarkIdProperty = BindableProperty.Create(nameof(BookmarkId), typeof(string), typeof(GalleryItem)); - [JsonIgnore] public string TagDescription { get => (string)GetValue(TagDescriptionProperty); set => SetValue(TagDescriptionProperty, value); } - [JsonIgnore] public ImageSource PreviewImage { get => (ImageSource)GetValue(PreviewImageProperty); set => SetValue(PreviewImageProperty, value); } - [JsonIgnore] public GridLength ImageHeight { get => (GridLength)GetValue(ImageHeightProperty); set => SetValue(ImageHeightProperty, value); } - [JsonIgnore] public bool IsFavorite { get => (bool)GetValue(IsFavoriteProperty); set => SetValue(IsFavoriteProperty, value); } - [JsonIgnore] public string BookmarkId { get => (string)GetValue(BookmarkIdProperty); @@ -75,6 +70,7 @@ namespace Gallery.Util.Model public string Source { get; set; } public string PreviewUrl { get; set; } public string RawUrl { get; set; } + public bool IsRawPage { get; set; } private int width; private int height; diff --git a/GallerySources/Gallery.Danbooru/GallerySource.cs b/GallerySources/Gallery.Danbooru/GallerySource.cs index 23135df..a371a5f 100644 --- a/GallerySources/Gallery.Danbooru/GallerySource.cs +++ b/GallerySources/Gallery.Danbooru/GallerySource.cs @@ -18,7 +18,7 @@ namespace Gallery.Danbooru public async Task GetRecentItemsAsync(int page) { var url = $"https://danbooru.donmai.us/posts?page={page}"; - var (result, error) = await NetHelper.RequestObject(url, contentHandler: ContentHandler); + var (result, error) = await NetHelper.RequestObject(url, @return: content => ResolveGalleryItems(content)); if (result == null || !string.IsNullOrEmpty(error)) { @@ -29,18 +29,30 @@ namespace Gallery.Danbooru return result; } - private string ContentHandler(string content) + private GalleryItem[] ResolveGalleryItems(string content) { - var regex = new Regex(@"
"Gelbooru"; public string HomePage => "https://gelbooru.com"; - public Task GetRecentItemsAsync(int page) + public async Task GetRecentItemsAsync(int page) { - throw new NotImplementedException(); + var offset = (page - 1) * 42; + var url = $"https://gelbooru.com/index.php?page=post&s=list&tags=all&pid={offset}"; + var (result, error) = await NetHelper.RequestObject(url, @return: content => ResolveGalleryItems(content)); + + if (result == null || !string.IsNullOrEmpty(error)) + { + Log.Error("gelbooru.content.load", $"failed to load content array, error: {error}"); + return null; + } + + return result; + } + + private GalleryItem[] ResolveGalleryItems(string content) + { + var regex = new Regex( + @"(.|\n)+?