Fix opengraph
This commit is contained in:
parent
9ba3fc118d
commit
4e1c62ac90
@ -14,17 +14,8 @@ namespace NostrServices.Controllers;
|
||||
/// Add OpenGraph tags to html documents
|
||||
/// </summary>
|
||||
[Route("/api/v1/opengraph")]
|
||||
public class OpenGraphController : Controller
|
||||
public class OpenGraphController(ILogger<OpenGraphController> logger, RedisStore redisStore) : Controller
|
||||
{
|
||||
private readonly ILogger<OpenGraphController> _logger;
|
||||
private readonly RedisStore _redisStore;
|
||||
|
||||
public OpenGraphController(ILogger<OpenGraphController> logger, RedisStore redisStore)
|
||||
{
|
||||
_logger = logger;
|
||||
_redisStore = redisStore;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inject opengraph tags into provided html
|
||||
/// </summary>
|
||||
@ -63,7 +54,7 @@ public class OpenGraphController : Controller
|
||||
{
|
||||
if (nid.Hrp is "nevent" or "note" or "naddr")
|
||||
{
|
||||
var ev = await _redisStore.GetEvent(nid);
|
||||
var ev = await redisStore.GetEvent(nid);
|
||||
if (ev != default)
|
||||
{
|
||||
var tags = MetaTagsToElements(await GetEventTags(ev));
|
||||
@ -75,7 +66,7 @@ public class OpenGraphController : Controller
|
||||
}
|
||||
else if (nid.Hrp is "nprofile" or "npub")
|
||||
{
|
||||
var profile = await _redisStore.GetProfile(nid.Special);
|
||||
var profile = await redisStore.GetProfile(nid.Special);
|
||||
|
||||
var meta = await GetProfileMeta(profile);
|
||||
var tags = MetaTagsToElements([
|
||||
@ -98,7 +89,7 @@ public class OpenGraphController : Controller
|
||||
}
|
||||
catch (Exception ex) when (ex is not TaskCanceledException)
|
||||
{
|
||||
_logger.LogWarning("Failed to inject event tags: {Message}", ex.ToString());
|
||||
logger.LogWarning("Failed to inject event tags: {Message}", ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
@ -109,17 +100,20 @@ public class OpenGraphController : Controller
|
||||
{
|
||||
var ret = new List<KeyValuePair<string, string>>();
|
||||
|
||||
var profile = await _redisStore.GetProfile(ev.PubKey.ToHex());
|
||||
var profile = await redisStore.GetProfile(ev.PubKey.ToHex());
|
||||
var name = profile?.Name ?? "Nostrich";
|
||||
switch (ev.Kind)
|
||||
{
|
||||
case (long)NostrKind.LiveEvent:
|
||||
{
|
||||
var host = ev.Tags.FirstOrDefault(a => a.Key == "p" && a.Values[1] == "host")?.Values[0] ?? ev.PubKey.ToHex();
|
||||
var hostProfile = await _redisStore.GetProfile(host);
|
||||
var host = ev.Tags.FirstOrDefault(a => a.Key == "p" && a.Values[^1] == "host")
|
||||
?.Values[0] ??
|
||||
ev.PubKey.ToHex();
|
||||
var hostProfile = await redisStore.GetProfile(host);
|
||||
var hostName = hostProfile?.Name ?? profile?.Name ?? "Nostrich";
|
||||
var stream = ev.GetFirstTagValue("streaming") ?? ev.GetFirstTagValue("recording") ?? "";
|
||||
var image = ev.GetFirstTagValue("image") ?? hostProfile?.Picture ?? $"https://robohash.v0l.io/{ev.PubKey.ToHex()}.png";
|
||||
var image = ev.GetFirstTagValue("image") ??
|
||||
hostProfile?.Picture ?? $"https://robohash.v0l.io/{ev.PubKey.ToHex()}.png";
|
||||
ret.AddRange(new KeyValuePair<string, string>[]
|
||||
{
|
||||
new("og:type", "video.other"),
|
||||
@ -145,7 +139,8 @@ public class OpenGraphController : Controller
|
||||
case 1_313: // stream clip
|
||||
{
|
||||
var stream = ev.GetFirstTagValue("r")!;
|
||||
var image = ev.GetFirstTagValue("image") ?? profile?.Picture ?? $"https://robohash.v0l.io/{ev.PubKey.ToHex()}.png";
|
||||
var image = ev.GetFirstTagValue("image") ??
|
||||
profile?.Picture ?? $"https://robohash.v0l.io/{ev.PubKey.ToHex()}.png";
|
||||
ret.AddRange(new KeyValuePair<string, string>[]
|
||||
{
|
||||
new("og:type", "video.other"),
|
||||
@ -212,14 +207,23 @@ public class OpenGraphController : Controller
|
||||
|
||||
foreach (var ex in tags)
|
||||
{
|
||||
var tag = doc.CreateElement(ex.Element);
|
||||
IElement tag = doc.Head?.Children.FirstOrDefault(a =>
|
||||
{
|
||||
if (ex.Element == "meta")
|
||||
{
|
||||
var metaPropertyA = a.Attributes.FirstOrDefault(b => b.Name == "property");
|
||||
var metaPropertyB = ex.Attributes.FirstOrDefault(b => b is { Key: "property" });
|
||||
return metaPropertyA?.Value == metaPropertyB.Value;
|
||||
}
|
||||
|
||||
return false;
|
||||
}) ?? AddNewTag(ex);
|
||||
|
||||
foreach (var attr in ex.Attributes)
|
||||
{
|
||||
tag.SetAttribute(attr.Key, attr.Value);
|
||||
}
|
||||
|
||||
doc.Head?.AppendChild(tag);
|
||||
|
||||
var isOgTitle = ex.Attributes.Any(a => a is { Key: "property", Value: "og:title" });
|
||||
if (isOgTitle && doc.Head != default)
|
||||
{
|
||||
@ -256,6 +260,15 @@ public class OpenGraphController : Controller
|
||||
descriptionTag.SetAttribute("content", ogDesc.Value);
|
||||
}
|
||||
}
|
||||
|
||||
continue;
|
||||
|
||||
IElement AddNewTag(HeadElement he)
|
||||
{
|
||||
var tx = doc!.CreateElement(he.Element);
|
||||
doc.Head?.AppendChild(tx);
|
||||
return tx;
|
||||
}
|
||||
}
|
||||
|
||||
return doc;
|
||||
|
Loading…
x
Reference in New Issue
Block a user