From cb8c17917d0363f09eeaa3c379617dc213b2dacf Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Tue, 29 Aug 2023 15:47:37 +1000 Subject: Moved thumbnail generation from media controller to media service --- Services/MediaService.cs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'Services/MediaService.cs') diff --git a/Services/MediaService.cs b/Services/MediaService.cs index 8c2a5e0..ccee027 100644 --- a/Services/MediaService.cs +++ b/Services/MediaService.cs @@ -24,6 +24,8 @@ public interface IMediaService { public void Delete(Guid media); public void Delete(Media media); + public Stream GetThumbnail(Guid media, int? width, int? height); + public Stream GetThumbnail(Media media, int? width, int? height); public string GetPath(Media media); public string GetPath(Media media, int width, int height); @@ -206,6 +208,41 @@ public class MediaService : IMediaService { public void Delete(Media media) => Delete(media.Guid); + public Stream GetThumbnail(Guid media, int? width, int? height) { + using var db = dbFactory.CreateDbContext(); + var m = db.Media.First(m => m.Guid == media); + if(m is null) + throw new ObjectNotFoundException(media); + + if(m.MimeType.Split("/")[0] != "image") + throw new ThumbnailException("Media object not an image", m); + + using var image = new MagickImage(GetPath(m)); + + if(width is null && height is null) + throw new ThumbnailException("Both width and height cannot be null!", m); + + if(width > image.Width || height > image.Height) + throw new ThumbnailException("Requested thumbnail size is larger than original media", m); + + #pragma warning disable CS8629 + int w = (int) (width is not null ? width : image.Width * height / image.Height); + int h = (int) (height is not null ? height : image.Height * width / image.Width); + #pragma warning restore CS8629 + + var thumbPath = GetPath(m, w, h); + + if(!System.IO.File.Exists(thumbPath)) { + image.Resize(w, h); + image.Write(thumbPath); + } + + return System.IO.File.OpenRead(thumbPath); + } + + public Stream GetThumbnail(Media media, int? width, int? height) => + GetThumbnail(media.Guid, width, height); + public string GetPath(Media media) { var fileInfo = new FileInfo( Path.Join( -- cgit v1.3