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());
        }
Exemple #2
0
        /// <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));
        }