001package org.nasdanika.ai;
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.common.NasdanikaException;
013
014/**
015 * Can handle data: URIs
016 */
017public class UriImageMetadataNarrator extends ImageMetadataNarrator<URI> {
018
019        @Override
020        protected ImageMetadata getImageMetadata(URI source) {
021                try {
022                        String uriStr = source.toString();
023                        if (uriStr.startsWith("data:")) {
024                            int commaIndex = uriStr.indexOf(',');
025                            String metadata = uriStr.substring(5, commaIndex);
026                            String dataPart = uriStr.substring(commaIndex + 1);
027
028                            byte[] bytes;
029                            if (metadata.contains(";base64")) {
030                                bytes = Base64.getDecoder().decode(dataPart);
031                            } else {
032                                bytes = URLDecoder.decode(dataPart, StandardCharsets.UTF_8).getBytes(StandardCharsets.UTF_8);
033                            }
034                                return Imaging.getMetadata(bytes);              
035                        }
036                        return Imaging.getMetadata(new URL(uriStr).openStream(),source.lastSegment());
037                } catch (IOException e) {
038                        throw new NasdanikaException(e);
039                }
040        }
041
042}