Пример #1
0
        public static async Task <byte[]> ReadBookCoverAsync(EpubBookRef bookRef)
        {
            List <EpubMetadataMeta> metaItems = bookRef.Schema.Package.Metadata.MetaItems;

            if (metaItems == null || !metaItems.Any())
            {
                return(null);
            }
            EpubMetadataMeta coverMetaItem = metaItems.FirstOrDefault(metaItem => String.Compare(metaItem.Name, "cover", StringComparison.OrdinalIgnoreCase) == 0);

            if (coverMetaItem == null)
            {
                return(null);
            }
            if (String.IsNullOrEmpty(coverMetaItem.Content))
            {
                throw new Exception("Incorrect EPUB metadata: cover item content is missing.");
            }
            EpubManifestItem coverManifestItem = bookRef.Schema.Package.Manifest.FirstOrDefault(manifestItem => String.Compare(manifestItem.Id, coverMetaItem.Content, StringComparison.OrdinalIgnoreCase) == 0);

            if (coverManifestItem == null)
            {
                throw new Exception(String.Format("Incorrect EPUB manifest: item with ID = \"{0}\" is missing.", coverMetaItem.Content));
            }
            if (!bookRef.Content.Images.TryGetValue(coverManifestItem.Href, out EpubByteContentFileRef coverImageContentFileRef))
            {
                throw new Exception(String.Format("Incorrect EPUB manifest: item with href = \"{0}\" is missing.", coverManifestItem.Href));
            }
            byte[] coverImageContent = await coverImageContentFileRef.ReadContentAsBytesAsync().ConfigureAwait(false);

            return(coverImageContent);
        }
Пример #2
0
        private static EpubMetadataMeta ReadMetadataMetaVersion3(XmlNode metadataMetaNode)
        {
            EpubMetadataMeta result = new EpubMetadataMeta();

            foreach (XmlAttribute metadataMetaNodeAttribute in metadataMetaNode.Attributes)
            {
                string attributeValue = metadataMetaNodeAttribute.Value;
                switch (metadataMetaNodeAttribute.Name.ToLowerInvariant())
                {
                case "id":
                    result.Id = attributeValue;
                    break;

                case "refines":
                    result.Refines = attributeValue;
                    break;

                case "property":
                    result.Property = attributeValue;
                    break;

                case "scheme":
                    result.Scheme = attributeValue;
                    break;
                }
            }
            result.Content = metadataMetaNode.InnerText;
            return(result);
        }
Пример #3
0
        public static EpubByteContentFileRef ReadBookCover(EpubSchema epubSchema, Dictionary <string, EpubByteContentFileRef> imageContentRefs)
        {
            List <EpubMetadataMeta> metaItems = epubSchema.Package.Metadata.MetaItems;

            if (metaItems == null || !metaItems.Any())
            {
                return(null);
            }
            EpubMetadataMeta coverMetaItem = metaItems.FirstOrDefault(metaItem => metaItem.Name.CompareOrdinalIgnoreCase("cover"));

            if (coverMetaItem == null)
            {
                return(null);
            }
            if (String.IsNullOrEmpty(coverMetaItem.Content))
            {
                throw new Exception("Incorrect EPUB metadata: cover item content is missing.");
            }
            EpubManifestItem coverManifestItem = epubSchema.Package.Manifest.FirstOrDefault(manifestItem => manifestItem.Id.CompareOrdinalIgnoreCase(coverMetaItem.Content));

            if (coverManifestItem == null)
            {
                throw new Exception($"Incorrect EPUB manifest: item with ID = \"{coverMetaItem.Content}\" is missing.");
            }
            if (!imageContentRefs.TryGetValue(coverManifestItem.Href, out EpubByteContentFileRef coverImageContentFileRef))
            {
                throw new Exception($"Incorrect EPUB manifest: item with href = \"{coverManifestItem.Href}\" is missing.");
            }
            return(coverImageContentFileRef);
        }
Пример #4
0
        private static Image LoadCoverImage(EpubBook book)
        {
            List <EpubMetadataMeta> metaItems = book.Schema.Package.Metadata.MetaItems;

            if (metaItems == null || !metaItems.Any())
            {
                return(null);
            }
            EpubMetadataMeta coverMetaItem = metaItems.FirstOrDefault(metaItem => String.Compare(metaItem.Name, "cover", StringComparison.OrdinalIgnoreCase) == 0);

            if (coverMetaItem == null)
            {
                return(null);
            }
            if (String.IsNullOrEmpty(coverMetaItem.Content))
            {
                throw new Exception("Incorrect EPUB metadata: cover item content is missing");
            }
            EpubManifestItem coverManifestItem = book.Schema.Package.Manifest.FirstOrDefault(manifestItem => String.Compare(manifestItem.Id, coverMetaItem.Content, StringComparison.OrdinalIgnoreCase) == 0);

            if (coverManifestItem == null)
            {
                throw new Exception(String.Format("Incorrect EPUB manifest: item with ID = \"{0}\" is missing", coverMetaItem.Content));
            }
            EpubByteContentFile coverImageContentFile;

            if (!book.Content.Images.TryGetValue(coverManifestItem.Href, out coverImageContentFile))
            {
                throw new Exception(String.Format("Incorrect EPUB manifest: item with href = \"{0}\" is missing", coverManifestItem.Href));
            }
            using (MemoryStream coverImageStream = new MemoryStream(coverImageContentFile.Content))
                return(Image.FromStream(coverImageStream));
        }
Пример #5
0
        private static EpubMetadataMeta ReadMetadataMetaVersion3(XElement metadataMetaNode)
        {
            var result = new EpubMetadataMeta();

            foreach (var metadataMetaNodeAttribute in metadataMetaNode.Attributes())
            {
                var attributeValue = metadataMetaNodeAttribute.Value;
                switch (metadataMetaNodeAttribute.GetLowerCaseLocalName())
                {
                case "id":
                    result.Id = attributeValue;
                    break;

                case "refines":
                    result.Refines = attributeValue;
                    break;

                case "property":
                    result.Property = attributeValue;
                    break;

                case "scheme":
                    result.Scheme = attributeValue;
                    break;
                }
            }

            result.Content = metadataMetaNode.Value;
            return(result);
        }
Пример #6
0
        public static EpubByteContentFileRef ReadBookCover(EpubSchema epubSchema, Dictionary <string, EpubByteContentFileRef> imageContentRefs)
        {
            List <EpubMetadataMeta> metaItems = epubSchema.Package.Metadata.MetaItems;

            if (metaItems == null || !metaItems.Any())
            {
                return(null);
            }
            EpubMetadataMeta coverMetaItem = metaItems.FirstOrDefault(metaItem => metaItem.Name.CompareOrdinalIgnoreCase("cover"));

            if (coverMetaItem == null)
            {
                return(null);
            }
            if (String.IsNullOrEmpty(coverMetaItem.Content))
            {
                throw new Exception("Incorrect EPUB metadata: cover item content is missing.");
            }
            EpubManifestItem coverManifestItem = epubSchema.Package.Manifest.FirstOrDefault(manifestItem => manifestItem.Id.CompareOrdinalIgnoreCase(coverMetaItem.Content));

            if (coverManifestItem == null)
            {
                // 2019-08-20 Hotfix: if coverManifestItem is not found by its Id, then try it with its Href - some ebooks refer to the image directly!
                coverManifestItem = epubSchema.Package.Manifest.FirstOrDefault(manifestItem => manifestItem.Href.CompareOrdinalIgnoreCase(coverMetaItem.Content));
                if (null == coverManifestItem)
                {
                    throw new Exception($"Incorrect EPUB manifest: item with ID = \"{coverMetaItem.Content}\" is missing.");
                }
            }
            if (imageContentRefs.TryGetValue(coverManifestItem.Href, out EpubByteContentFileRef coverImageContentFileRef))
            {
                return(coverImageContentFileRef);
            }

            // 2019-08-21 Fix some ebooks seem to contain more than one item with Id="cover"
            // thus we test if there is a second item....

            coverManifestItem = epubSchema.Package.Manifest.Where(manifestItem => manifestItem.Id.CompareOrdinalIgnoreCase(coverMetaItem.Content)).Skip(1).FirstOrDefault();;
            if (coverManifestItem == null)
            {
                // 2019-08-20 Hotfix: if coverManifestItem is not found by its Id, then try it with its Href - some ebooks refer to the image directly!
                coverManifestItem = epubSchema.Package.Manifest.FirstOrDefault(manifestItem => manifestItem.Href.CompareOrdinalIgnoreCase(coverMetaItem.Content));

                if (null == coverManifestItem)
                {
                    throw new Exception($"Incorrect EPUB manifest: item with ID = \"{coverMetaItem.Content}\" is missing.");
                }
            }
            if (imageContentRefs.TryGetValue(coverManifestItem.Href, out EpubByteContentFileRef coverImageContentFileRef2))
            {
                return(coverImageContentFileRef2);
            }
            throw new Exception($"Incorrect EPUB manifest: item with href = \"{coverManifestItem.Href}\" is missing.");
        }
        public static async Task <Image> ReadBookCoverAsync(EpubBookRef bookRef)
        {
            List <EpubMetadataMeta> metaItems = bookRef.Schema.Package.Metadata.MetaItems;

            if (metaItems == null || !metaItems.Any())
            {
                return(null);
            }

            EpubMetadataMeta coverMetaItem = metaItems.FirstOrDefault(metaItem => string.Compare(metaItem.Name, "cover", StringComparison.OrdinalIgnoreCase) == 0);

            if (coverMetaItem == null)
            {
                return(null);
            }

            if (String.IsNullOrEmpty(coverMetaItem.Content))
            {
                throw new Exception("Incorrect EPUB metadata: cover item content is missing.");
            }

            EpubManifestItem coverManifestItem = bookRef.Schema.Package.Manifest.FirstOrDefault(manifestItem => String.Compare(manifestItem.Id, coverMetaItem.Content, StringComparison.OrdinalIgnoreCase) == 0);

            if (coverManifestItem == null)
            {
                throw new Exception(string.Format(CultureInfo.InvariantCulture, "Incorrect EPUB manifest: item with ID = \"{0}\" is missing.", coverMetaItem.Content));
            }

            EpubByteContentFileRef coverImageContentFileRef;

            if (!bookRef.Content.Images.TryGetValue(coverManifestItem.Href, out coverImageContentFileRef))
            {
                throw new Exception(string.Format(CultureInfo.InvariantCulture, "Incorrect EPUB manifest: item with href = \"{0}\" is missing.", coverManifestItem.Href));
            }

            byte[] coverImageContent = await coverImageContentFileRef.ReadContentAsBytesAsync().ConfigureAwait(false);

            using (MemoryStream coverImageStream = new MemoryStream(coverImageContent))
            {
                Image image = new Image();
                //return await Task.Run(() => Image.FromStream(coverImageStream)).ConfigureAwait(false);
                Func <Stream> stream = () => coverImageStream;
                image.Source = ImageSource.FromStream(stream);
                return(await Task.Run(() => image).ConfigureAwait(false));
            }
        }
Пример #8
0
        private static async Task <BitmapImage> LoadCoverImageAsync(EpubBook book)
        {
            //TO-DO Currently this function only accepts covers as a image file. If cover is wrapped in.xhtml file - nothing happen.
            List <EpubMetadataMeta> metaItems = book.Schema.Package.Metadata.MetaItems;
            BitmapImage             result    = new BitmapImage();

            if (metaItems == null || !metaItems.Any())
            {
                return(null);
            }
            EpubMetadataMeta coverMetaItem = metaItems.FirstOrDefault(metaItem => String.Compare(metaItem.Name, "cover", StringComparison.OrdinalIgnoreCase) == 0);

            if (coverMetaItem == null)
            {
                return(null);
            }
            if (String.IsNullOrEmpty(coverMetaItem.Content))
            {
                throw new Exception("Incorrect EPUB metadata: cover item content is missing");
            }
            EpubManifestItem coverManifestItem = book.Schema.Package.Manifest.FirstOrDefault(manifestItem => String.Compare(manifestItem.Id, coverMetaItem.Content, StringComparison.OrdinalIgnoreCase) == 0);

            if (coverManifestItem == null)
            {
                throw new Exception(String.Format("Incorrect EPUB manifest: item with ID = \"{0}\" is missing", coverMetaItem.Content));
            }
            EpubByteContentFile coverImageContentFile;

            // ---------------------------------------------------------------------------------------------------------------------
            //TO-DO: Currently this function only accepts covers as a image file. If cover is wrapped in.xhtml file - nothing happen.
            // Have to check how people using wrapped cover - do they point <meta content> directly to xhtml or just placing it in the manifest
            // ---------------------------------------------------------------------------------------------------------------------
            if (!book.Content.Images.TryGetValue(coverManifestItem.Href, out coverImageContentFile))
            {
                throw new Exception(String.Format("Incorrect EPUB manifest: item with href = \"{0}\" is missing", coverManifestItem.Href));
            }
            // Old code is not working as SystemDrawings is deprecated
            //using (MemoryStream coverImageStream = new MemoryStream(coverImageContentFile.Content))
            result = await ConvertToBitmapImageAsync(coverImageContentFile.Content);

            return(result);
        }
Пример #9
0
        private static EpubMetadataMeta ReadMetadataMetaVersion2(XmlNode metadataMetaNode)
        {
            EpubMetadataMeta result = new EpubMetadataMeta();

            foreach (XmlAttribute metadataMetaNodeAttribute in metadataMetaNode.Attributes)
            {
                string attributeValue = metadataMetaNodeAttribute.Value;
                switch (metadataMetaNodeAttribute.Name.ToLowerInvariant())
                {
                case "name":
                    result.Name = attributeValue;
                    break;

                case "content":
                    result.Content = attributeValue;
                    break;
                }
            }
            return(result);
        }
Пример #10
0
        private static EpubMetadataMeta ReadMetadataMetaVersion2(XElement metadataMetaNode)
        {
            EpubMetadataMeta result = new EpubMetadataMeta();

            foreach (XAttribute metadataMetaNodeAttribute in metadataMetaNode.Attributes())
            {
                string attributeValue = metadataMetaNodeAttribute.Value;
                switch (metadataMetaNodeAttribute.GetLowerCaseLocalName())
                {
                case "name":
                    result.Name = attributeValue;
                    break;

                case "content":
                    result.Content = attributeValue;
                    break;
                }
            }
            return(result);
        }
Пример #11
0
        private static EpubMetadataMeta ReadMetadataMetaVersion2(XElement metadataMetaNode)
        {
            var result = new EpubMetadataMeta();

            foreach (var metadataMetaNodeAttribute in metadataMetaNode.Attributes())
            {
                var attributeValue = metadataMetaNodeAttribute.Value;
                switch (metadataMetaNodeAttribute.Name.LocalName.ToLowerInvariant())
                {
                case "name":
                    result.Name = attributeValue;
                    break;

                case "content":
                    result.Content = attributeValue;
                    break;
                }
            }

            return(result);
        }
Пример #12
0
        private static EpubMetadataMeta ReadMetadataMetaVersion3(XElement metadataMetaNode)
        {
            EpubMetadataMeta result = new EpubMetadataMeta();

            foreach (XAttribute metadataMetaNodeAttribute in metadataMetaNode.Attributes())
            {
                string attributeValue = metadataMetaNodeAttribute.Value;
                switch (metadataMetaNodeAttribute.GetLowerCaseLocalName())
                {
                case "id":
                    result.Id = attributeValue;
                    break;

                case "refines":
                    result.Refines = attributeValue;
                    break;

                case "property":
                    result.Property = attributeValue;
                    break;

                case "scheme":
                    result.Scheme = attributeValue;
                    break;

                case "name":
                    result.Name = attributeValue;
                    break;

                case "content":
                    result.Content = attributeValue;
                    break;
                }
            }
            if (string.IsNullOrEmpty(result.Content))
            {
                result.Content = metadataMetaNode.Value;
            }
            return(result);
        }
Пример #13
0
        private static EpubMetadata ReadMetadata(XmlNode metadataNode, EpubVersion epubVersion)
        {
            EpubMetadata result = new EpubMetadata();

            result.Titles       = new List <string>();
            result.Creators     = new List <EpubMetadataCreator>();
            result.Subjects     = new List <string>();
            result.Publishers   = new List <string>();
            result.Contributors = new List <EpubMetadataContributor>();
            result.Dates        = new List <EpubMetadataDate>();
            result.Types        = new List <string>();
            result.Formats      = new List <string>();
            result.Identifiers  = new List <EpubMetadataIdentifier>();
            result.Sources      = new List <string>();
            result.Languages    = new List <string>();
            result.Relations    = new List <string>();
            result.Coverages    = new List <string>();
            result.Rights       = new List <string>();
            result.MetaItems    = new List <EpubMetadataMeta>();
            foreach (XmlNode metadataItemNode in metadataNode.ChildNodes)
            {
                string innerText = metadataItemNode.InnerText;
                switch (metadataItemNode.LocalName.ToLowerInvariant())
                {
                case "title":
                    result.Titles.Add(innerText);
                    break;

                case "creator":
                    EpubMetadataCreator creator = ReadMetadataCreator(metadataItemNode);
                    result.Creators.Add(creator);
                    break;

                case "subject":
                    result.Subjects.Add(innerText);
                    break;

                case "description":
                    result.Description = innerText;
                    break;

                case "publisher":
                    result.Publishers.Add(innerText);
                    break;

                case "contributor":
                    EpubMetadataContributor contributor = ReadMetadataContributor(metadataItemNode);
                    result.Contributors.Add(contributor);
                    break;

                case "date":
                    EpubMetadataDate date = ReadMetadataDate(metadataItemNode);
                    result.Dates.Add(date);
                    break;

                case "type":
                    result.Types.Add(innerText);
                    break;

                case "format":
                    result.Formats.Add(innerText);
                    break;

                case "identifier":
                    EpubMetadataIdentifier identifier = ReadMetadataIdentifier(metadataItemNode);
                    result.Identifiers.Add(identifier);
                    break;

                case "source":
                    result.Sources.Add(innerText);
                    break;

                case "language":
                    result.Languages.Add(innerText);
                    break;

                case "relation":
                    result.Relations.Add(innerText);
                    break;

                case "coverage":
                    result.Coverages.Add(innerText);
                    break;

                case "rights":
                    result.Rights.Add(innerText);
                    break;

                case "meta":
                    if (epubVersion == EpubVersion.EPUB_2)
                    {
                        EpubMetadataMeta meta = ReadMetadataMetaVersion2(metadataItemNode);
                        result.MetaItems.Add(meta);
                    }
                    else
                    if (epubVersion == EpubVersion.EPUB_3)
                    {
                        EpubMetadataMeta meta = ReadMetadataMetaVersion3(metadataItemNode);
                        result.MetaItems.Add(meta);
                    }
                    break;
                }
            }
            return(result);
        }
Пример #14
0
        public static EpubByteContentFileRef ReadBookCover(EpubSchema epubSchema, Dictionary <string, EpubByteContentFileRef> imageContentRefs)
        {
            List <EpubMetadataMeta> metaItems = epubSchema.Package.Metadata.MetaItems;

            if (metaItems == null || !metaItems.Any())
            {
                return(null);
            }
            EpubMetadataMeta coverMetaItem = metaItems.FirstOrDefault(metaItem => metaItem.Name.CompareOrdinalIgnoreCase("cover"));

            if (coverMetaItem == null)
            {
                return(null);
            }
            if (String.IsNullOrEmpty(coverMetaItem.Content))
            {
                throw new Exception("Incorrect EPUB metadata: cover item content is missing.");
            }

            EpubByteContentFileRef coverImageContentFileRef;
            EpubManifestItem       coverManifestItem = epubSchema.Package.Manifest.FirstOrDefault(manifestItem => manifestItem.Id.CompareOrdinalIgnoreCase(coverMetaItem.Content));

            if (null != coverManifestItem?.Href && imageContentRefs.TryGetValue(coverManifestItem.Href, out coverImageContentFileRef))
            {
                return(coverImageContentFileRef);
            }

            // For non-standard ebooks, we try several other ways...
            if (null != coverManifestItem) // we have found the item but there was no corresponding image ...
            {
                // some ebooks seem to contain more than one item with Id="cover"
                // thus we test if there is a second item, and whether that is an image....
                coverManifestItem = epubSchema.Package.Manifest.Where(manifestItem => manifestItem.Id.CompareOrdinalIgnoreCase(coverMetaItem.Content)).Skip(1).FirstOrDefault();;
                if (null != coverManifestItem?.Href && imageContentRefs.TryGetValue(coverManifestItem.Href, out coverImageContentFileRef))
                {
                    return(coverImageContentFileRef);
                }
            }

            // we have still not found the item
            // 2019-08-20 Hotfix: if coverManifestItem is not found by its Id, then try it with its Href - some ebooks refer to the image directly!
            coverManifestItem = epubSchema.Package.Manifest.FirstOrDefault(manifestItem => manifestItem.Href.CompareOrdinalIgnoreCase(coverMetaItem.Content));
            if (null != coverManifestItem?.Href && imageContentRefs.TryGetValue(coverManifestItem.Href, out coverImageContentFileRef))
            {
                return(coverImageContentFileRef);
            }
            // 2019-08-24 if it is still not found, then try to find an Id named cover
            coverManifestItem = epubSchema.Package.Manifest.FirstOrDefault(manifestItem => manifestItem.Id.CompareOrdinalIgnoreCase(coverMetaItem.Name));
            if (null != coverManifestItem?.Href && imageContentRefs.TryGetValue(coverManifestItem.Href, out coverImageContentFileRef))
            {
                return(coverImageContentFileRef);
            }
            // 2019-08-24 if it is still not found, then try to find it in the guide
            var guideItem = epubSchema.Package.Guide.FirstOrDefault(reference => reference.Title.CompareOrdinalIgnoreCase(coverMetaItem.Name));

            if (null != guideItem?.Href && imageContentRefs.TryGetValue(guideItem.Href, out coverImageContentFileRef))
            {
                return(coverImageContentFileRef);
            }


            throw new Exception($"Incorrect EPUB manifest: item with ID = \"{coverMetaItem.Content}\" is missing or no corresponding image was found.");
        }
Пример #15
0
        private static EpubMetadata ReadMetadata(XElement metadataNode, EpubVersion epubVersion)
        {
            EpubMetadata result = new EpubMetadata
            {
                Titles       = new List <string>(),
                Creators     = new List <EpubMetadataCreator>(),
                Subjects     = new List <string>(),
                Publishers   = new List <string>(),
                Contributors = new List <EpubMetadataContributor>(),
                Dates        = new List <EpubMetadataDate>(),
                Types        = new List <string>(),
                Formats      = new List <string>(),
                Identifiers  = new List <EpubMetadataIdentifier>(),
                Sources      = new List <string>(),
                Languages    = new List <string>(),
                Relations    = new List <string>(),
                Coverages    = new List <string>(),
                Rights       = new List <string>(),
                MetaItems    = new List <EpubMetadataMeta>()
            };

            foreach (XElement metadataItemNode in metadataNode.Elements())
            {
                string innerText = metadataItemNode.Value;
                switch (metadataItemNode.GetLowerCaseLocalName())
                {
                case "title":
                    result.Titles.Add(innerText);
                    break;

                case "creator":
                    EpubMetadataCreator creator = ReadMetadataCreator(metadataItemNode);
                    result.Creators.Add(creator);
                    break;

                case "subject":
                    result.Subjects.Add(innerText);
                    break;

                case "description":
                    result.Description = innerText;
                    break;

                case "publisher":
                    result.Publishers.Add(innerText);
                    break;

                case "contributor":
                    EpubMetadataContributor contributor = ReadMetadataContributor(metadataItemNode);
                    result.Contributors.Add(contributor);
                    break;

                case "date":
                    EpubMetadataDate date = ReadMetadataDate(metadataItemNode);
                    result.Dates.Add(date);
                    break;

                case "type":
                    result.Types.Add(innerText);
                    break;

                case "format":
                    result.Formats.Add(innerText);
                    break;

                case "identifier":
                    EpubMetadataIdentifier identifier = ReadMetadataIdentifier(metadataItemNode);
                    result.Identifiers.Add(identifier);
                    break;

                case "source":
                    result.Sources.Add(innerText);
                    break;

                case "language":
                    result.Languages.Add(innerText);
                    break;

                case "relation":
                    result.Relations.Add(innerText);
                    break;

                case "coverage":
                    result.Coverages.Add(innerText);
                    break;

                case "rights":
                    result.Rights.Add(innerText);
                    break;

                case "meta":
                    if (epubVersion == EpubVersion.EPUB_2)
                    {
                        EpubMetadataMeta meta = ReadMetadataMetaVersion2(metadataItemNode);
                        result.MetaItems.Add(meta);
                    }
                    else if (epubVersion == EpubVersion.EPUB_3_0 || epubVersion == EpubVersion.EPUB_3_1)
                    {
                        EpubMetadataMeta meta = ReadMetadataMetaVersion3(metadataItemNode);
                        result.MetaItems.Add(meta);
                    }
                    break;
                }
            }
            return(result);
        }
Пример #16
0
        private static async System.Threading.Tasks.Task <EpubMetadata> ReadMetadataAsync(XmlReader reader, EpubVersion epubVersion)
        {
            EpubMetadata result = new EpubMetadata();

            result.Titles       = new List <string>();
            result.Creators     = new List <EpubMetadataCreator>();
            result.Subjects     = new List <string>();
            result.Publishers   = new List <string>();
            result.Contributors = new List <EpubMetadataContributor>();
            result.Dates        = new List <EpubMetadataDate>();
            result.Types        = new List <string>();
            result.Formats      = new List <string>();
            result.Identifiers  = new List <EpubMetadataIdentifier>();
            result.Sources      = new List <string>();
            result.Languages    = new List <string>();
            result.Relations    = new List <string>();
            result.Coverages    = new List <string>();
            result.Rights       = new List <string>();
            result.MetaItems    = new List <EpubMetadataMeta>();

            //Parsing all metadata insides and saving it in EpubMetadata instance
            //

            //Мне нужно пройтись по всем нодам внутри метадаты последовательно, извлечь ноды указанные в массиве metadataNodesNames...
            //... и сохранить их в структуре EpubMetadata
            //В каждой итерации нам нужно извлечь имя нода, сделать маленькими буквами и,
            // в зависимости от того есть ли он в массиве - выполнить запись в структуру
            //ИЛИ мы можем тупо искать по заданным в массиве именам, с опасностью, что какая-то сука написала капсами и это ебнет весь ридер
            //
            bool isMetadataAvailable = await reader.ReadToFollowingAsync("metadata", "http://www.idpf.org/2007/opf");

            if (!isMetadataAvailable)
            {
                throw new Exception("EPUB parsing error: metadata not found in the package.");
            }

            while (await reader.ReadAsync() && !(reader.NodeType == XmlNodeType.EndElement && reader.LocalName == "metadata"))
            {
                switch (reader.NodeType)
                {
                case XmlNodeType.Element:
                    switch (reader.LocalName.ToLowerInvariant())
                    {
                    case "title":
                        result.Titles.Add(reader.ReadElementContentAsString());
                        break;

                    case "creator":
                        EpubMetadataCreator creator = new EpubMetadataCreator();
                        creator.Role    = reader.GetAttribute("opf:role");
                        creator.FileAs  = reader.GetAttribute("opf:file-as");
                        creator.Creator = reader.ReadElementContentAsString();
                        result.Creators.Add(creator);
                        break;

                    case "subject":
                        result.Subjects.Add(reader.ReadElementContentAsString());
                        break;

                    case "description":
                        result.Description = reader.ReadElementContentAsString();
                        break;

                    case "publisher":
                        result.Publishers.Add(reader.ReadElementContentAsString());
                        break;

                    case "contributor":
                        EpubMetadataContributor contributor = new EpubMetadataContributor();
                        contributor.Role        = reader.GetAttribute("opf:role");
                        contributor.FileAs      = reader.GetAttribute("opf:file-as");
                        contributor.Contributor = reader.ReadElementContentAsString();
                        result.Contributors.Add(contributor);
                        break;

                    case "date":
                        EpubMetadataDate date = new EpubMetadataDate();
                        date.Event = reader.GetAttribute("opf:event");
                        date.Date  = reader.ReadElementContentAsString();
                        result.Dates.Add(date);
                        break;

                    case "type":
                        result.Types.Add(reader.ReadElementContentAsString());
                        break;

                    case "format":
                        result.Formats.Add(reader.ReadElementContentAsString());
                        break;

                    case "identifier":
                        EpubMetadataIdentifier identifier = new EpubMetadataIdentifier();
                        identifier.Id         = reader.GetAttribute("id");
                        identifier.Scheme     = reader.GetAttribute("opf:scheme");
                        identifier.Identifier = reader.ReadElementContentAsString();
                        result.Identifiers.Add(identifier);
                        break;

                    case "source":
                        result.Sources.Add(reader.ReadElementContentAsString());
                        break;

                    case "language":
                        result.Languages.Add(reader.ReadElementContentAsString());
                        break;

                    case "relation":
                        result.Relations.Add(reader.ReadElementContentAsString());
                        break;

                    case "coverage":
                        result.Coverages.Add(reader.ReadElementContentAsString());
                        break;

                    case "rights":
                        result.Rights.Add(reader.ReadElementContentAsString());
                        break;

                    //looks like there is an optional refining node "meta" and it is present in EPUB3
                    case "meta":
                        if (epubVersion == EpubVersion.EPUB_2)
                        {
                            EpubMetadataMeta meta = new EpubMetadataMeta();
                            meta.Name    = reader.GetAttribute("name");
                            meta.Content = reader.GetAttribute("content");
                            result.MetaItems.Add(meta);
                        }
                        else
                        if (epubVersion == EpubVersion.EPUB_3)
                        {
                            EpubMetadataMeta meta = new EpubMetadataMeta();
                            meta.Id       = reader.GetAttribute("id");
                            meta.Refines  = reader.GetAttribute("refines");
                            meta.Property = reader.GetAttribute("property");
                            meta.Scheme   = reader.GetAttribute("scheme");
                            meta.Content  = reader.ReadElementContentAsString();
                            result.MetaItems.Add(meta);
                        }
                        break;
                    }
                    break;
                }
            }

            return(result);
        }