summaryrefslogtreecommitdiff
path: root/Controllers/MediaController.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Controllers/MediaController.cs')
-rw-r--r--Controllers/MediaController.cs123
1 files changed, 33 insertions, 90 deletions
diff --git a/Controllers/MediaController.cs b/Controllers/MediaController.cs
index b7c8314..b476dec 100644
--- a/Controllers/MediaController.cs
+++ b/Controllers/MediaController.cs
@@ -9,23 +9,18 @@ namespace HyperBooru.Controllers;
[ApiController]
[Route("/media")]
public class MediaController : Controller {
+ private IMediaService mediaService;
private IConfigService config;
- private HBContext db;
+ private HBContext db;
- private ContentInspector inspector;
+ public MediaController(
+ IMediaService mediaService,
+ IConfigService config,
+ HBContext db) {
- public MediaController(IConfigService config, HBContext db) {
- this.config = config;
- this.db = db;
-
- ContentInspectorBuilder inspectorBuilder = new() {
- Definitions =
- MimeDetective.Definitions.Default.FileTypes.Images.All()
- .Union(MimeDetective.Definitions.Default.FileTypes.Video.All())
- .ToList()
- };
-
- inspector = inspectorBuilder.Build();
+ this.mediaService = mediaService;
+ this.config = config;
+ this.db = db;
}
[HttpGet("{mediaId}")]
@@ -34,7 +29,7 @@ public class MediaController : Controller {
if(media is null)
return NotFound();
- var fs = System.IO.File.OpenRead(config.GetPath(media));
+ var fs = System.IO.File.OpenRead(mediaService.GetPath(media));
return new FileStreamResult(fs, media.MimeType);
}
@@ -52,7 +47,7 @@ public class MediaController : Controller {
if(media.MimeType.Split("/")[0] != "image")
return BadRequest("Media object not an image");
- using var image = new MagickImage(config.GetPath(media));
+ using var image = new MagickImage(mediaService.GetPath(media));
if(w is null && h is null)
return BadRequest("Both width and height cannot be null!");
@@ -63,7 +58,7 @@ public class MediaController : Controller {
int width = (int)(w is not null ? w : image.Width * h / image.Height);
int height = (int)(h is not null ? h : image.Height * w / image.Width);
- var thumbPath = config.GetPath(media, width, height);
+ var thumbPath = mediaService.GetPath(media, width, height);
if(!System.IO.File.Exists(thumbPath)) {
image.Resize(new MagickGeometry(width, height));
@@ -76,16 +71,8 @@ public class MediaController : Controller {
}
[HttpDelete("{mediaId}")]
- public IActionResult Delete([FromRoute] Guid mediaId) {
- var media = db.Media.First(m => m.Guid == mediaId);
- if(media is null)
- return NotFound();
-
- System.IO.File.Delete(config.GetPath(media));
-
- db.Media.Remove(media);
- db.SaveChanges();
- return Ok();
+ public void Delete([FromRoute] Guid mediaId) {
+ mediaService.Delete(mediaId);
}
[HttpPost]
@@ -95,72 +82,28 @@ public class MediaController : Controller {
[FromForm] DateTime? lastWriteTime,
[FromForm] DateTime? createTime) {
- using var transaction = db.Database.BeginTransaction();
-
- var formFile = Request.Form.Files[0];
- if(formFile.Length < 1)
- return BadRequest("Empty file");
-
- var formStream = formFile.OpenReadStream();
-
- // Calculate the checksum using the in-memory file contents
- var hash = BitConverter
- .ToString(MD5.Create().ComputeHash(formStream))
- .Replace("-", "")
- .ToLower();
+ if(Request.Form.Files.Count == 0)
+ return BadRequest("No files");
- if(checksum is not null && hash != checksum.ToLower())
- return BadRequest("Checksum does not match");
+ Media media = new();
- var fileRecord = new UploadedFile() {
- Filename = formFile.FileName,
- OriginalChecksum = hash,
- UploadTime = DateTime.UtcNow,
- LastAccessTime = lastAccessTime,
- LastWriteTime = lastWriteTime,
- CreateTime = createTime
- };
-
- formStream.Seek(0, SeekOrigin.Begin);
- var defs = inspector.Inspect(formStream);
-
- var mime = defs.ByMimeType().FirstOrDefault()?.MimeType;
- if(mime is null)
- return BadRequest("Unsupported file type");
-
- var media = db.Media
- .FirstOrDefault(m => m.Checksum == hash);
-
- if(media is null) {
- var ingestTagDef = db.TagDefinitions
- .First(td => td.Guid == HBContext.IngestTag);
-
- media = new() {
- Checksum = hash,
- MimeType = mime,
- UploadedFiles = new() {
- fileRecord
- },
- Tags = new() {
- new() { TagDefinition = ingestTagDef }
- }
- };
-
- using var newFile = System.IO.File.Create(config.GetPath(media));
-
- formStream.Seek(0, SeekOrigin.Begin);
- formStream.CopyTo(newFile);
- newFile.Flush();
-
- db.Media.Add(media);
- } else {
- media.UploadedFiles.Add(fileRecord);
- db.Update(media);
+ foreach(var formFile in Request.Form.Files) {
+ try {
+ media = mediaService.Create(
+ formFile.OpenReadStream(),
+ formFile.FileName,
+ checksum,
+ lastAccessTime,
+ lastWriteTime,
+ createTime);
+ } catch(MediaCreateException e) {
+ return BadRequest(e.Message);
+ }
}
- db.SaveChanges();
- transaction.Commit();
-
- return Redirect($"/ViewMedia?m={media.Guid}");
+ if(Request.Form.Files.Count == 1)
+ return Redirect($"/ViewMedia?m={media.Guid}");
+ else
+ return Redirect($"/Gallery");
}
} \ No newline at end of file