Releases: FriendsOfREDAXO/media_negotiator
Release list
6.2.2
[6.2.2] - 2026-06-29
Fixed
-
Focus-Point-Crop bleibt bei WebP/AVIF erhalten:
rex_effect_negotiatorverwendet inconvertWithFallback()jetzt die aktuell prozessierte Quelle aus der Effektkette ($this->media->getSource()) statt den Original-Dateipfad (getMediaPath()). -
Damit gehen Crops aus vorgeschalteten Effekten (z. B. Focus-Point-Fit) bei ausgehandelten Formaten nicht mehr verloren.
-
Converter-Kette vereinfacht: vips und Imagick geben nun direkt den konvertierten Bild-Blob zurück (statt
GdImage), womit der GD-Fallback entfällt. Fallback bei fehlschlagenden Konvertern ist jetzt das Original-Format (JPEG/PNG). -
Helper::vipsConvert()undHelper::imagickConvert()liefernstring|falsestattGdImage|false– GD wird nicht mehr zum Dekodieren der Converter-Ausgabe verwendet. -
rex_effect_negotiatornutzt eineconvertWithFallback()-Methode mittry/catch(\Throwable), um Converter-Fehler abzufangen ohne den Media-Request zu blockieren. -
Konvertierter Blob wird über
setSourceFromBlob()als Temp-Datei mit korrekter Format-Extension (.webp,.avif) gespeichert, was korrekte Content-Type- und Content-Disposition-Header sicherstellt. -
Gesamte
execute()-Logik in einentry/catch(\Throwable)-Block gewrappt, damit Negotiator-Fehler niemals einen Media-Manager-Request abbrechen.
6.2.1
[6.2.1] - 2026-06-25
Fixed
- Converter-Kette vereinfacht: vips und Imagick geben nun direkt den konvertierten Bild-Blob zurück (statt
GdImage), womit der GD-Fallback entfällt. Fallback bei fehlschlagenden Konvertern ist jetzt das Original-Format (JPEG/PNG). Helper::vipsConvert()undHelper::imagickConvert()liefernstring|falsestattGdImage|false– GD wird nicht mehr zum Dekodieren der Converter-Ausgabe verwendet.rex_effect_negotiatornutzt eineconvertWithFallback()-Methode mittry/catch(\Throwable), um Converter-Fehler abzufangen ohne den Media-Request zu blockieren.- Konvertierter Blob wird über
setSourceFromBlob()als Temp-Datei mit korrekter Format-Extension (.webp,.avif) gespeichert, was korrekte Content-Type- und Content-Disposition-Header sicherstellt.
6.2.0
Added
- Bild-Request-Probe: Die Setup-Seite lädt jetzt ein echtes 1×1-Pixel-Bild gegen das Backend und liest dabei den vom Browser tatsächlich bei Bild-Requests gesendeten Accept-Header aus. Damit wird korrekt angezeigt, ob der Browser
image/avifundimage/webpunterstützt – unabhängig vom Accept-Header des HTML-Seiten-Requests. - Neuer Backend-API-Endpunkt
rex_api_media_negotiator_probe(Backend-only, CSRF-frei für die Probe) speichert das Probe-Ergebnis in der Session und liefert es per JSON. - „Media Negotiator würde liefern"-Badge aktualisiert sich nach der Probe automatisch per JS auf den tatsächlichen Wert (AVIF/WebP/Original), inklusive Thumbs-up-Icon bei echtem Upgrade.
- Accept-Header wird nun getrennt angezeigt: Seiten-Request vs. Bild-Request.
Helper::avifDisabled()vonprivateaufpublichochgestuft.
Fixed
- Alle per JS oder
data-*-Attribut verwendeten URLs werden jetzt mitrex_url::backendController([...], false)gebaut (kein&in Fetch-/img.src-Kontexten). - Langer Accept-Header und User-Agent-String brechen nun korrekt um (
overflow-wrap,white-space: pre-wrap). - Warning-Zustand in
$statusRowundrenderProbeState()verwendet keine eigenen Textfarb-Klassen mehr – Bootstraplist-group-item-warningregelt Farben vollständig. - Veraltete Kommentare in
Helper.phpzur Safari-Accept-Header-Problematik aktualisiert (gefixt in Safari 16.4: „Fixed the accept header to correctly indicate AVIF
6.1.4]
[6.1.4] - 2026-05-04
Changed
- Die Architektur ist jetzt bewusst getrennt: Der Negotiator verwendet fuer AVIF/WebP automatisch libvips > Imagick > GD, waehrend der Effekt
srgb_preprocessfuer ICC-zu-sRGB-Konvertierungen wieder ausschliesslich auf Imagick setzt. - README auf den tatsaechlichen Stand gebracht: libvips wird nur fuer den Negotiator beschrieben, nicht mehr fuer den ICC-Fix.
Fixed
- Dokumentation und Changelog korrigiert: Der vorherige Eintrag zu
6.1.3suggerierte faelschlich einen aktiven vips-basierten ICC-Fix-Pfad. Tatsaechlich bleibt der farbkritische ICC-Workflow wieder auf dem bewaehrten Imagick-Pfad.
[6.1.3] - 2026-05-04
Added
- libvips-Support: Wenn die PHP-Extension
vipsinstalliert ist, wird sie automatisch bevorzugt eingesetzt (Priorität: vips › imagick › GD). libvips ist 3–8× schneller als Imagick und benötigt rund 10× weniger Arbeitsspeicher, da es im Streaming-Verfahren arbeitet statt das gesamte Bild in den RAM zu laden. Helper::vipsPossible(): Erkennt ob die vips-Extension verfügbar ist.Helper::vipsConvert(): Konvertiert einen Image-Blob via libvips zu WebP oder AVIF.Helper::getForceImagick(): Extrahiert dieforce_imagick-Config in eine eigene Methode.- Setup-Seite zeigt libvips-Status und -Version an.
- Hinweis in der Setup-Übersicht wenn libvips aktiv ist.
[6.1.2] - 2026-05-04
Performance
- Konfigurationswerte (
webp_quality,avif_quality,preferred_format,ua_fallback,disable_avif) werden jetzt per Request in statischen Eigenschaften gecacht –rex_config::get()wird nicht mehr bei jedem Effekt-Aufruf wiederholt aufgerufen. gd_info()wird nur noch einmal pro Request ausgeführt (gecacht in$gdInfoCache).webpPossible()undavifPossible()werden pro Request gecacht.- Format-Auflösung (Accept-Header + UA-Parsing) findet jetzt nur noch einmal statt:
boot.phpundrex_effect_negotiatorteilen sich das Ergebnis viaHelper::getRequestOutputFormat().
[6.1.1] - 2026-05-04
Fixed
- Imagick-Speicherleck behoben:
Imagick::destroy()wird nun nach jeder Konvertierung inimagickConvert()und imsrgb_preprocess-Effekt explizit aufgerufen, da Imagick nativen C-Heap-Speicher hält, den der PHP-Garbage-Collector nicht automatisch freigibt. getImagickFormats()cacht das Ergebnis jetzt prozessweit in$imagickFormatsCache, sodass pro Request nur noch eine einzigeImagick-Instanz erzeugt wird (statt einer prowebpPossible()/avifPossible()-Aufruf).
6.1.0
Added
- Neuer Effekt
srgb_preprocesszum farbverwalteten Konvertieren von Uploads mit ICC-Profilen nach sRGB vor der weiteren Media-Manager-Verarbeitung. - Mitgeliefertes Zielprofil
data/icc/sRGB Profile.iccfür echte ICC-zu-sRGB-Transformation im Effekt. - Neue Backend-Seite
ICC Fixzur Mehrfach-Zuweisung und Entfernung des sRGB/ICC-Fix-Effekts auf mehreren Media-Manager-Typen.
6.0.2
[6.0.2] - 2026-04-28
- MIME-Header korrigiert:
Content-Typewird bei AVIF/WebP nun alsimage/avifbzw.image/webpgesetzt. - Config-Seite erweitert:
preferred_formatist jetzt als UI-Feld verfügbar (Konsistenz zudefault_config). - Setup-Seite bereinigt: JS-Einbindung entfernt,
setup_compare.jswird nur noch zentral überboot.phpgeladen.
[6.0.1]
imagedestroy auf setupseite entfernt
Stefan Dannfald
@dpf-dd
[6.0.0] - 2026-04-28
Breaking Changes
- Namespace auf
FriendsOfRedaxo\MediaNegotiatorumgestellt. - Cache-Key-Strategie für Negotiator-Derivate geändert (Format + Quality + relevante Config), bestehende Derivate werden damit neu aufgebaut.
Added
- Vollständige i18n für Deutsch/Englisch (
lang/de_de.lang,lang/en_gb.lang). - Neue Konfigurationsoptionen:
webp_quality(0–100, Standard 80)avif_quality(0–100, Standard 60)ua_fallback(User-Agent-Fallback bei fehlenden expliziten Accept-Formaten)preferred_format(avifoderwebp)
- Neues CLI-Kommando
media:negotiator:warmupzum Vorwärmen des Media-Manager-Caches (--type,--formats,--limit,--base-url,--dry-run). - Neue Backend-Seite zur Mehrfach-Zuweisung des Negotiator-Effekts auf Media-Manager-Typen (Bulk Add/Remove, Append/Prepend).
- Setup-Seite als 3-Panel-Ansicht überarbeitet (Server, Browser, Demo).
- Demo-Vergleich mit Side-by-Side-Slider und Format-Auswahl ergänzt.
Changed
- Formatentscheidung berücksichtigt
preferred_formatin Accept- und UA-Fallback-Pfaden. - Browser-Fähigkeitserkennung in
getBrowserFormatSupport()von serverseitiger Codec-Verfügbarkeit entkoppelt. - Demo-Bilder auf der Setup-Seite verwenden die aktiven Addon-Einstellungen (Engine/Codec-Entscheidung, Quality, AVIF-Disable, Preferred-Format).
- JS-Initialisierung für Setup-Vergleich auf REDAXO-Backend-Navigation (
rex:ready) und robuste Event-Delegation ausgelegt.
Fixed
- #8: Wildcards (
*/*,image/*) werden nicht mehr als AVIF/WebP-Support gewertet. - Safari/UA-Erkennung korrigiert (Browser-Support-Anzeige vs. tatsächliche Server-Auslieferung getrennt).
webpPossible()/avifPossible()korrigiert (OR-Logik statt fehlerhafter UND-Verknüpfung).- SVG/GIF/ICO werden im Effekt korrekt übersprungen (#28).
- Imagick-Konvertierung gegen Laufzeitfehler abgesichert (Fallback auf Original statt 500, #31).
- Typisierung und Rückgabewerte in Helper/Effekt-Klassen nachgezogen (
GdImage|false-Checks etc.). - Konfigurations-Radios auf stabile 1/0-Werte umgestellt.
6.0.0 Danke Andi
[6.0.0] - 2026-04-28
Breaking Changes
- Namespace auf
FriendsOfRedaxo\MediaNegotiatorumgestellt. - Cache-Key-Strategie für Negotiator-Derivate geändert (Format + Quality + relevante Config), bestehende Derivate werden damit neu aufgebaut.
Added
- Vollständige i18n für Deutsch/Englisch (
lang/de_de.lang,lang/en_gb.lang). - Neue Konfigurationsoptionen:
webp_quality(0–100, Standard 80)avif_quality(0–100, Standard 60)ua_fallback(User-Agent-Fallback bei fehlenden expliziten Accept-Formaten)preferred_format(avifoderwebp)
- Neues CLI-Kommando
media:negotiator:warmupzum Vorwärmen des Media-Manager-Caches (--type,--formats,--limit,--base-url,--dry-run). - Neue Backend-Seite zur Mehrfach-Zuweisung des Negotiator-Effekts auf Media-Manager-Typen (Bulk Add/Remove, Append/Prepend).
- Setup-Seite als 3-Panel-Ansicht überarbeitet (Server, Browser, Demo).
- Demo-Vergleich mit Side-by-Side-Slider und Format-Auswahl ergänzt.
Changed
- Formatentscheidung berücksichtigt
preferred_formatin Accept- und UA-Fallback-Pfaden. - Browser-Fähigkeitserkennung in
getBrowserFormatSupport()von serverseitiger Codec-Verfügbarkeit entkoppelt. - Demo-Bilder auf der Setup-Seite verwenden die aktiven Addon-Einstellungen (Engine/Codec-Entscheidung, Quality, AVIF-Disable, Preferred-Format).
- JS-Initialisierung für Setup-Vergleich auf REDAXO-Backend-Navigation (
rex:ready) und robuste Event-Delegation ausgelegt.
Fixed
- #8: Wildcards (
*/*,image/*) werden nicht mehr als AVIF/WebP-Support gewertet. - Safari/UA-Erkennung korrigiert (Browser-Support-Anzeige vs. tatsächliche Server-Auslieferung getrennt).
webpPossible()/avifPossible()korrigiert (OR-Logik statt fehlerhafter UND-Verknüpfung).- SVG/GIF/ICO werden im Effekt korrekt übersprungen (#28).
- Imagick-Konvertierung gegen Laufzeitfehler abgesichert (Fallback auf Original statt 500, #31).
- Typisierung und Rückgabewerte in Helper/Effekt-Klassen nachgezogen (
GdImage|false-Checks etc.). - Konfigurations-Radios auf stabile 1/0-Werte umgestellt.