protected override async Task <IEnumerable <IDocument> > ExecuteInputAsync(IDocument input, IExecutionContext context) { XmpDirectory xmpDirectory; try { using (Stream stream = input.GetContentStream()) { xmpDirectory = ImageMetadataReader.ReadMetadata(stream).OfType <XmpDirectory>().FirstOrDefault(); } } catch (Exception) { xmpDirectory = null; } if (xmpDirectory == null) { // Try to read sidecarfile if (!input.Source.IsNull) { IFile sidecarFile = context.FileSystem.GetInputFile(input.Source.AppendExtension(".xmp")); if (sidecarFile.Exists) { MemoryStream xmpBytes = new MemoryStream(); using (Stream xmpStream = sidecarFile.OpenRead()) { await xmpStream.CopyToAsync(xmpBytes); } xmpDirectory = new XmpReader().Extract(xmpBytes.ToArray()); } } } if (xmpDirectory == null) { if (_toSearch.Any(y => y.IsMandatory)) { context.LogWarning($"File doe not contain Metadata or sidecar file ({input.ToSafeDisplayString()})"); if (_skipElementOnMissingData) { return(null); } } return(input.Yield()); } Dictionary <string, object> newValues = new Dictionary <string, object>(); TreeDirectory hierarchicalDirectory = TreeDirectory.GetHierarchicalDirectory(xmpDirectory); foreach (XmpSearchEntry search in _toSearch) { try { TreeDirectory metadata = hierarchicalDirectory.Childrean.Find(y => search.PathWithoutNamespacePrefix == y.ElementName && search.Namespace == y.ElementNameSpace); if (metadata == null) { if (search.IsMandatory) { context.LogError($"Metadata does not Contain {search.XmpPath} ({input.ToSafeDisplayString()})"); if (_skipElementOnMissingData) { return(null); } } continue; } object value = GetObjectFromMetadata(metadata, hierarchicalDirectory); if (newValues.ContainsKey(search.MetadataKey) && _errorOnDoubleKeys) { context.LogError($"This Module tries to write same Key multiple times {search.MetadataKey} ({input.ToSafeDisplayString()})"); } else { newValues[search.MetadataKey] = value; } } catch (Exception e) { context.LogError($"An exception occurred : {e} {e.Message}"); if (search.IsMandatory && _skipElementOnMissingData) { return(null); } } } return(newValues.Count > 0 ? input.Clone(newValues).Yield() : input.Yield()); }
/// <inheritdoc /> public IEnumerable <IDocument> Execute(IReadOnlyList <IDocument> inputs, IExecutionContext context) { return(inputs.Select(context, input => { MetadataExtractor.Formats.Xmp.XmpDirectory xmpDirectory; try { using (var stream = input.GetStream()) { xmpDirectory = ImageMetadataReader.ReadMetadata(stream).OfType <XmpDirectory>().FirstOrDefault(); } } catch (Exception) { xmpDirectory = null; } if (xmpDirectory == null) // Try to read sidecarfile { FilePath sourceFilePath = input.FilePath(Keys.SourceFilePath); if (sourceFilePath != null) { IFile sidecarFile = context.FileSystem.GetInputFile(sourceFilePath.FullPath + ".xmp"); if (sidecarFile.Exists) { string xmpXml = sidecarFile.ReadAllText(); xmpDirectory = new XmpReader().Extract(xmpXml); } } } if (xmpDirectory == null) { if (_toSearch.Any(y => y.IsMandatory)) { Trace.Warning($"File doe not contain Metadata or sidecar file ({input.SourceString()})"); if (_skipElementOnMissingData) { return null; } } return input; } Dictionary <string, object> newValues = new Dictionary <string, object>(); TreeDirectory hierarchicalDirectory = TreeDirectory.GetHierarchicalDirectory(xmpDirectory); foreach (var search in _toSearch) { try { TreeDirectory metadata = hierarchicalDirectory.Childrean.FirstOrDefault(y => search.PathWithoutNamespacePrefix == y.ElementName && search.Namespace == y.ElementNameSpace); if (metadata == null) { if (search.IsMandatory) { Trace.Error($"Metadata does not Contain {search.XmpPath} ({input.SourceString()})"); if (_skipElementOnMissingData) { return null; } } continue; } object value = GetObjectFromMetadata(metadata, hierarchicalDirectory); if (newValues.ContainsKey(search.MetadataKey) && _errorOnDoubleKeys) { Trace.Error($"This Module tries to write same Key multiple times {search.MetadataKey} ({input.SourceString()})"); } else { newValues[search.MetadataKey] = value; } } catch (Exception e) { Trace.Error($"An exception occurred : {e} {e.Message}"); if (search.IsMandatory && _skipElementOnMissingData) { return null; } } } return newValues.Any() ? context.GetDocument(input, newValues) : input; }).Where(x => x != null)); }