UX Pass 4 (#3120)
Co-authored-by: Robbie Davis <robbie@therobbiedavis.com>
This commit is contained in:
parent
7ca523adef
commit
38fc8e9110
103 changed files with 1643 additions and 1079 deletions
|
@ -67,6 +67,7 @@ public interface IImageService
|
|||
Task<string> ConvertToEncodingFormat(string filePath, string outputPath, EncodeFormat encodeFormat);
|
||||
Task<bool> IsImage(string filePath);
|
||||
Task<string> DownloadFaviconAsync(string url, EncodeFormat encodeFormat);
|
||||
Task<string> DownloadPublisherImageAsync(string publisherName, EncodeFormat encodeFormat);
|
||||
void UpdateColorScape(IHasCoverImage entity);
|
||||
}
|
||||
|
||||
|
@ -380,7 +381,7 @@ public class ImageService : IImageService
|
|||
{
|
||||
if (string.IsNullOrEmpty(correctSizeLink))
|
||||
{
|
||||
correctSizeLink = FallbackToKavitaReaderFavicon(baseUrl);
|
||||
correctSizeLink = await FallbackToKavitaReaderFavicon(baseUrl);
|
||||
}
|
||||
if (string.IsNullOrEmpty(correctSizeLink))
|
||||
{
|
||||
|
@ -424,11 +425,57 @@ public class ImageService : IImageService
|
|||
}
|
||||
|
||||
|
||||
_logger.LogDebug("Favicon.png for {Domain} downloaded and saved successfully", domain);
|
||||
_logger.LogDebug("Favicon for {Domain} downloaded and saved successfully", domain);
|
||||
return filename;
|
||||
} catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error downloading favicon.png for {Domain}", domain);
|
||||
_logger.LogError(ex, "Error downloading favicon for {Domain}", domain);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string> DownloadPublisherImageAsync(string publisherName, EncodeFormat encodeFormat)
|
||||
{
|
||||
try
|
||||
{
|
||||
var publisherLink = await FallbackToKavitaReaderPublisher(publisherName);
|
||||
if (string.IsNullOrEmpty(publisherLink))
|
||||
{
|
||||
throw new KavitaException($"Could not grab publisher image for {publisherName}");
|
||||
}
|
||||
|
||||
var finalUrl = publisherLink;
|
||||
|
||||
_logger.LogTrace("Fetching publisher image from {Url}", finalUrl);
|
||||
// Download the favicon.ico file using Flurl
|
||||
var publisherStream = await finalUrl
|
||||
.AllowHttpStatus("2xx,304")
|
||||
.GetStreamAsync();
|
||||
|
||||
// Create the destination file path
|
||||
using var image = Image.PngloadStream(publisherStream);
|
||||
var filename = GetPublisherFormat(publisherName, encodeFormat);
|
||||
switch (encodeFormat)
|
||||
{
|
||||
case EncodeFormat.PNG:
|
||||
image.Pngsave(Path.Combine(_directoryService.PublisherDirectory, filename));
|
||||
break;
|
||||
case EncodeFormat.WEBP:
|
||||
image.Webpsave(Path.Combine(_directoryService.PublisherDirectory, filename));
|
||||
break;
|
||||
case EncodeFormat.AVIF:
|
||||
image.Heifsave(Path.Combine(_directoryService.PublisherDirectory, filename));
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(encodeFormat), encodeFormat, null);
|
||||
}
|
||||
|
||||
|
||||
_logger.LogDebug("Publisher image for {PublisherName} downloaded and saved successfully", publisherName);
|
||||
return filename;
|
||||
} catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error downloading image for {PublisherName}", publisherName);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
@ -565,18 +612,12 @@ public class ImageService : IImageService
|
|||
return centroids;
|
||||
}
|
||||
|
||||
// public static Vector3 GetComplementaryColor(Vector3 color)
|
||||
// {
|
||||
// // Simple complementary color calculation
|
||||
// return new Vector3(255 - color.X, 255 - color.Y, 255 - color.Z);
|
||||
// }
|
||||
|
||||
public static List<Vector3> SortByBrightness(List<Vector3> colors)
|
||||
{
|
||||
return colors.OrderBy(c => 0.299 * c.X + 0.587 * c.Y + 0.114 * c.Z).ToList();
|
||||
}
|
||||
|
||||
public static List<Vector3> SortByVibrancy(List<Vector3> colors)
|
||||
private static List<Vector3> SortByVibrancy(List<Vector3> colors)
|
||||
{
|
||||
return colors.OrderByDescending(c =>
|
||||
{
|
||||
|
@ -686,10 +727,10 @@ public class ImageService : IImageService
|
|||
};
|
||||
}
|
||||
|
||||
private static string FallbackToKavitaReaderFavicon(string baseUrl)
|
||||
private static async Task<string> FallbackToKavitaReaderFavicon(string baseUrl)
|
||||
{
|
||||
var correctSizeLink = string.Empty;
|
||||
var allOverrides = "https://kavitareader.com/assets/favicons/urls.txt".GetStringAsync().Result;
|
||||
var allOverrides = await "https://www.kavitareader.com/assets/favicons/urls.txt".GetStringAsync();
|
||||
if (!string.IsNullOrEmpty(allOverrides))
|
||||
{
|
||||
var cleanedBaseUrl = baseUrl.Replace("https://", string.Empty);
|
||||
|
@ -699,17 +740,51 @@ public class ImageService : IImageService
|
|||
cleanedBaseUrl.Equals(url.Replace(".png", string.Empty)) ||
|
||||
cleanedBaseUrl.Replace("www.", string.Empty).Equals(url.Replace(".png", string.Empty)
|
||||
));
|
||||
|
||||
if (string.IsNullOrEmpty(externalFile))
|
||||
{
|
||||
throw new KavitaException($"Could not grab favicon from {baseUrl}");
|
||||
}
|
||||
|
||||
correctSizeLink = "https://kavitareader.com/assets/favicons/" + externalFile;
|
||||
correctSizeLink = "https://www.kavitareader.com/assets/favicons/" + externalFile;
|
||||
}
|
||||
|
||||
return correctSizeLink;
|
||||
}
|
||||
|
||||
private static async Task<string> FallbackToKavitaReaderPublisher(string publisherName)
|
||||
{
|
||||
var externalLink = string.Empty;
|
||||
var allOverrides = await "https://www.kavitareader.com/assets/publishers/publishers.txt".GetStringAsync();
|
||||
if (!string.IsNullOrEmpty(allOverrides))
|
||||
{
|
||||
var externalFile = allOverrides
|
||||
.Split("\n")
|
||||
.Select(publisherLine =>
|
||||
{
|
||||
var tokens = publisherLine.Split("|");
|
||||
if (tokens.Length != 2) return null;
|
||||
var aliases = tokens[0];
|
||||
// Multiple publisher aliases are separated by #
|
||||
if (aliases.Split("#").Any(name => name.ToLowerInvariant().Trim().Equals(publisherName.ToLowerInvariant().Trim())))
|
||||
{
|
||||
return tokens[1];
|
||||
}
|
||||
return null;
|
||||
})
|
||||
.FirstOrDefault(url => !string.IsNullOrEmpty(url));
|
||||
|
||||
if (string.IsNullOrEmpty(externalFile))
|
||||
{
|
||||
throw new KavitaException($"Could not grab publisher image for {publisherName}");
|
||||
}
|
||||
|
||||
externalLink = "https://www.kavitareader.com/assets/publishers/" + externalFile;
|
||||
}
|
||||
|
||||
return externalLink;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public string CreateThumbnailFromBase64(string encodedImage, string fileName, EncodeFormat encodeFormat, int thumbnailWidth = ThumbnailWidth)
|
||||
{
|
||||
|
@ -805,6 +880,11 @@ public class ImageService : IImageService
|
|||
return $"{new Uri(url).Host.Replace("www.", string.Empty)}{encodeFormat.GetExtension()}";
|
||||
}
|
||||
|
||||
public static string GetPublisherFormat(string publisher, EncodeFormat encodeFormat)
|
||||
{
|
||||
return $"{publisher}{encodeFormat.GetExtension()}";
|
||||
}
|
||||
|
||||
|
||||
public static void CreateMergedImage(IList<string> coverImages, CoverImageSize size, string dest)
|
||||
{
|
||||
|
@ -891,4 +971,6 @@ public class ImageService : IImageService
|
|||
|
||||
return Color.FromArgb(r, g, b);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue