-
Notifications
You must be signed in to change notification settings - Fork 448
/
ImageAssetMetadataSource.cs
114 lines (93 loc) · 3.6 KB
/
ImageAssetMetadataSource.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Assets;
using Squidex.Domain.Apps.Core.Assets;
using Squidex.Domain.Apps.Entities.Assets.Commands;
namespace Squidex.Domain.Apps.Entities.Assets;
public sealed class ImageAssetMetadataSource : IAssetMetadataSource
{
private readonly IAssetThumbnailGenerator assetGenerator;
public ImageAssetMetadataSource(IAssetThumbnailGenerator assetGenerator)
{
this.assetGenerator = assetGenerator;
}
public async Task EnhanceAsync(UploadAssetCommand command,
CancellationToken ct)
{
if (command.Type is AssetType.Unknown or AssetType.Image)
{
var mimeType = command.File.MimeType;
ImageInfo? imageInfo;
await using (var uploadStream = command.File.OpenRead())
{
imageInfo = await assetGenerator.GetImageInfoAsync(uploadStream, mimeType, ct);
}
if (imageInfo != null)
{
var needsFix =
imageInfo.HasSensitiveMetadata ||
imageInfo.Orientation > ImageOrientation.TopLeft;
if (command.File != null && needsFix)
{
var tempFile = TempAssetFile.Create(command.File);
await using (var uploadStream = command.File.OpenRead())
{
await using (var tempStream = tempFile.OpenWrite())
{
await assetGenerator.FixAsync(uploadStream, mimeType, tempStream, ct);
}
}
await using (var tempStream = tempFile.OpenRead())
{
imageInfo = await assetGenerator.GetImageInfoAsync(tempStream, mimeType, ct) ?? imageInfo;
}
await command.File.DisposeAsync();
command.File = tempFile;
}
if (command.Type == AssetType.Unknown || needsFix)
{
command.Type = AssetType.Image;
command.Metadata[KnownMetadataKeys.PixelWidth] = imageInfo.PixelWidth;
command.Metadata[KnownMetadataKeys.PixelHeight] = imageInfo.PixelHeight;
}
}
}
if (command.Tags == null)
{
return;
}
if (command.Type == AssetType.Image)
{
command.Tags.Add("image");
var wh = command.Metadata.GetInt32(KnownMetadataKeys.PixelWidth) + command.Metadata.GetInt32(KnownMetadataKeys.PixelWidth);
if (wh > 2000)
{
command.Tags.Add("image/large");
}
else if (wh > 1000)
{
command.Tags.Add("image/medium");
}
else
{
command.Tags.Add("image/small");
}
}
}
public IEnumerable<string> Format(Asset asset)
{
if (asset.Type != AssetType.Image)
{
yield break;
}
if (asset.Metadata.TryGetNumber(KnownMetadataKeys.PixelWidth, out var w) &&
asset.Metadata.TryGetNumber(KnownMetadataKeys.PixelHeight, out var h))
{
yield return $"{w}x{h}px";
}
}
}