001package org.nasdanika.ai;
002
003import org.apache.commons.imaging.common.ImageMetadata;
004
005import java.util.List;
006
007import org.apache.commons.imaging.common.GenericImageMetadata.GenericImageMetadataItem;
008import org.apache.commons.imaging.common.ImageMetadata.ImageMetadataItem;
009
010import reactor.core.publisher.Mono;
011
012public abstract class ImageMetadataNarrator<S> implements Narrator<S> {
013        
014        @Override
015        public Mono<String> generateAsync(S input) {            
016                return narrateMetadataAsync(getImageMetadata(input));
017        }
018        
019        @Override
020        public String generate(S input) {
021                return narrateMetadata(getImageMetadata(input));
022        }
023        
024        protected abstract ImageMetadata getImageMetadata(S source);
025        
026        protected String narrateMetadata(ImageMetadata metadata) {
027                if (metadata != null) {
028                        List<? extends ImageMetadataItem> items = metadata.getItems();
029                        if (items != null) {
030                                for (ImageMetadataItem item: items) {
031                                        if (item instanceof GenericImageMetadataItem) {
032                                                GenericImageMetadataItem gItem = (GenericImageMetadataItem) item;
033                                                if (getDescriptionKeyword().equals(gItem.getKeyword())) {
034                                                        return gItem.getText();
035                                                }
036                                        }
037                                }
038                        }                       
039                }
040                return null;
041        }
042        
043        protected String getDescriptionKeyword() {
044                return "Description";
045        }
046        
047        protected Mono<String> narrateMetadataAsync(ImageMetadata metadata) {
048                return Mono.just(narrateMetadata(metadata));
049        }       
050        
051}