From 2ae9ea4a8fcf9e38368b2ea43d115d680c91fb94 Mon Sep 17 00:00:00 2001 From: Tony Gledhill Date: Tue, 18 Jun 2024 10:24:43 +0100 Subject: [PATCH 1/4] Added media library warnings --- .github/README.md | 22 ++++++ docs/README_nuget.md | 25 ++++++- .../appsettings.json | 6 ++ .../Configuration/MediaLibraryOptions.cs | 10 +++ ...diaTreeNodeRenderingNotificationHandler.cs | 57 +++++++++++++++ .../Services/MediaItemService.cs | 69 +++++++++++++++++++ .../Services/MediaLibraryService.cs | 28 ++++++++ .../SustainabilityComposer.cs | 7 ++ .../SustainabilityManifestFilter.cs | 2 +- .../Umbraco.Community.Sustainability.csproj | 5 +- .../styles/medialibrary.css | 4 ++ 11 files changed, 230 insertions(+), 5 deletions(-) create mode 100644 src/Umbraco.Community.Sustainability/Configuration/MediaLibraryOptions.cs create mode 100644 src/Umbraco.Community.Sustainability/Notifications/MediaTreeNodeRenderingNotificationHandler.cs create mode 100644 src/Umbraco.Community.Sustainability/Services/MediaItemService.cs create mode 100644 src/Umbraco.Community.Sustainability/Services/MediaLibraryService.cs create mode 100644 src/Umbraco.Community.Sustainability/wwwroot/UmbracoCommunitySustainability/styles/medialibrary.css diff --git a/.github/README.md b/.github/README.md index d6d215d..72bd119 100644 --- a/.github/README.md +++ b/.github/README.md @@ -49,6 +49,28 @@ Add the package to an existing Umbraco website from nuget: Once added, a new Content App will be available alongside your Umbraco pages allowing you to trigger a sustainability report. +## Configuration + +You will need to add the following configuration to you appSettings.json file. +The AcceptedFileTypes are the media types that you can create in the media library, not the file extensions of your files + + ``` + "Umbraco": { + "CMS":{ + "MediaLibrary" : { + "Optimisation":{ + "Enable" : bool, + "AcceptedFileTypes" : + { + "<>" : "<>", + "<>" : "<>" + } + } + } + } + } + ``` + ## Contributing Contributions to this package are most welcome! Please read the [Contributing Guidelines](CONTRIBUTING.md) for how to get involved. diff --git a/docs/README_nuget.md b/docs/README_nuget.md index 27b5924..615b6da 100644 --- a/docs/README_nuget.md +++ b/docs/README_nuget.md @@ -33,8 +33,31 @@ Add the package to an existing Umbraco website from NuGet: Once added, a new Content App will be available alongside your Umbraco pages allowing you to trigger a sustainability report. +## Configuration + +You will need to add the following configuration to you appSettings.json file. +The AcceptedFileTypes are the media types that you can create in the media library, not the file extensions of your files + + ``` + "Umbraco": { + "CMS":{ + "MediaLibrary" : { + "Optimisation":{ + "Enable" : bool, + "AcceptedFileTypes" : + { + "<>" : "<>", + "<>" : "<>" + } + } + } + } + } + ``` + + ## License -Copyright © [Rick Butterfield](https://github.com/rickbutterfield), [Thomas Morris](https://github.com/tcmorris) and other contributors. +Copyright © [Rick Butterfield](https://github.com/rickbutterfield), [Thomas Morris](https://github.com/tcmorris), [Tony Gledhill](https://github.com/tony-gledhill) and other contributors. Licensed under the [MIT License](https://github.com/rickbutterfield/Umbraco.Community.Sustainability/blob/main/LICENSE.md). diff --git a/src/Umbraco.Community.Sustainability.TestSite.13.x/appsettings.json b/src/Umbraco.Community.Sustainability.TestSite.13.x/appsettings.json index 1bf5dbc..07fcbad 100644 --- a/src/Umbraco.Community.Sustainability.TestSite.13.x/appsettings.json +++ b/src/Umbraco.Community.Sustainability.TestSite.13.x/appsettings.json @@ -16,6 +16,12 @@ }, "Umbraco": { "CMS": { + "MediaLibrary": { + "Optimisation": { + "Enabled": true, + "AcceptedFileTypes": { "Image": "500000" } + } + }, "Global": { "Id": "4bf4d037-bbbd-4247-abce-fc2a66b9a1e6", "SanitizeTinyMce": true diff --git a/src/Umbraco.Community.Sustainability/Configuration/MediaLibraryOptions.cs b/src/Umbraco.Community.Sustainability/Configuration/MediaLibraryOptions.cs new file mode 100644 index 0000000..cf6ce8c --- /dev/null +++ b/src/Umbraco.Community.Sustainability/Configuration/MediaLibraryOptions.cs @@ -0,0 +1,10 @@ +namespace Umbraco.Community.Sustainability.Configuration +{ + public class MediaLibraryOptions + { + public const string SectionAlias = "Umbraco:CMS:MediaLibrary:Optimisation"; + + public bool Enabled { get; set; } + public Dictionary AcceptedFileTypes { get; set; } = new Dictionary(); + } +} diff --git a/src/Umbraco.Community.Sustainability/Notifications/MediaTreeNodeRenderingNotificationHandler.cs b/src/Umbraco.Community.Sustainability/Notifications/MediaTreeNodeRenderingNotificationHandler.cs new file mode 100644 index 0000000..b72b707 --- /dev/null +++ b/src/Umbraco.Community.Sustainability/Notifications/MediaTreeNodeRenderingNotificationHandler.cs @@ -0,0 +1,57 @@ +using Microsoft.Extensions.Logging; +using Umbraco.Cms.Core.Events; +using Umbraco.Cms.Core.Notifications; +using Umbraco.Community.Sustainability.Services; + +namespace Umbraco.Community.Sustainability.Notifications +{ + public class MediaTreeNodeRenderingNotificationHandler : INotificationHandler + { + private readonly ILogger _logger; + private readonly IImageSizeService _imageSizeService; + private readonly IMediaLibraryService _mediaLibraryService; + + public MediaTreeNodeRenderingNotificationHandler(ILogger logger, + IImageSizeService imageService, IMediaLibraryService mediaLibraryService) + { + _logger = logger; + _imageSizeService = imageService; + _mediaLibraryService = mediaLibraryService; + } + + public void Handle(TreeNodesRenderingNotification notification) + { + if (notification.TreeAlias == Cms.Core.Constants.Trees.Media) + { + foreach (var node in notification.Nodes) + { + int.TryParse(node?.Id?.ToString(), out int nodeId); + + if (nodeId > 0) + { + var mediaItem = _mediaLibraryService.GetMediaLibraryFile(nodeId); + + if (mediaItem == null) + { + continue; + } + + var acceptedFileType = _imageSizeService.AcceptedFileExtension(mediaItem); + if (!acceptedFileType) + { + continue; + } + + var acceptedFileSize = _imageSizeService.AcceptedFileSize(mediaItem); + if (!acceptedFileSize) + { + node.CssClasses.Add("image-size-css"); + node.Icon = "icon-thumb-down"; + _logger.LogWarning($"Image Size Warning: Node Id: {node.Id} || Node Name: {node.Name}"); + } + } + } + } + } + } +} diff --git a/src/Umbraco.Community.Sustainability/Services/MediaItemService.cs b/src/Umbraco.Community.Sustainability/Services/MediaItemService.cs new file mode 100644 index 0000000..8d4d647 --- /dev/null +++ b/src/Umbraco.Community.Sustainability/Services/MediaItemService.cs @@ -0,0 +1,69 @@ +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Community.Sustainability.Configuration; +using Umbraco.Extensions; + +namespace Umbraco.Community.Sustainability.Services +{ + public interface IImageSizeService + { + bool AcceptedFileSize(IPublishedContent content); + bool AcceptedFileExtension(IPublishedContent content); + } + public class ImageSizeService : IImageSizeService + { + private readonly ILogger _logger; + private readonly IOptions _settings; + + public ImageSizeService(ILogger logger, IOptions settings) + { + _logger = logger; + _settings = settings; + } + + public bool AcceptedFileExtension(IPublishedContent content) + { + try + { + var fileTypes = _settings.Value.AcceptedFileTypes; + + return fileTypes.Any(x => x.Key.ToLowerInvariant() == content.ContentType.Alias.ToLowerInvariant()); + } + catch (Exception ex) + { + _logger.LogError(ex.Message, ex); + throw; + } + } + + public bool AcceptedFileSize(IPublishedContent content) + { + try + { + var imageSize = content.Value("umbracoBytes"); + var fileTypes = _settings.Value.AcceptedFileTypes; + var acceptedFileSize = fileTypes.Where(x => x.Key.ToLowerInvariant() == content.ContentType.Alias.ToLowerInvariant()).FirstOrDefault(); + + if (acceptedFileSize.Equals(default(KeyValuePair))) + { + return false; + } + + long maxAcceptedFileSize = (long)Convert.ToDouble(acceptedFileSize.Value); + + if (imageSize >= maxAcceptedFileSize) + { + return false; + } + + return true; + } + catch (Exception ex) + { + _logger.LogError(ex.Message, ex); + throw; + } + } + } +} diff --git a/src/Umbraco.Community.Sustainability/Services/MediaLibraryService.cs b/src/Umbraco.Community.Sustainability/Services/MediaLibraryService.cs new file mode 100644 index 0000000..f0b9f49 --- /dev/null +++ b/src/Umbraco.Community.Sustainability/Services/MediaLibraryService.cs @@ -0,0 +1,28 @@ +using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Cms.Core.Web; + +namespace Umbraco.Community.Sustainability.Services +{ + public interface IMediaLibraryService + { + IPublishedContent? GetMediaLibraryFile(int nodeId); + } + + public class MediaLibraryService : IMediaLibraryService + { + private readonly IUmbracoContextFactory _umbracoContextFactory; + + public MediaLibraryService(IUmbracoContextFactory umbracoContextFactor) + { + _umbracoContextFactory = umbracoContextFactor; + } + public IPublishedContent? GetMediaLibraryFile(int nodeId) + { + using var umbracoContextReference = _umbracoContextFactory.EnsureUmbracoContext(); + + var mediaItem = umbracoContextReference?.UmbracoContext?.Media?.GetById(nodeId); + + return mediaItem ?? null; + } + } +} diff --git a/src/Umbraco.Community.Sustainability/SustainabilityComposer.cs b/src/Umbraco.Community.Sustainability/SustainabilityComposer.cs index ff6cf62..d671b9a 100644 --- a/src/Umbraco.Community.Sustainability/SustainabilityComposer.cs +++ b/src/Umbraco.Community.Sustainability/SustainabilityComposer.cs @@ -2,6 +2,7 @@ using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Notifications; +using Umbraco.Community.Sustainability.Configuration; using Umbraco.Community.Sustainability.ContentApps; using Umbraco.Community.Sustainability.Notifications; using Umbraco.Community.Sustainability.Sections; @@ -30,6 +31,12 @@ public void Compose(IUmbracoBuilder builder) builder.Services.AddScoped(); builder.Services.AddSingleton(); + + builder.Services.AddOptions().Bind(builder.Config.GetSection(MediaLibraryOptions.SectionAlias)); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.AddNotificationHandler(); + } } } diff --git a/src/Umbraco.Community.Sustainability/SustainabilityManifestFilter.cs b/src/Umbraco.Community.Sustainability/SustainabilityManifestFilter.cs index 391436f..a841492 100644 --- a/src/Umbraco.Community.Sustainability/SustainabilityManifestFilter.cs +++ b/src/Umbraco.Community.Sustainability/SustainabilityManifestFilter.cs @@ -25,7 +25,7 @@ public void Filter(List manifests) { // List any Stylesheet files // Urls should start '/App_Plugins/UmbracoCommunitySustainability/' not '/wwwroot/Umbraco.Community.Sustainability/', e.g. - // "/App_Plugins/UmbracoCommunitySustainability/Styles/styles.css" + "/App_Plugins/UmbracoCommunitySustainability/Styles/medialibrary.css" } }); } diff --git a/src/Umbraco.Community.Sustainability/Umbraco.Community.Sustainability.csproj b/src/Umbraco.Community.Sustainability/Umbraco.Community.Sustainability.csproj index 4e7bed9..d802de6 100644 --- a/src/Umbraco.Community.Sustainability/Umbraco.Community.Sustainability.csproj +++ b/src/Umbraco.Community.Sustainability/Umbraco.Community.Sustainability.csproj @@ -16,7 +16,7 @@ Umbraco.Community.Sustainability True - 1.0.3 + 1.0.4 Umbraco Sustainability Community Team $([System.DateTime]::UtcNow.ToString(`yyyy`)) © Umbraco Sustainability Community Team @@ -57,6 +57,5 @@ True \ - - + diff --git a/src/Umbraco.Community.Sustainability/wwwroot/UmbracoCommunitySustainability/styles/medialibrary.css b/src/Umbraco.Community.Sustainability/wwwroot/UmbracoCommunitySustainability/styles/medialibrary.css new file mode 100644 index 0000000..8102363 --- /dev/null +++ b/src/Umbraco.Community.Sustainability/wwwroot/UmbracoCommunitySustainability/styles/medialibrary.css @@ -0,0 +1,4 @@ +.image-size-css { + background-color: red; + color: white; +} From 2b05e907744ca72324ccd73fdf8c50df91ba724e Mon Sep 17 00:00:00 2001 From: Thomas Morris Date: Thu, 7 Nov 2024 15:57:38 +0000 Subject: [PATCH 2/4] refactor: media warnings --- .../appsettings.json | 13 ++-- .../Configuration/MediaLibraryOptions.cs | 10 --- .../MediaOptimisationConfiguration.cs | 9 +++ .../SustainabilityConfiguration.cs | 10 +++ ...diaTreeNodeRenderingNotificationHandler.cs | 47 ++++--------- .../Services/MediaItemService.cs | 69 ------------------- .../Services/MediaLibraryService.cs | 28 -------- .../Services/MediaOptimisationService.cs | 56 +++++++++++++++ .../SustainabilityComposer.cs | 12 ++-- .../styles/medialibrary.css | 4 -- 10 files changed, 104 insertions(+), 154 deletions(-) delete mode 100644 src/Umbraco.Community.Sustainability/Configuration/MediaLibraryOptions.cs create mode 100644 src/Umbraco.Community.Sustainability/Configuration/MediaOptimisationConfiguration.cs create mode 100644 src/Umbraco.Community.Sustainability/Configuration/SustainabilityConfiguration.cs delete mode 100644 src/Umbraco.Community.Sustainability/Services/MediaItemService.cs delete mode 100644 src/Umbraco.Community.Sustainability/Services/MediaLibraryService.cs create mode 100644 src/Umbraco.Community.Sustainability/Services/MediaOptimisationService.cs delete mode 100644 src/Umbraco.Community.Sustainability/wwwroot/UmbracoCommunitySustainability/styles/medialibrary.css diff --git a/src/Umbraco.Community.Sustainability.TestSite.13.x/appsettings.json b/src/Umbraco.Community.Sustainability.TestSite.13.x/appsettings.json index 07fcbad..47dc540 100644 --- a/src/Umbraco.Community.Sustainability.TestSite.13.x/appsettings.json +++ b/src/Umbraco.Community.Sustainability.TestSite.13.x/appsettings.json @@ -16,12 +16,6 @@ }, "Umbraco": { "CMS": { - "MediaLibrary": { - "Optimisation": { - "Enabled": true, - "AcceptedFileTypes": { "Image": "500000" } - } - }, "Global": { "Id": "4bf4d037-bbbd-4247-abce-fc2a66b9a1e6", "SanitizeTinyMce": true @@ -40,5 +34,12 @@ "UpgradeUnattended": true } } + }, + "UmbracoCommunitySustainability": { + "Enabled": true, + "MediaOptimisation": { + "ShowWarnings": true, + "FileTypes": { "Image": "2000000" } + } } } diff --git a/src/Umbraco.Community.Sustainability/Configuration/MediaLibraryOptions.cs b/src/Umbraco.Community.Sustainability/Configuration/MediaLibraryOptions.cs deleted file mode 100644 index cf6ce8c..0000000 --- a/src/Umbraco.Community.Sustainability/Configuration/MediaLibraryOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Umbraco.Community.Sustainability.Configuration -{ - public class MediaLibraryOptions - { - public const string SectionAlias = "Umbraco:CMS:MediaLibrary:Optimisation"; - - public bool Enabled { get; set; } - public Dictionary AcceptedFileTypes { get; set; } = new Dictionary(); - } -} diff --git a/src/Umbraco.Community.Sustainability/Configuration/MediaOptimisationConfiguration.cs b/src/Umbraco.Community.Sustainability/Configuration/MediaOptimisationConfiguration.cs new file mode 100644 index 0000000..aa0c61e --- /dev/null +++ b/src/Umbraco.Community.Sustainability/Configuration/MediaOptimisationConfiguration.cs @@ -0,0 +1,9 @@ +namespace Umbraco.Community.Sustainability.Configuration +{ + public class MediaOptimisationConfiguration + { + public bool ShowWarnings { get; set; } = false; + + public Dictionary FileTypes { get; set; } + } +} diff --git a/src/Umbraco.Community.Sustainability/Configuration/SustainabilityConfiguration.cs b/src/Umbraco.Community.Sustainability/Configuration/SustainabilityConfiguration.cs new file mode 100644 index 0000000..634c1ca --- /dev/null +++ b/src/Umbraco.Community.Sustainability/Configuration/SustainabilityConfiguration.cs @@ -0,0 +1,10 @@ +namespace Umbraco.Community.Sustainability.Configuration +{ + public class SustainabilityConfiguration + { + public const string SectionAlias = "UmbracoCommunitySustainability"; + + public bool Enabled { get; set; } = true; + public MediaOptimisationConfiguration MediaOptimisation { get; set; } + } +} diff --git a/src/Umbraco.Community.Sustainability/Notifications/MediaTreeNodeRenderingNotificationHandler.cs b/src/Umbraco.Community.Sustainability/Notifications/MediaTreeNodeRenderingNotificationHandler.cs index b72b707..07351bb 100644 --- a/src/Umbraco.Community.Sustainability/Notifications/MediaTreeNodeRenderingNotificationHandler.cs +++ b/src/Umbraco.Community.Sustainability/Notifications/MediaTreeNodeRenderingNotificationHandler.cs @@ -1,54 +1,37 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Notifications; +using Umbraco.Community.Sustainability.Configuration; using Umbraco.Community.Sustainability.Services; namespace Umbraco.Community.Sustainability.Notifications { public class MediaTreeNodeRenderingNotificationHandler : INotificationHandler { - private readonly ILogger _logger; - private readonly IImageSizeService _imageSizeService; - private readonly IMediaLibraryService _mediaLibraryService; + private readonly IMediaOptimisationService _mediaOptimisationService; + private readonly SustainabilityConfiguration _configuration; - public MediaTreeNodeRenderingNotificationHandler(ILogger logger, - IImageSizeService imageService, IMediaLibraryService mediaLibraryService) + public MediaTreeNodeRenderingNotificationHandler( + IMediaOptimisationService mediaOptimisationService, + IOptions configuration) { - _logger = logger; - _imageSizeService = imageService; - _mediaLibraryService = mediaLibraryService; + _mediaOptimisationService = mediaOptimisationService; + _configuration = configuration.Value; } public void Handle(TreeNodesRenderingNotification notification) { - if (notification.TreeAlias == Cms.Core.Constants.Trees.Media) + if (_configuration.Enabled + && _configuration.MediaOptimisation.ShowWarnings + && notification.TreeAlias == Cms.Core.Constants.Trees.Media) { foreach (var node in notification.Nodes) { - int.TryParse(node?.Id?.ToString(), out int nodeId); + int.TryParse(node.Id.ToString(), out int nodeId); - if (nodeId > 0) + if (_mediaOptimisationService.ShowMediaWarning(nodeId)) { - var mediaItem = _mediaLibraryService.GetMediaLibraryFile(nodeId); - - if (mediaItem == null) - { - continue; - } - - var acceptedFileType = _imageSizeService.AcceptedFileExtension(mediaItem); - if (!acceptedFileType) - { - continue; - } - - var acceptedFileSize = _imageSizeService.AcceptedFileSize(mediaItem); - if (!acceptedFileSize) - { - node.CssClasses.Add("image-size-css"); - node.Icon = "icon-thumb-down"; - _logger.LogWarning($"Image Size Warning: Node Id: {node.Id} || Node Name: {node.Name}"); - } + node.Icon = "icon-alert-alt color-red"; } } } diff --git a/src/Umbraco.Community.Sustainability/Services/MediaItemService.cs b/src/Umbraco.Community.Sustainability/Services/MediaItemService.cs deleted file mode 100644 index 8d4d647..0000000 --- a/src/Umbraco.Community.Sustainability/Services/MediaItemService.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Umbraco.Cms.Core.Models.PublishedContent; -using Umbraco.Community.Sustainability.Configuration; -using Umbraco.Extensions; - -namespace Umbraco.Community.Sustainability.Services -{ - public interface IImageSizeService - { - bool AcceptedFileSize(IPublishedContent content); - bool AcceptedFileExtension(IPublishedContent content); - } - public class ImageSizeService : IImageSizeService - { - private readonly ILogger _logger; - private readonly IOptions _settings; - - public ImageSizeService(ILogger logger, IOptions settings) - { - _logger = logger; - _settings = settings; - } - - public bool AcceptedFileExtension(IPublishedContent content) - { - try - { - var fileTypes = _settings.Value.AcceptedFileTypes; - - return fileTypes.Any(x => x.Key.ToLowerInvariant() == content.ContentType.Alias.ToLowerInvariant()); - } - catch (Exception ex) - { - _logger.LogError(ex.Message, ex); - throw; - } - } - - public bool AcceptedFileSize(IPublishedContent content) - { - try - { - var imageSize = content.Value("umbracoBytes"); - var fileTypes = _settings.Value.AcceptedFileTypes; - var acceptedFileSize = fileTypes.Where(x => x.Key.ToLowerInvariant() == content.ContentType.Alias.ToLowerInvariant()).FirstOrDefault(); - - if (acceptedFileSize.Equals(default(KeyValuePair))) - { - return false; - } - - long maxAcceptedFileSize = (long)Convert.ToDouble(acceptedFileSize.Value); - - if (imageSize >= maxAcceptedFileSize) - { - return false; - } - - return true; - } - catch (Exception ex) - { - _logger.LogError(ex.Message, ex); - throw; - } - } - } -} diff --git a/src/Umbraco.Community.Sustainability/Services/MediaLibraryService.cs b/src/Umbraco.Community.Sustainability/Services/MediaLibraryService.cs deleted file mode 100644 index f0b9f49..0000000 --- a/src/Umbraco.Community.Sustainability/Services/MediaLibraryService.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Umbraco.Cms.Core.Models.PublishedContent; -using Umbraco.Cms.Core.Web; - -namespace Umbraco.Community.Sustainability.Services -{ - public interface IMediaLibraryService - { - IPublishedContent? GetMediaLibraryFile(int nodeId); - } - - public class MediaLibraryService : IMediaLibraryService - { - private readonly IUmbracoContextFactory _umbracoContextFactory; - - public MediaLibraryService(IUmbracoContextFactory umbracoContextFactor) - { - _umbracoContextFactory = umbracoContextFactor; - } - public IPublishedContent? GetMediaLibraryFile(int nodeId) - { - using var umbracoContextReference = _umbracoContextFactory.EnsureUmbracoContext(); - - var mediaItem = umbracoContextReference?.UmbracoContext?.Media?.GetById(nodeId); - - return mediaItem ?? null; - } - } -} diff --git a/src/Umbraco.Community.Sustainability/Services/MediaOptimisationService.cs b/src/Umbraco.Community.Sustainability/Services/MediaOptimisationService.cs new file mode 100644 index 0000000..54148cc --- /dev/null +++ b/src/Umbraco.Community.Sustainability/Services/MediaOptimisationService.cs @@ -0,0 +1,56 @@ +using Microsoft.Extensions.Options; +using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Cms.Core.Web; +using Umbraco.Community.Sustainability.Configuration; +using Umbraco.Extensions; + +namespace Umbraco.Community.Sustainability.Services +{ + public interface IMediaOptimisationService + { + bool ShowMediaWarning(int nodeId); + } + + public class MediaOptimisationService : IMediaOptimisationService + { + private readonly IUmbracoContextFactory _umbracoContextFactory; + private readonly SustainabilityConfiguration _configuration; + + public MediaOptimisationService( + IUmbracoContextFactory umbracoContextFactory, + IOptions configuration) + { + _umbracoContextFactory = umbracoContextFactory; + _configuration = configuration.Value; + } + + public bool ShowMediaWarning(int nodeId) + { + var mediaItem = GetMediaFile(nodeId); + if (mediaItem == null) + { + return false; + } + + var fileTypes = _configuration.MediaOptimisation.FileTypes; + if (!fileTypes.Any(x => x.Key.InvariantEquals(mediaItem.ContentType.Alias))) + { + return false; + } + + var imageSize = mediaItem.Value("umbracoBytes"); + var acceptedFileSize = fileTypes.FirstOrDefault(x => x.Key.InvariantEquals(mediaItem.ContentType.Alias)); + + long maxAcceptedFileSize = (long)Convert.ToDouble(acceptedFileSize.Value); + + return imageSize > maxAcceptedFileSize; + } + + private IPublishedContent? GetMediaFile(int nodeId) + { + using var umbracoContextReference = _umbracoContextFactory.EnsureUmbracoContext(); + + return umbracoContextReference.UmbracoContext.Media?.GetById(nodeId); + } + } +} diff --git a/src/Umbraco.Community.Sustainability/SustainabilityComposer.cs b/src/Umbraco.Community.Sustainability/SustainabilityComposer.cs index d671b9a..187bf3f 100644 --- a/src/Umbraco.Community.Sustainability/SustainabilityComposer.cs +++ b/src/Umbraco.Community.Sustainability/SustainabilityComposer.cs @@ -23,20 +23,22 @@ public void Compose(IUmbracoBuilder builder) throw new Exception($"Playwright exited with code {exitCode}"); } + // startup builder.AddNotificationHandler(); builder.ManifestFilters().Append(); - builder.ContentApps().Append(); + // ui + builder.ContentApps().Append(); builder.Sections().Append(); + // services builder.Services.AddScoped(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddOptions().Bind(builder.Config.GetSection(SustainabilityConfiguration.SectionAlias)); - builder.Services.AddOptions().Bind(builder.Config.GetSection(MediaLibraryOptions.SectionAlias)); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); + // notifications builder.AddNotificationHandler(); - } } } diff --git a/src/Umbraco.Community.Sustainability/wwwroot/UmbracoCommunitySustainability/styles/medialibrary.css b/src/Umbraco.Community.Sustainability/wwwroot/UmbracoCommunitySustainability/styles/medialibrary.css deleted file mode 100644 index 8102363..0000000 --- a/src/Umbraco.Community.Sustainability/wwwroot/UmbracoCommunitySustainability/styles/medialibrary.css +++ /dev/null @@ -1,4 +0,0 @@ -.image-size-css { - background-color: red; - color: white; -} From 0cb73067a8000879317b926f3f6918593adfbdd4 Mon Sep 17 00:00:00 2001 From: Thomas Morris Date: Thu, 7 Nov 2024 16:01:32 +0000 Subject: [PATCH 3/4] update README example --- .github/README.md | 20 ++++++-------------- docs/README_nuget.md | 22 +++++++--------------- 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/.github/README.md b/.github/README.md index 72bd119..63197d8 100644 --- a/.github/README.md +++ b/.github/README.md @@ -51,22 +51,14 @@ Once added, a new Content App will be available alongside your Umbraco pages all ## Configuration -You will need to add the following configuration to you appSettings.json file. -The AcceptedFileTypes are the media types that you can create in the media library, not the file extensions of your files +Example configuration that can be added for this package. ``` - "Umbraco": { - "CMS":{ - "MediaLibrary" : { - "Optimisation":{ - "Enable" : bool, - "AcceptedFileTypes" : - { - "<>" : "<>", - "<>" : "<>" - } - } - } + "UmbracoCommunitySustainability": { + "Enabled": true, + "MediaOptimisation": { + "ShowWarnings": true, + "FileTypes": { "Image": "2000000" } } } ``` diff --git a/docs/README_nuget.md b/docs/README_nuget.md index 615b6da..97ac44c 100644 --- a/docs/README_nuget.md +++ b/docs/README_nuget.md @@ -35,22 +35,14 @@ Once added, a new Content App will be available alongside your Umbraco pages all ## Configuration -You will need to add the following configuration to you appSettings.json file. -The AcceptedFileTypes are the media types that you can create in the media library, not the file extensions of your files +Example configuration that can be added for this package. ``` - "Umbraco": { - "CMS":{ - "MediaLibrary" : { - "Optimisation":{ - "Enable" : bool, - "AcceptedFileTypes" : - { - "<>" : "<>", - "<>" : "<>" - } - } - } + "UmbracoCommunitySustainability": { + "Enabled": true, + "MediaOptimisation": { + "ShowWarnings": true, + "FileTypes": { "Image": "2000000" } } } ``` @@ -58,6 +50,6 @@ The AcceptedFileTypes are the media types that you can create in the media libra ## License -Copyright © [Rick Butterfield](https://github.com/rickbutterfield), [Thomas Morris](https://github.com/tcmorris), [Tony Gledhill](https://github.com/tony-gledhill) and other contributors. +Copyright © [Rick Butterfield](https://github.com/rickbutterfield), [Thomas Morris](https://github.com/tcmorris) and other contributors. Licensed under the [MIT License](https://github.com/rickbutterfield/Umbraco.Community.Sustainability/blob/main/LICENSE.md). From 625adac1704959d053cb21253755c7537a19561a Mon Sep 17 00:00:00 2001 From: Thomas Morris Date: Thu, 7 Nov 2024 16:01:50 +0000 Subject: [PATCH 4/4] remove extra file in manifest filter --- .../SustainabilityManifestFilter.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Community.Sustainability/SustainabilityManifestFilter.cs b/src/Umbraco.Community.Sustainability/SustainabilityManifestFilter.cs index a841492..f5fe5fd 100644 --- a/src/Umbraco.Community.Sustainability/SustainabilityManifestFilter.cs +++ b/src/Umbraco.Community.Sustainability/SustainabilityManifestFilter.cs @@ -25,7 +25,6 @@ public void Filter(List manifests) { // List any Stylesheet files // Urls should start '/App_Plugins/UmbracoCommunitySustainability/' not '/wwwroot/Umbraco.Community.Sustainability/', e.g. - "/App_Plugins/UmbracoCommunitySustainability/Styles/medialibrary.css" } }); }