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}