WEBP Support

Magnolia

Seit Magnolia 6.2.12 wird WEBP offiziell unterstützt, aber der WEBP-Support ist aber nicht vollständig. Die Ermittlungslogik der Bilddimensionen für die Metadaten des Assets unterstützt WEBP nicht, weshalb diese Werte nicht in den Metadaten gespeichert werden können.
Dies ist bei Magnolia unter dem Bug-Ticket MGNLDAM-1260 bekannt.

Um diese Metadaten trotzdem in den Assets zu speichern, stellen wir ein Script bereit, welches diese beiden Werte in alle WEBP Assets nachträglich speichern kann. Des Weiteren wird ein Observer vom Modul vorkonfiguriert, der optional aktiviert werden kann, um bei neuen Assets direkt die Auflösung zu speichern.

Script

Verwenden Sie die Konfigurationsvariablen unter den Importen, um einen Trockenlauf durchzuführen.

import com.dev5310.imageresizer.support.webp.ImageDimensionSetter
import info.magnolia.cms.util.QueryUtil
import info.magnolia.dam.core.config.DamCoreConfiguration
import info.magnolia.dam.jcr.AssetNodeTypes
import info.magnolia.dam.jcr.DamConstants
import info.magnolia.dam.jcr.JcrAsset
import info.magnolia.dam.jcr.JcrAssetProvider
import info.magnolia.jcr.util.PropertyUtil
import info.magnolia.objectfactory.Components

import javax.jcr.Node
import javax.jcr.NodeIterator
import javax.jcr.Session

final boolean printFoundWebpImages = true
final boolean setAssetDimensions = false
final boolean save = false
final String targetMimeType = "image/webp"

final JcrAssetProvider jcrAssetProvider = new JcrAssetProvider(Components.getComponent(DamCoreConfiguration.class))
final Session session = ctx.getJCRSession(DamConstants.WORKSPACE)

println()
final NodeIterator search = QueryUtil.search(DamConstants.WORKSPACE, "SELECT * FROM [mgnl:asset]")
search.forEachRemaining(item -> {
    final Node node = (Node) item

    if (!node.hasNode(AssetNodeTypes.AssetResource.RESOURCE_NAME)) {
        return;
    }
    final Node resourceNode = node.getNode(AssetNodeTypes.AssetResource.RESOURCE_NAME)
    final String mimeType = PropertyUtil.getString(resourceNode, AssetNodeTypes.AssetResource.MIMETYPE, "Not Set")

    final long width = PropertyUtil.getLong(resourceNode, AssetNodeTypes.AssetResource.WIDTH, -1L)
    final long height = PropertyUtil.getLong(resourceNode, AssetNodeTypes.AssetResource.HEIGHT, -1L)
    if (printFoundWebpImages && targetMimeType == mimeType) {
        print("MIME Type: " + mimeType)
        print(" - ")
        print("Width: " + width)
        print(" - ")
        print("Height: " + height)
        print(" - ")
        print(node)
        println()
    }

    if (setAssetDimensions && targetMimeType == mimeType) {
        final JcrAsset jcrAsset = new JcrAsset(jcrAssetProvider, node)
        final boolean success = ImageDimensionSetter.tryToSetMissingOrWrongAssetDimensions(jcrAsset)
        if (success) {
            println("Successfully set dimensions of asset: " + node)
        } else {
            println("Failed to set dimensions of asset: " + node)
        }
    }
})

if (save && session.hasPendingChanges()) {
    session.save()
}

session.logout() // To prevent unclosed session detected stack trace

"done"

Observer

Der Observer kan in der Configurations-App unter den Pfad /modules/observation/config/listenerConfigurations/addAssetDimensionsIfMissing@active aktiviert werden.

Observer Config Observer Config

ARM Mac

Ab Modulversion 2.7.0 und Magnolia 6.2.37 können wir garantieren das WEBP Bilder auf ARM Macs generiert werden können, da Magnolia die benötigten Abhängigkeiten nun selbst mitbringt.

Auf ARM-Macs können keine WEBP-Bilder verarbeitet werden, weil es keine Library für dieses System gibt. Dies führt zu problemen, wenn versucht wird ein WEBP-Bild zu generieren und der Server nativ läuft (ohne Rosetta). Um diese Probleme vorzubeugen, wird das Konvertieren von anderen Formaten zu WEBP auf ARM Macs nicht unterstützt und stattdessen wird das originale Format zurückgegeben.