package comeon.core; import comeon.core.extmetadata.ExternalMetadataSource; import comeon.core.mediareaders.AudioReader; import comeon.core.mediareaders.MediaReader; import comeon.core.mediareaders.PictureReader; import comeon.model.Media; import comeon.model.Template; import comeon.model.User; import comeon.model.processors.PreProcessor; import java.io.File; import java.util.*; import java.util.stream.Collectors; public final class MediaUploadBatch { private final File[] files; private final Template template; private final Set<Media> media; private final Set<PreProcessor> preProcessors; private final ExternalMetadataSource<?> externalMetadataSource; public MediaUploadBatch(final File[] files, final Template template, final Set<PreProcessor> preProcessors, final ExternalMetadataSource<?> externalMetadataSource) { this.files = files; this.template = template; this.media = new HashSet<>(); this.preProcessors = preProcessors; this.externalMetadataSource = externalMetadataSource; } public MediaUploadBatch readFiles(final User user) { media.addAll(Arrays.stream(files) .map(f -> selectMediaReader(f, user)) .map(r -> r.readMedia(this)) .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toList())); return this; } private MediaReader selectMediaReader(final File file, final User user) { if (isPicture(file)) { return new PictureReader(file, user); } else if (isAudio(file)) { return new AudioReader(file, user); } else { throw new Error("No media reader for this file: " + file.getName()); } } private boolean isPicture(final File file) { return Arrays.stream(Core.PICTURE_EXTENSIONS).anyMatch(e -> file.getName().toLowerCase(Locale.ENGLISH).endsWith(e)); } private boolean isAudio(final File file) { return Arrays.stream(Core.AUDIO_EXTENSIONS).anyMatch(e -> file.getName().toLowerCase(Locale.ENGLISH).endsWith(e)); } public Set<Media> getMedia() { return Collections.unmodifiableSet(media); } public Template getTemplate() { return template; } public Object getExternalMetadata(Media media, Map<String, Object> mediaMetadata) { return externalMetadataSource.getMediaMetadata(media, mediaMetadata); } public Set<PreProcessor> getPreProcessors() { return Collections.unmodifiableSet(preProcessors); } public ExternalMetadataSource<?> getExternalMetadataSource() { return externalMetadataSource; } }