diff options
| author | Jake Mannens <jake@asger.xyz> | 2023-09-06 09:30:54 +1000 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2025-08-20 00:52:04 +1000 |
| commit | b303a2fc0f37244d5f45bb2189238991118356e8 (patch) | |
| tree | 8a11d4d9e879fb1b2845996c5eb0137f73230881 | |
| parent | 6ed8b2f7a2bac84f582048181c58cc318b729322 (diff) | |
Moved metadata from Media object to UploadedFile object
| -rw-r--r-- | Controllers/MediaController.cs | 7 | ||||
| -rw-r--r-- | Media.cs | 9 | ||||
| -rw-r--r-- | Pages/Gallery.razor | 7 | ||||
| -rw-r--r-- | Pages/ViewMedia.razor | 11 | ||||
| -rw-r--r-- | Services/MediaService.cs | 41 | ||||
| -rw-r--r-- | Services/OcrService.cs | 3 | ||||
| -rw-r--r-- | Services/SearchService.cs | 1 |
7 files changed, 44 insertions, 35 deletions
diff --git a/Controllers/MediaController.cs b/Controllers/MediaController.cs index 8070199..fa6e7ab 100644 --- a/Controllers/MediaController.cs +++ b/Controllers/MediaController.cs @@ -1,6 +1,7 @@ using HyperBooru.Services; using HyperBooru.Util; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; namespace HyperBooru.Controllers; @@ -23,13 +24,15 @@ public class MediaController : Controller { [HttpGet("{mediaId}")] public IActionResult Fetch([FromRoute] Guid mediaId) { - var media = db.Media.First(m => m.Guid == mediaId); + var media = db.Media + .Include(m => m.CurrentUploadedFile) + .First(m => m.Guid == mediaId); if(media is null) return NotFound(); var fs = System.IO.File.OpenRead(mediaService.GetPath(media)); - return new FileStreamResult(fs, media.MimeType); + return new FileStreamResult(fs, media.CurrentUploadedFile.MimeType); } [HttpGet("thumb/{mediaId}")] @@ -7,12 +7,8 @@ using System.Net.NetworkInformation; namespace HyperBooru; public class Media : HBObject { - public string Checksum { get; set; } - public string MimeType { get; set; } public string? ShortDescription { get; set; } public string? LongDescription { get; set; } - public int Width { get; set; } - public int Height { get; set; } public virtual OcrData? OcrData { get; set; } public virtual UploadedFile? CurrentUploadedFile { get; set; } public virtual List<UploadedFile> UploadedFiles { get; set; } = new(); @@ -34,10 +30,13 @@ public class Media : HBObject { } public class UploadedFile : HBObject { - public string OriginalChecksum { get; set; } + public string Checksum { get; set; } public bool ChecksumVerified { get; set; } = false; public string? Filename { get; set; } public long Length { get; set; } + public string MimeType { get; set; } + public int? Width { get; set; } + public int? Height { get; set; } public DateTime UploadTime { get; set; } = DateTime.UtcNow; public DateTime? LastAccessTime { get; set; } public DateTime? LastWriteTime { get; set; } diff --git a/Pages/Gallery.razor b/Pages/Gallery.razor index 241bed0..0cf34b5 100644 --- a/Pages/Gallery.razor +++ b/Pages/Gallery.razor @@ -13,7 +13,7 @@ @foreach(var media in displayMedia) { // Precalculate thumbnail size to help the browser // lay out the images during initial page load - int width = media.Width * 200 / media.Height; + int width = (int) media.CurrentUploadedFile.Width! * 200 / (int) media.CurrentUploadedFile.Height!; <a href="/ViewMedia?m=@(media.Guid)"> <img src="/media/thumb/@(media.Guid)?h=200" width=@width height="200"/> </a> @@ -81,6 +81,7 @@ } else { queryResult = db.Media .Include(m => m.Tags) + .Include(m => m.CurrentUploadedFile) .OrderByDescending(m => m.ObjectId) .ToArray(); } @@ -104,8 +105,8 @@ private IEnumerable<Media> FilterMedia(IEnumerable<Media> media) { var nsfwTags = tagService.TagsThatImply(HBContext.NsfwTag) - .Select(td => td.ObjectId) - .ToArray(); + .Select(td => td.ObjectId) + .ToArray(); using var enumerator = media.GetEnumerator(); diff --git a/Pages/ViewMedia.razor b/Pages/ViewMedia.razor index 91f33e6..e8914a0 100644 --- a/Pages/ViewMedia.razor +++ b/Pages/ViewMedia.razor @@ -18,8 +18,8 @@ <div id="image-container"> <img src="/media/@(media.Guid)" - width=@media.Width - height=@media.Height + width=@media.CurrentUploadedFile.Width + height=@media.CurrentUploadedFile.Height onclick="toggleSidebar()"/> </div> <div id="metadata"> @@ -42,7 +42,7 @@ <p>Title: <i>@(media.ShortDescription ?? "None")</i></p> <p class="newlines">Description:<br/><i>@(media.LongDescription ?? "None")</i></p> } - <p>Resolution: @(media.Width)x@(media.Height)</p> + <p>Resolution: @(media.CurrentUploadedFile.Width)x@(media.CurrentUploadedFile.Height)</p> <p class="heading">Upload history</p> <hr/> <table id="uploaded-files" class="data-table"> @@ -66,10 +66,10 @@ <td title=@file.Filename>@file.Filename</td> <td title=@file.Length>@file.Length.ToBytesSI()</td> <td - title=@(file.OriginalChecksum + (file.ChecksumVerified ? " (verified)" : "")) + title=@(file.Checksum + (file.ChecksumVerified ? " (verified)" : "")) class=@(file.ChecksumVerified ? "verified" : null)> - @file.OriginalChecksum.Substring(0, 8) + @file.Checksum.Substring(0, 8) </td> </tr> } @@ -154,6 +154,7 @@ media = db.Media .Include(m => m.Tags) .ThenInclude(t => t.TagDefinition) + .Include(m => m.CurrentUploadedFile) .Include(m => m.UploadedFiles) .Include(m => m.OcrData) .First(m => m.Guid == MediaId); diff --git a/Services/MediaService.cs b/Services/MediaService.cs index f814709..6d327cc 100644 --- a/Services/MediaService.cs +++ b/Services/MediaService.cs @@ -120,17 +120,6 @@ public class MediaService : IMediaService { if(checksum is not null && hash != checksum.ToLower()) throw new MediaCreateException("Checksum does not match"); - var fileRecord = new UploadedFile() { - Filename = fileName, - Length = fileData.Length, - OriginalChecksum = hash, - ChecksumVerified = checksum is not null, - UploadTime = DateTime.UtcNow, - LastAccessTime = lastAccessTime, - LastWriteTime = lastWriteTime, - CreateTime = createTime - }; - // Determine the MIME type fileData.Seek(0, SeekOrigin.Begin); var defs = inspector.Inspect(fileData); @@ -142,18 +131,29 @@ public class MediaService : IMediaService { fileData.Seek(0, SeekOrigin.Begin); using var magickImage = new MagickImage(fileData); - var media = db.Media - .FirstOrDefault(m => m.Checksum == hash); + var media = db.UploadedFiles + .FirstOrDefault(uf => uf.Checksum == hash)? + .Media; + + var fileRecord = new UploadedFile() { + Filename = fileName, + Length = fileData.Length, + Checksum = hash, + ChecksumVerified = checksum is not null, + MimeType = mime, + Width = magickImage.Width, + Height = magickImage.Height, + UploadTime = DateTime.UtcNow, + LastAccessTime = lastAccessTime, + LastWriteTime = lastWriteTime, + CreateTime = createTime + }; if(media is null) { var ingestTagDef = db.TagDefinitions .First(td => td.Guid == HBContext.IngestTag); media = new() { - Checksum = hash, - MimeType = mime, - Width = magickImage.Width, - Height = magickImage.Height, CurrentUploadedFile = fileRecord, UploadedFiles = new() { fileRecord @@ -250,11 +250,14 @@ public class MediaService : IMediaService { public Stream GetThumbnail(Guid media, int? width, int? height) { using var db = dbFactory.CreateDbContext(); - var m = db.Media.First(m => m.Guid == media); + + var m = db.Media + .Include(m => m.CurrentUploadedFile) + .First(m => m.Guid == media); if(m is null) throw new ObjectNotFoundException(media); - if(m.MimeType.Split("/")[0] != "image") + if(m.CurrentUploadedFile.MimeType.Split("/")[0] != "image") throw new ThumbnailException("Media object not an image", m); using var image = new MagickImage(GetPath(m)); diff --git a/Services/OcrService.cs b/Services/OcrService.cs index 2f65e43..1967234 100644 --- a/Services/OcrService.cs +++ b/Services/OcrService.cs @@ -59,9 +59,10 @@ public class OcrService : IHostedService { using var db = dbFactory.CreateDbContext(); Guid[] guids = db.Media + .Include(m => m.CurrentUploadedFile) .Include(m => m.OcrData) .Where(m => m.OcrData == null) - .Where(m => m.MimeType.Contains("image/")) + .Where(m => m.CurrentUploadedFile.MimeType.Contains("image/")) .Select(m => m.Guid) .ToArray(); db.Dispose(); diff --git a/Services/SearchService.cs b/Services/SearchService.cs index 2e097e3..7c677b2 100644 --- a/Services/SearchService.cs +++ b/Services/SearchService.cs @@ -56,6 +56,7 @@ public class SearchService : ISearchService { return db.Media .Include(m => m.Tags) + .Include(m => m.CurrentUploadedFile) .Where(m => mediaIds.Contains(m.ObjectId)) .ToArray(); } |
