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}