From b4eaea3246b1218b30999cc77feed302ff535a5f Mon Sep 17 00:00:00 2001 From: Dion Date: Mon, 11 Nov 2024 09:34:06 +0100 Subject: [PATCH] WebP reading --- .../Helpers/ExtensionRolesHelper.cs | 10 ++++- .../src/interfaces/IFileIndexItem.ts | 3 +- .../CreateAnImageWebP/CreateAnImageWebP.cs | 37 ++++++++++++++++++ .../FakeCreateAn/CreateAnImageWebP/test.webp | Bin 0 -> 23106 bytes .../Services/ReadMeta_ExifReadTest.cs | 36 +++++++++++++++++ starsky/starskytest/starskytest.csproj | 4 ++ 6 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 starsky/starskytest/FakeCreateAn/CreateAnImageWebP/CreateAnImageWebP.cs create mode 100644 starsky/starskytest/FakeCreateAn/CreateAnImageWebP/test.webp diff --git a/starsky/starsky.foundation.platform/Helpers/ExtensionRolesHelper.cs b/starsky/starsky.foundation.platform/Helpers/ExtensionRolesHelper.cs index 3c02bfb494..68f5efcc85 100644 --- a/starsky/starsky.foundation.platform/Helpers/ExtensionRolesHelper.cs +++ b/starsky/starsky.foundation.platform/Helpers/ExtensionRolesHelper.cs @@ -25,6 +25,7 @@ public enum ImageFormat bmp = 13, gif = 14, png = 15, + webp = 16, // Sidecar files xmp = 30, @@ -109,6 +110,12 @@ private static readonly List /// private static readonly List ExtensionMp4 = new() { "mp4", "mov" }; + /// + /// WebP imageFormat + /// + private static readonly List ExtensionWebp = new() { "webp" }; + + private static readonly Dictionary> MapFileTypesToExtensionDictionary = new() @@ -120,7 +127,8 @@ private static readonly Dictionary> { ImageFormat.png, ExtensionPng }, { ImageFormat.gpx, ExtensionGpx }, { ImageFormat.mp4, ExtensionMp4 }, - { ImageFormat.xmp, ExtensionXmp } + { ImageFormat.xmp, ExtensionXmp }, + { ImageFormat.webp, ExtensionWebp } }; /// diff --git a/starsky/starsky/clientapp/src/interfaces/IFileIndexItem.ts b/starsky/starsky/clientapp/src/interfaces/IFileIndexItem.ts index 22e07d4990..d0e6b69e47 100644 --- a/starsky/starsky/clientapp/src/interfaces/IFileIndexItem.ts +++ b/starsky/starsky/clientapp/src/interfaces/IFileIndexItem.ts @@ -1,4 +1,4 @@ -import { IExifStatus } from "./IExifStatus"; +import {IExifStatus} from "./IExifStatus"; export interface IFileIndexItem { lastEdited?: string; @@ -44,6 +44,7 @@ export enum ImageFormat { bmp = "bmp", gif = "gif", png = "png", + webp = "webp", xmp = "xmp", meta_json = "meta_json", gpx = "gpx", diff --git a/starsky/starskytest/FakeCreateAn/CreateAnImageWebP/CreateAnImageWebP.cs b/starsky/starskytest/FakeCreateAn/CreateAnImageWebP/CreateAnImageWebP.cs new file mode 100644 index 0000000000..9502a53b4a --- /dev/null +++ b/starsky/starskytest/FakeCreateAn/CreateAnImageWebP/CreateAnImageWebP.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Immutable; +using System.IO; +using System.Reflection; +using starsky.foundation.storage.Storage; +using starskytest.FakeMocks; + +namespace starskytest.FakeCreateAn.CreateAnImageWebP; + +public class CreateAnImageWebP +{ + public readonly ImmutableArray Bytes = [..Array.Empty()]; + + public CreateAnImageWebP() + { + var dirName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + if ( string.IsNullOrEmpty(dirName) ) + { + return; + } + + var path = Path.Combine(dirName, "FakeCreateAn", + "CreateAnImageWebP", "test.webp"); + + Bytes = [..StreamToBytes(path)]; + } + + private static byte[] StreamToBytes(string path) + { + var input = new StorageHostFullPathFilesystem(new FakeIWebLogger()).ReadStream(path); + using var ms = new MemoryStream(); + input.CopyTo(ms); + input.Dispose(); + return ms.ToArray(); + } +} + diff --git a/starsky/starskytest/FakeCreateAn/CreateAnImageWebP/test.webp b/starsky/starskytest/FakeCreateAn/CreateAnImageWebP/test.webp new file mode 100644 index 0000000000000000000000000000000000000000..ec0f71f3fe71e631d599ca332da0442bebb447a0 GIT binary patch literal 23106 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 { "/" }, + new List { "/test.webp" }, new List { newImage }); + + var item = + new ReadMetaExif(fakeStorage, null!, new FakeIWebLogger()).ReadExifFromFile( + "/test.dng"); + + Assert.AreEqual(ColorClassParser.Color.None, item.ColorClass); + Assert.AreEqual(string.Empty, item.Description); + Assert.IsFalse(item.IsDirectory); + Assert.AreEqual(string.Empty, item.Tags); + Assert.AreEqual(string.Empty, item.Title); + Assert.AreEqual(0, item.Latitude, 0.000001); + Assert.AreEqual(0, item.Longitude, 0.000001); + // Assert.AreEqual(4000, item.ImageHeight); + // Assert.AreEqual(6000, item.ImageWidth); + Assert.AreEqual(string.Empty, item.LocationCity); + Assert.AreEqual(string.Empty, item.LocationState); + Assert.AreEqual(string.Empty, item.LocationCountry); + Assert.AreEqual(0, item.LocationAltitude); + Assert.AreEqual(0, item.FocalLength); + Assert.AreEqual(new DateTime(0001, 01, 1, 0, 0, 0, DateTimeKind.Local), + item.DateTime); + + Assert.AreEqual(string.Empty, item.MakeModel); + Assert.AreEqual("Sony", item.Make); + Assert.AreEqual("ILCE-6600", item.Model); + Assert.AreEqual("E 18-200mm F3.5-6.3 OSS LE", item.LensModel); + Assert.AreEqual(ImageStabilisationType.On, item.ImageStabilisation); + } [TestMethod] public void ExifRead_CreateAnImageA330Raw_ReadExifFromFileTest() diff --git a/starsky/starskytest/starskytest.csproj b/starsky/starskytest/starskytest.csproj index c8a0a0c94f..3bd2106c58 100644 --- a/starsky/starskytest/starskytest.csproj +++ b/starsky/starskytest/starskytest.csproj @@ -135,6 +135,10 @@ PreserveNewest + + + PreserveNewest +