summaryrefslogtreecommitdiff
path: root/Services/MediaService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Services/MediaService.cs')
-rw-r--r--Services/MediaService.cs37
1 files changed, 37 insertions, 0 deletions
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(