2021-08-10 17:17:32 +08:00

64 lines
2.3 KiB
C#

using System;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Gallery.Util;
using Gallery.Util.Interface;
using Gallery.Util.Model;
using Xamarin.Forms;
namespace Gallery.Danbooru
{
public class GallerySource : IGallerySource
{
public string Name => "Danbooru";
public string Route => "danbooru";
public string FlyoutIconKey => "Danbooru";
public string HomePage => "https://danbooru.donmai.us";
public async Task<GalleryItem[]> GetRecentItemsAsync(int page)
{
var url = $"https://danbooru.donmai.us/posts?page={page}";
var (result, error) = await NetHelper.RequestObject<GalleryItem[]>(url, contentHandler: ContentHandler);
if (result == null || !string.IsNullOrEmpty(error))
{
Log.Error("danbooru.content.load", $"failed to load content array, error: {error}");
return null;
}
return result;
}
private string ContentHandler(string content)
{
var regex = new Regex(@"<article id=""post_\d+"".+?data-id=""(\d+)"".+?data-tags=""([^""]+?)"".+?data-width=""(\d+?)"" data-height=""(\d+?)"".+?data-source=""([^""]+?)"" data-uploader-id=""(\d+?)"" data-normalized-source=""([^""]+?)"".+?data-file-url=""([^""]+?)"".+?data-preview-file-url=""([^""]+?)""", RegexOptions.Multiline);
var matches = regex.Matches(content);
var array = new string[matches.Count];
for (var i = 0; i < array.Length; i++)
{
var g = matches[i].Groups;
var tags = g[2].Value.Replace(" ", "\",\"");
array[i] = $"{{\"Id\":{g[0].Value},\"Tags\":[\"{tags}\"]}}";
}
return $"[{string.Join(',', array)}]";
}
public void SetCookie()
{
throw new NotImplementedException();
}
public void InitDynamicResources(string family, ResourceDictionary light, ResourceDictionary dark)
{
var icon = new FontImageSource
{
FontFamily = family,
Glyph = "\uf5d2",
Size = 18.0
};
light.Add(FlyoutIconKey, icon);
dark.Add(FlyoutIconKey, icon);
}
}
}