diff --git a/MediaBrowser.Providers/Books/ComicBookInfo/ComicBookInfoProvider.cs b/MediaBrowser.Providers/Books/ComicBookInfo/ComicBookInfoProvider.cs index a372b90212..4fcbb3ce40 100644 --- a/MediaBrowser.Providers/Books/ComicBookInfo/ComicBookInfoProvider.cs +++ b/MediaBrowser.Providers/Books/ComicBookInfo/ComicBookInfoProvider.cs @@ -1,6 +1,7 @@ using System; using System.Globalization; using System.IO; +using System.IO.Compression; using System.Linq; using System.Text.Json; using System.Threading; @@ -12,7 +13,6 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.IO; using MediaBrowser.Providers.Books.ComicBookInfo.Models; using Microsoft.Extensions.Logging; -using SharpCompress.Archives.Zip; namespace MediaBrowser.Providers.Books.ComicBookInfo; @@ -48,28 +48,18 @@ public class ComicBookInfoProvider : IComicProvider try { - Stream stream = File.OpenRead(path); + Stream stream = AsyncFile.OpenRead(path); - // not yet async: https://github.com/adamhathcock/sharpcompress/pull/565 await using (stream.ConfigureAwait(false)) - using (var archive = ZipArchive.Open(stream)) + await using (var archive = await ZipArchive.CreateAsync(stream, ZipArchiveMode.Read, false, null, cancellationToken).ConfigureAwait(false)) { - if (!archive.IsComplete) - { - _logger.LogError("incomplete comic archive: {Path}", info.Path); - return new MetadataResult { HasMetadata = false }; - } - - var volume = archive.Volumes.First(); - - if (volume.Comment is null) + if (archive.Comment is null) { _logger.LogInformation("missing ComicBookInfo in archive comment: {Path}", info.Path); return new MetadataResult { HasMetadata = false }; } - var comicBookMetadata = JsonSerializer.Deserialize(volume.Comment, JsonDefaults.Options); - + var comicBookMetadata = JsonSerializer.Deserialize(archive.Comment, JsonDefaults.Options); if (comicBookMetadata is null) { _logger.LogError("ComicBookInfo deserialization failure: {Path}", info.Path); diff --git a/MediaBrowser.Providers/Books/ComicInfo/ComicInfoReader.cs b/MediaBrowser.Providers/Books/ComicInfo/ComicInfoReader.cs index b8329e7805..4e8dc405ec 100644 --- a/MediaBrowser.Providers/Books/ComicInfo/ComicInfoReader.cs +++ b/MediaBrowser.Providers/Books/ComicInfo/ComicInfoReader.cs @@ -7,7 +7,6 @@ using System.Xml.XPath; using Jellyfin.Data.Enums; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; -using SharpCompress; namespace MediaBrowser.Providers.Books.ComicInfo; @@ -41,7 +40,13 @@ public static class ComicInfoReader hasFoundMetadata |= ReadStringInto(xml, "ComicInfo/Summary", summary => book.Overview = summary); hasFoundMetadata |= ReadIntInto(xml, "ComicInfo/Year", year => book.ProductionYear = year); hasFoundMetadata |= ReadThreePartDateInto(xml, "ComicInfo/Year", "ComicInfo/Month", "ComicInfo/Day", dateTime => book.PremiereDate = dateTime); - hasFoundMetadata |= ReadCommaSeparatedStringsInto(xml, "ComicInfo/Genre", genres => genres.ForEach(genre => book.AddGenre(genre))); + hasFoundMetadata |= ReadCommaSeparatedStringsInto(xml, "ComicInfo/Genre", genres => + { + foreach (var genre in genres) + { + book.AddGenre(genre); + } + }); hasFoundMetadata |= ReadStringInto(xml, "ComicInfo/Publisher", publisher => book.SetStudios([publisher])); hasFoundMetadata |= ReadStringInto(xml, "ComicInfo/AlternateSeries", title => @@ -71,32 +76,50 @@ public static class ComicInfoReader { ReadCommaSeparatedStringsInto(xml, "ComicInfo/Writer", authors => { - authors.ForEach(p => metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Author })); + foreach (var p in authors) + { + metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Author }); + } }); ReadCommaSeparatedStringsInto(xml, "ComicInfo/Penciller", pencillers => { - pencillers.ForEach(p => metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Penciller })); + foreach (var p in pencillers) + { + metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Penciller }); + } }); ReadCommaSeparatedStringsInto(xml, "ComicInfo/Inker", inkers => { - inkers.ForEach(p => metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Inker })); + foreach (var p in inkers) + { + metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Inker }); + } }); ReadCommaSeparatedStringsInto(xml, "ComicInfo/Letterer", letterers => { - letterers.ForEach(p => metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Letterer })); + foreach (var p in letterers) + { + metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Letterer }); + } }); ReadCommaSeparatedStringsInto(xml, "ComicInfo/CoverArtist", artists => { - artists.ForEach(p => metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.CoverArtist })); + foreach (var p in artists) + { + metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.CoverArtist }); + } }); ReadCommaSeparatedStringsInto(xml, "ComicInfo/Colourist", colorists => { - colorists.ForEach(p => metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Colorist })); + foreach (var p in colorists) + { + metadataResult.AddPerson(new PersonInfo { Name = p, Type = PersonKind.Colorist }); + } }); } diff --git a/MediaBrowser.Providers/Books/ComicInfo/ExternalComicInfoProvider.cs b/MediaBrowser.Providers/Books/ComicInfo/ExternalComicInfoProvider.cs index 8dd76d8b15..02cc02b7f3 100644 --- a/MediaBrowser.Providers/Books/ComicInfo/ExternalComicInfoProvider.cs +++ b/MediaBrowser.Providers/Books/ComicInfo/ExternalComicInfoProvider.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Threading; using System.Threading.Tasks;