Render linked videos as embeds in HTML

Related to #1012
This commit is contained in:
Tyrrrz 2023-03-10 16:17:35 +02:00
parent 8f40acdda7
commit 8bc1bcaf16
2 changed files with 38 additions and 3 deletions

View file

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using AngleSharp.Dom; using AngleSharp.Dom;
using DiscordChatExporter.Cli.Tests.Infra; using DiscordChatExporter.Cli.Tests.Infra;
using DiscordChatExporter.Core.Discord; using DiscordChatExporter.Core.Discord;
using DiscordChatExporter.Core.Utils.Extensions;
using FluentAssertions; using FluentAssertions;
using Xunit; using Xunit;
@ -46,7 +47,8 @@ public class HtmlEmbedSpecs
message message
.QuerySelectorAll("img") .QuerySelectorAll("img")
.Select(e => e.GetAttribute("src")) .Select(e => e.GetAttribute("src"))
.Where(s => s?.EndsWith("i.redd.it/f8w05ja8s4e61.png") ?? false) .WhereNotNull()
.Where(s => s.EndsWith("f8w05ja8s4e61.png"))
.Should() .Should()
.ContainSingle(); .ContainSingle();
} }
@ -67,6 +69,25 @@ public class HtmlEmbedSpecs
content.Should().BeNullOrEmpty(); content.Should().BeNullOrEmpty();
} }
[Fact]
public async Task Message_with_a_video_link_is_rendered_with_a_video_embed()
{
// Act
var message = await ExportWrapper.GetMessageAsHtmlAsync(
ChannelIds.EmbedTestCases,
Snowflake.Parse("1083751036596002856")
);
// Assert
message
.QuerySelectorAll("source")
.Select(e => e.GetAttribute("src"))
.WhereNotNull()
.Where(s => s.EndsWith("i_am_currently_feeling_slight_displeasure_of_what_you_have_just_sent_lqrem.mp4"))
.Should()
.ContainSingle();
}
[Fact] [Fact]
public async Task Message_with_a_GIFV_link_is_rendered_with_a_video_embed() public async Task Message_with_a_GIFV_link_is_rendered_with_a_video_embed()
{ {
@ -80,7 +101,8 @@ public class HtmlEmbedSpecs
message message
.QuerySelectorAll("source") .QuerySelectorAll("source")
.Select(e => e.GetAttribute("src")) .Select(e => e.GetAttribute("src"))
.Where(s => s?.EndsWith("media.tenor.com/DDAJeW6BQKkAAAPo/tooncasm-test-copy.mp4") ?? false) .WhereNotNull()
.Where(s => s.EndsWith("tooncasm-test-copy.mp4"))
.Should() .Should()
.ContainSingle(); .ContainSingle();
} }

View file

@ -447,6 +447,19 @@
</a> </a>
</div> </div>
} }
// Generic video embed
else if (embed.Kind == EmbedKind.Video && !string.IsNullOrWhiteSpace(embed.Url))
{
var embedVideoUrl =
embed.Video?.ProxyUrl ?? embed.Video?.Url ??
embed.Url;
<div class="chatlog__embed">
<video class="chatlog__embed-generic-gifv" width="@embed.Video?.Width" height="@embed.Video?.Height" controls>
<source src="@await ResolveAssetUrlAsync(embedVideoUrl)" alt="Embedded video">
</video>
</div>
}
// Generic gifv embed // Generic gifv embed
else if (embed.Kind == EmbedKind.Gifv && !string.IsNullOrWhiteSpace(embed.Url)) else if (embed.Kind == EmbedKind.Gifv && !string.IsNullOrWhiteSpace(embed.Url))
{ {
@ -455,7 +468,7 @@
embed.Url; embed.Url;
<div class="chatlog__embed"> <div class="chatlog__embed">
<video class="chatlog__embed-generic-gifv" loop width="@embed.Video?.Width" height="@embed.Video?.Height" onmouseover="this.play()" onmouseout="this.pause()"> <video class="chatlog__embed-generic-gifv" width="@embed.Video?.Width" height="@embed.Video?.Height" loop onmouseover="this.play()" onmouseout="this.pause()">
<source src="@await ResolveAssetUrlAsync(embedVideoUrl)" alt="Embedded video"> <source src="@await ResolveAssetUrlAsync(embedVideoUrl)" alt="Embedded video">
</video> </video>
</div> </div>