mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-06-01 04:34:49 -04:00
* ImageService had a stream reset before writting out to array. Added logging statment for updating series metadata. Removed ConcurencyCheck due to bad update issue for CollectionTag. * Added a new screen which lets you quickly see all your bookmarks for a given user. * Built user bookmark page in user settings. Moved user settings to it's own lazy loaded module. Removed unneded debouncing from downloader and just used throttleTime instead. * Removed a not-yet implemented tab from series modal * Fixed a bug in clear bookmarks and adjusted icons within anchors to have proper styling
106 lines
2.9 KiB
C#
106 lines
2.9 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using API.Comparators;
|
|
using API.Entities;
|
|
using API.Interfaces.Services;
|
|
using Microsoft.Extensions.Logging;
|
|
using NetVips;
|
|
|
|
namespace API.Services
|
|
{
|
|
|
|
public class ImageService : IImageService
|
|
{
|
|
private readonly ILogger<ImageService> _logger;
|
|
private readonly IDirectoryService _directoryService;
|
|
private readonly NaturalSortComparer _naturalSortComparer;
|
|
|
|
public ImageService(ILogger<ImageService> logger, IDirectoryService directoryService)
|
|
{
|
|
_logger = logger;
|
|
_directoryService = directoryService;
|
|
_naturalSortComparer = new NaturalSortComparer();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Finds the first image in the directory of the first file. Does not check for "cover/folder".ext files to override.
|
|
/// </summary>
|
|
/// <param name="file"></param>
|
|
/// <returns></returns>
|
|
public string GetCoverFile(MangaFile file)
|
|
{
|
|
var directory = Path.GetDirectoryName(file.FilePath);
|
|
if (string.IsNullOrEmpty(directory))
|
|
{
|
|
_logger.LogError("Could not find Directory for {File}", file.FilePath);
|
|
return null;
|
|
}
|
|
|
|
var firstImage = _directoryService.GetFilesWithExtension(directory, Parser.Parser.ImageFileExtensions)
|
|
.OrderBy(f => f, _naturalSortComparer).FirstOrDefault();
|
|
|
|
return firstImage;
|
|
}
|
|
|
|
public byte[] GetCoverImage(string path, bool createThumbnail = false)
|
|
{
|
|
if (string.IsNullOrEmpty(path)) return Array.Empty<byte>();
|
|
|
|
try
|
|
{
|
|
if (createThumbnail)
|
|
{
|
|
return CreateThumbnail(path);
|
|
}
|
|
|
|
using var img = Image.NewFromFile(path);
|
|
using var stream = new MemoryStream();
|
|
img.JpegsaveStream(stream);
|
|
stream.Position = 0;
|
|
return stream.ToArray();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogWarning(ex, "[GetCoverImage] There was an error and prevented thumbnail generation on {ImageFile}. Defaulting to no cover image", path);
|
|
}
|
|
|
|
return Array.Empty<byte>();
|
|
}
|
|
|
|
|
|
/// <inheritdoc />
|
|
public byte[] CreateThumbnail(string path)
|
|
{
|
|
try
|
|
{
|
|
using var thumbnail = Image.Thumbnail(path, MetadataService.ThumbnailWidth);
|
|
return thumbnail.WriteToBuffer(".jpg");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_logger.LogError(e, "Error creating thumbnail from url");
|
|
}
|
|
|
|
return Array.Empty<byte>();
|
|
}
|
|
|
|
|
|
/// <inheritdoc />
|
|
public byte[] CreateThumbnailFromBase64(string encodedImage)
|
|
{
|
|
try
|
|
{
|
|
using var thumbnail = Image.ThumbnailBuffer(Convert.FromBase64String(encodedImage), MetadataService.ThumbnailWidth);
|
|
return thumbnail.WriteToBuffer(".jpg");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_logger.LogError(e, "Error creating thumbnail from url");
|
|
}
|
|
|
|
return Array.Empty<byte>();
|
|
}
|
|
}
|
|
}
|