diff options
| author | Jake Mannens <jake@asger.xyz> | 2026-04-27 03:06:02 +1000 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2026-04-27 03:06:02 +1000 |
| commit | 60dd44153b5f2b233dc66032507ee6c9a925ed0e (patch) | |
| tree | fb6ac2546732f15e01b4f5771af25fc62db91842 | |
| parent | ba35fa01df940c259f79392f298ddb16c98a903a (diff) | |
v0.12av0.12a
| -rw-r--r-- | Controllers/MediaController.cs | 17 | ||||
| -rw-r--r-- | Server.csproj | 12 | ||||
| -rw-r--r-- | Services/MediaService.cs | 43 |
3 files changed, 55 insertions, 17 deletions
diff --git a/Controllers/MediaController.cs b/Controllers/MediaController.cs index cd6916f..7eb46c6 100644 --- a/Controllers/MediaController.cs +++ b/Controllers/MediaController.cs @@ -114,6 +114,13 @@ public class MediaController : Controller { .ElementAtOrDefault(0); Enum.TryParse(typeof(PathType), pathTypeString, true, out pathType); + // Parse tag IDs from headers + Guid[]? tagIds = formFile.Headers["X-HyperBooru-Tags"] + .ElementAtOrDefault(0)? + .Split(',') + .Select(t => Guid.Parse(t)) + .ToArray(); + media = mediaService.Create( formFile.OpenReadStream(), formFile.FileName, @@ -123,7 +130,15 @@ public class MediaController : Controller { lastWriteTime, createTime, path, - (PathType?) pathType); + (PathType?) pathType, + tagIds); + + // Return the GUID of the new media object if requested + bool returnMetadataParsed = bool.TryParse( + formFile.Headers["X-HyperBooru-ReturnMediaId"], out var returnMetadata); + + if(returnMetadataParsed && returnMetadata) + return Content(media.Guid.ToString()); } catch(MediaCreateException e) { return BadRequest(e.Message); } diff --git a/Server.csproj b/Server.csproj index e435946..b743529 100644 --- a/Server.csproj +++ b/Server.csproj @@ -6,9 +6,9 @@ <ImplicitUsings>enable</ImplicitUsings> <AssemblyName>HyperBooru</AssemblyName> <RootNamespace>HyperBooru</RootNamespace> - <AssemblyVersion>0.11.0.0</AssemblyVersion> + <AssemblyVersion>0.12.0.0</AssemblyVersion> <FileVersion>$(AssemblyVersion)</FileVersion> - <Version>0.11-alpha</Version> + <Version>0.12-alpha</Version> <UserSecretsId>2907567f-4640-4581-8f4d-0977952d26bd</UserSecretsId> </PropertyGroup> @@ -32,16 +32,16 @@ </ItemGroup> <ItemGroup> - <PackageReference Include="Magick.NET-Q16-AnyCPU" Version="14.11.1" /> - <PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.5" /> - <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.5"> + <PackageReference Include="Magick.NET-Q16-AnyCPU" Version="14.13.0" /> + <PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.7" /> + <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.7"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Mime-Detective" Version="25.8.1" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.1" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.7" /> - <PackageReference Include="System.Drawing.Common" Version="10.0.5" /> + <PackageReference Include="System.Drawing.Common" Version="10.0.7" /> <PackageReference Include="Tesseract" Version="5.2.0" /> </ItemGroup> diff --git a/Services/MediaService.cs b/Services/MediaService.cs index 27c77d6..763b953 100644 --- a/Services/MediaService.cs +++ b/Services/MediaService.cs @@ -24,7 +24,8 @@ public interface IMediaService { DateTime? lastWriteTime = null, DateTime? createTime = null, string? path = null, - PathType? pathType = null); + PathType? pathType = null, + Guid[]? tagIds = null); public void Delete(Guid media); public void Delete(Media media); @@ -117,7 +118,8 @@ public class MediaService : IMediaService { DateTime? lastWriteTime = null, DateTime? createTime = null, string? path = null, - PathType? pathType = null) { + PathType? pathType = null, + Guid[]? tagIds = null) { using var db = dbFactory.CreateDbContext(); using var transaction = db.Database.BeginTransaction(); @@ -145,10 +147,10 @@ public class MediaService : IMediaService { fileData.Seek(0, SeekOrigin.Begin); using var magickImage = new MagickImage(fileData); - var media = db.UploadedFiles - .Include(uf => uf.Media) - .FirstOrDefault(uf => uf.Checksum == hash)? - .Media; + var media = db.Media + .Include(m => m.UploadedFiles) + .Include(m => m.Tags) + .FirstOrDefault(m => m.UploadedFiles.Any(uf => uf.Checksum == hash)); var fileRecord = new UploadedFile() { Filename = fileName, @@ -166,6 +168,24 @@ public class MediaService : IMediaService { PathType = pathType }; + var tags = Array.Empty<TagDefinition>(); + if(tagIds is not null) { + tagIds = tagIds.Distinct().ToArray(); + + tags = db.TagDefinitions + .Where(td => tagIds.Contains(td.Guid)) + .ToArray(); + + if(tags.Count() < tagIds.Count()) { + var badIds = tagIds + .Where(x => !tags.Select(td => td.Guid).Contains(x)) + .Order(); + + throw new MediaCreateException( + $"Non-existent tags specified: {string.Join(", ", badIds)}"); + } + } + if(media is null) { var ingestTagDef = db.TagDefinitions .First(td => td.Guid == HBContext.IngestTag); @@ -174,9 +194,9 @@ public class MediaService : IMediaService { UploadedFiles = new() { fileRecord }, - Tags = new() { - new() { TagDefinition = ingestTagDef } - } + Tags = tags is null ? [ new() { TagDefinition = ingestTagDef } ] : tags + .Select(td => new Tag() { TagDefinition = td }) + .ToList() }; using var newFile = File.Create(GetPath(media)); @@ -190,12 +210,15 @@ public class MediaService : IMediaService { media.CurrentUploadedFile = fileRecord; db.SaveChanges(); } else { - db.Entry(media).Collection(m => m.UploadedFiles).Load(); var fileHashes = media.UploadedFiles .Select(uf => GetUploadedFileHash(uf)); // Only add the uploaded file record if it contains new information if(!fileHashes.Contains(GetUploadedFileHash(fileRecord))) media.UploadedFiles.Add(fileRecord); + // Add new tags if needed + var missingTags = tags + .Where(td => !media.Tags.Select(t => t.TagDefinition.Guid).Contains(td.Guid)); + media.Tags.AddRange(missingTags.Select(td => new Tag() { TagDefinition = td })); db.Update(media); db.SaveChanges(); } |
