001package org.nasdanika.ai.drawio; 002 003import java.io.IOException; 004import java.net.URL; 005import java.net.URLDecoder; 006import java.nio.charset.StandardCharsets; 007import java.util.Base64; 008 009import org.apache.commons.imaging.Imaging; 010import org.apache.commons.imaging.common.ImageMetadata; 011import org.eclipse.emf.common.util.URI; 012import org.nasdanika.ai.Narrator; 013import org.nasdanika.common.NasdanikaException; 014import org.nasdanika.drawio.Document; 015 016public class UriDocumentImageMetadataNarrator extends DocumentImageMetadataNarrator<URI> { 017 018 public UriDocumentImageMetadataNarrator(Narrator<Document> documentNarrator) { 019 super(documentNarrator); 020 } 021 022 @Override 023 protected ImageMetadata getImageMetadata(URI source) { 024 try { 025 String uriStr = source.toString(); 026 if (uriStr.startsWith("data:")) { 027 int commaIndex = uriStr.indexOf(','); 028 String metadata = uriStr.substring(5, commaIndex); 029 String dataPart = uriStr.substring(commaIndex + 1); 030 031 byte[] bytes; 032 if (metadata.contains(";base64")) { 033 bytes = Base64.getDecoder().decode(dataPart); 034 } else { 035 bytes = URLDecoder.decode(dataPart, StandardCharsets.UTF_8).getBytes(StandardCharsets.UTF_8); 036 } 037 return Imaging.getMetadata(bytes); 038 } 039 return Imaging.getMetadata(new URL(uriStr).openStream(),source.lastSegment()); 040 } catch (IOException e) { 041 throw new NasdanikaException(e); 042 } 043 } 044 045}