Render html server side for proper metadata tagging

This commit is contained in:
Kieran 2022-07-09 23:19:41 +01:00
parent cec5a01d5d
commit 0249b1cedf
Signed by: Kieran
GPG Key ID: DE71CEB3925BE941
5 changed files with 137 additions and 5 deletions

View File

@ -44,7 +44,7 @@ public class DownloadController : Controller
var voidFile = await SetupDownload(gid); var voidFile = await SetupDownload(gid);
if (voidFile == default) return; if (voidFile == default) return;
var egressReq = new EgressRequest(gid, GetRanges(Request, (long)voidFile!.Metadata!.Size)); var egressReq = new EgressRequest(gid, GetRanges(Request, (long) voidFile!.Metadata!.Size));
if (egressReq.Ranges.Count() > 1) if (egressReq.Ranges.Count() > 1)
{ {
_logger.LogWarning("Multi-range request not supported!"); _logger.LogWarning("Multi-range request not supported!");
@ -56,10 +56,10 @@ public class DownloadController : Controller
} }
else if (egressReq.Ranges.Count() == 1) else if (egressReq.Ranges.Count() == 1)
{ {
Response.StatusCode = (int)HttpStatusCode.PartialContent; Response.StatusCode = (int) HttpStatusCode.PartialContent;
if (egressReq.Ranges.Sum(a => a.Size) == 0) if (egressReq.Ranges.Sum(a => a.Size) == 0)
{ {
Response.StatusCode = (int)HttpStatusCode.RequestedRangeNotSatisfiable; Response.StatusCode = (int) HttpStatusCode.RequestedRangeNotSatisfiable;
return; return;
} }
} }
@ -95,7 +95,7 @@ public class DownloadController : Controller
var orderId = Request.Headers.GetHeader("V-OrderId") ?? Request.Query["orderId"]; var orderId = Request.Headers.GetHeader("V-OrderId") ?? Request.Query["orderId"];
if (!await IsOrderPaid(orderId)) if (!await IsOrderPaid(orderId))
{ {
Response.StatusCode = (int)HttpStatusCode.PaymentRequired; Response.StatusCode = (int) HttpStatusCode.PaymentRequired;
return default; return default;
} }
} }
@ -136,4 +136,4 @@ public class DownloadController : Controller
} }
} }
} }
} }

View File

@ -0,0 +1,55 @@
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using VoidCat.Model;
using VoidCat.Services.Abstractions;
namespace VoidCat.Controllers;
public class IndexController : Controller
{
private readonly IWebHostEnvironment _webHost;
private readonly IFileMetadataStore _fileMetadata;
public IndexController(IFileMetadataStore fileMetadata, IWebHostEnvironment webHost)
{
_fileMetadata = fileMetadata;
_webHost = webHost;
}
/// <summary>
/// Return html content with tags for file preview
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[Route("{id}")]
public async Task<IActionResult> FilePreview(string id)
{
if (!id.TryFromBase58Guid(out var gid)) return NotFound();
var meta = await _fileMetadata.Get(gid);
if (meta == default) return NotFound();
var manifestPath = Path.Combine(_webHost.WebRootPath, "asset-manifest.json");
if (!System.IO.File.Exists(manifestPath)) return StatusCode(500);
var jsonManifest = await System.IO.File.ReadAllTextAsync(manifestPath);
return View("~/Pages/Index.cshtml", new IndexModel
{
Meta = meta,
Manifest = JsonConvert.DeserializeObject<AssetManifest>(jsonManifest)!
});
}
public class IndexModel
{
public VoidFileMeta Meta { get; init; }
public AssetManifest Manifest { get; init; }
}
public class AssetManifest
{
public Dictionary<string, string> Files { get; init; }
public List<string> Entrypoints { get; init; }
}
}

View File

@ -0,0 +1,64 @@
@using VoidCat.Model
@model VoidCat.Controllers.IndexController.IndexModel
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="theme-color" content="#000000"/>
<link rel="icon" href="/favicon.ico"/>
<link rel="apple-touch-icon" href="/logo.png"/>
<link rel="manifest" href="/manifest.json"/>
<title>void.cat - @Model.Meta.Name</title>
<meta name="description" content="@Model.Meta.Description"/>
<meta property="og:site_name" content="void.cat"/>
<meta property="og:title" content="@Model.Meta.Name"/>
<meta property="og:description" content="@Model.Meta.Description"/>
<meta property="og:url" content="@($"https://{Context.Request.Host}/{Model.Meta.Id.ToBase58()}")"/>
@foreach (var ep in Model.Manifest.Entrypoints)
{
switch (System.IO.Path.GetExtension(ep))
{
case ".css":
{
<link rel="stylesheet" href="@ep"/>
break;
}
case ".js":
{
<script defer src="@ep"></script>
break;
}
}
}
@{
var mime = Model.Meta.MimeType;
}
@if (mime != default)
{
var link = $"https://{Context.Request.Host}/d/{Model.Meta.Id.ToBase58()}";
if (mime.StartsWith("image/"))
{
<meta property="og:image" content="@link"/>
<meta property="og:image:type" content="@mime"/>
}
else if (mime.StartsWith("video/"))
{
<meta property="og:video" content="@link"/>
<meta property="og:video:type" content="@mime"/>
}
else if (mime.StartsWith("audio/"))
{
<meta property="og:audio" content="@link"/>
<meta property="og:audio:type" content="@mime"/>
}
}
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>

View File

@ -0,0 +1,10 @@
{
"files": {
"main.js": "/static/js/bundle.js",
"index.html": "/index.html",
"bundle.js.map": "/static/js/bundle.js.map",
},
"entrypoints": [
"static/js/bundle.js"
]
}

View File

@ -6,6 +6,9 @@ services:
- "8001:80" - "8001:80"
volumes: volumes:
- "./VoidCat/appsettings.compose.json:/app/appsettings.json:ro" - "./VoidCat/appsettings.compose.json:/app/appsettings.json:ro"
depends_on:
- postgres
- redis
redis: redis:
image: "redis:alpine" image: "redis:alpine"
postgres: postgres: