From fd46cda7c41a74e3b7ce803b8cf21ef8f0f65713 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Sat, 29 Jan 2022 08:50:24 -0800 Subject: [PATCH] Reworked the logic for finding comicinfo to ensure that it finds top-level first and stream lined the logic. (#1008) --- API.Tests/Services/ArchiveServiceTests.cs | 11 ++++ .../ComicInfos/ComicInfo_duplicateInfos.zip | Bin 0 -> 1884 bytes API/Services/ArchiveService.cs | 59 ++++++------------ 3 files changed, 31 insertions(+), 39 deletions(-) create mode 100644 API.Tests/Services/Test Data/ArchiveService/ComicInfos/ComicInfo_duplicateInfos.zip diff --git a/API.Tests/Services/ArchiveServiceTests.cs b/API.Tests/Services/ArchiveServiceTests.cs index 526abde3e..7de8bb2bf 100644 --- a/API.Tests/Services/ArchiveServiceTests.cs +++ b/API.Tests/Services/ArchiveServiceTests.cs @@ -257,6 +257,17 @@ namespace API.Tests.Services Assert.Equal("Junya Inoue", comicInfo.Writer); } + [Fact] + public void ShouldHaveComicInfo_TopLevelFileOnly() + { + var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/ComicInfos"); + var archive = Path.Join(testDirectory, "ComicInfo_duplicateInfos.zip"); + + var comicInfo = _archiveService.GetComicInfo(archive); + Assert.NotNull(comicInfo); + Assert.Equal("BTOOOM!", comicInfo.Series); + } + #endregion #region CanParseComicInfo diff --git a/API.Tests/Services/Test Data/ArchiveService/ComicInfos/ComicInfo_duplicateInfos.zip b/API.Tests/Services/Test Data/ArchiveService/ComicInfos/ComicInfo_duplicateInfos.zip new file mode 100644 index 0000000000000000000000000000000000000000..53182a1680abbd6913f58d89d34b9906ccb59bfb GIT binary patch literal 1884 zcmZ{l2{hZ;9>@PA_QqC?j4EOaszXt+FGDPi4t z7NDWf{?f99P+63O3Qqee+?e0db7*!omHV5uPOC7prF;I5Tzl4%eUP6sTYg z>+~YeFu{!3+<@{4U2GY~>4?Ca*TNW4FeQfAes4=>dge6z>8q0oSka`jVWg{3QBko4 zLEXDxHSt&OW$8*G6PSw3y4)ayQ?gH)b{!{LyIC5dFd44T(KD52;Q!3NPNbf{*ZR?) z_VKNI0eg~NGh=+fKg^sTBX(%R;<<600?k<%8)wy>++k}~Enm_{RnzgN-<&hH?jz%0 zo9ar-c=!@8X-wYhLS|sL>^f8hC}Z4`WW-ieeFkx za^EspcT*!0Eo=h;rPp*sICy0mj^-Gs5nPV&X)`6~?RA2K6_^jgrd0UNiOM;Xu3li* zaV@t~*_eyj6(8g+-aNQAjfouQh6jz`k(qolkM7e^jv$>Bg7=ocNJgy4RXwby9$}1M zoE>JiY#B(vjn?mGPJtY$%PN^!AY!r#59<2k*U@MNwv`qj#0i%CkcA?=m!DQ`p^ zeV`UWsBqq!S7rEP1-Q&`dy(L*k>+-BL&R)nWB>Aat2ay-;)@2IvFq`-9`~NR z6n%Km5xZJZae{aArN|QUf#0Nj!5E+d+kTgkYb`jXIStxVb38Hzbe@y1Z91*Q#I$5Q>b%*spH$#?+~P9F-lKCH&TB#F06sp zAb5G*x;D1)=fWq@+?}=JkUkGe;mdgIo$p&{;-k%|gZ|rg<$kaqlNJ%&;P)Z*n8%9E zI@>kyl$2)Q-MzUIBE0A*4*njf5jz55?c(#xw~RbDm?si<-YsysAyHuT=3u=Y1*YkW zq-(BZ-ZFDPfK)@X_wGZ+{Y@&2ecYSIr26$@(C-&m_+1XF^j|ApPimpN*@fx9bXoQ0 zr_96XY5zuDH$OvV^*jJ6!Ni$<=XS6`4;n2m$f%&@;)R6riwnHWA_P+{TsV((d*SVs zrJ2tX=+$LSdMB~3wQfeETw&@m%W~Qg>ulfONqNI&jtXEhCuy)*iIgHj5&)%#cNl?W zvy$+UdF{bYOJK6E;+!)gsQ6da)6)hj{N9Z}GLrH;VQ|*cGID^A$brK@gOm+1?CB1gw z^YyYiib^wK91+O%fsH1LO&YN%%ho$EtN-UvgO6ZCG5FB$!`>NVHmZf2Df}fQ?i;%k zOzgX`n4{Cjny`lw%Mdt6DVhyFZCYp>4@t-MfVOcctJ8>6f=99@YMFH3&a&9~dx|^3CvOS(dz^J(ARmB;=j7$b6f%IykDg zo*uh3J|{Bu;h0w(V}zUEQC%8(-^8blJj?#uB&JQ+3Q@|~uFdl*RhU_9tFon>ks}Z;#njq~ltjVcEW zXm*_Mv;DV#+qakG*~^2z;P#6@A(tX=c<5}+8esgqW c>aPx8_t@{{f))_u82}*OlH&sa?SHcW025I%?EnA( literal 0 HcmV?d00001 diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs index 11042ed34..cdf4df4db 100644 --- a/API/Services/ArchiveService.cs +++ b/API/Services/ArchiveService.cs @@ -322,27 +322,13 @@ namespace API.Services return false; } - - private static ComicInfo FindComicInfoXml(IEnumerable entries) + private static bool ValidComicInfoArchiveEntry(string fullName, string name) { - foreach (var entry in entries) - { - var filename = Path.GetFileNameWithoutExtension(entry.Key).ToLower(); - if (filename.EndsWith(ComicInfoFilename) - && !filename.StartsWith(Parser.Parser.MacOsMetadataFileStartsWith) - && !Parser.Parser.HasBlacklistedFolderInPath(entry.Key) - && Parser.Parser.IsXml(entry.Key)) - { - using var ms = entry.OpenEntryStream(); - - var serializer = new XmlSerializer(typeof(ComicInfo)); - var info = (ComicInfo) serializer.Deserialize(ms); - return info; - } - } - - - return null; + var filenameWithoutExtension = Path.GetFileNameWithoutExtension(name).ToLower(); + return !Parser.Parser.HasBlacklistedFolderInPath(fullName) + && filenameWithoutExtension.Equals(ComicInfoFilename, StringComparison.InvariantCultureIgnoreCase) + && !filenameWithoutExtension.StartsWith(Parser.Parser.MacOsMetadataFileStartsWith) + && Parser.Parser.IsXml(name); } /// @@ -364,12 +350,8 @@ namespace API.Services case ArchiveLibrary.Default: { using var archive = ZipFile.OpenRead(archivePath); - var entry = archive.Entries.FirstOrDefault(x => - !Parser.Parser.HasBlacklistedFolderInPath(x.FullName) - && Path.GetFileNameWithoutExtension(x.Name)?.ToLower() == ComicInfoFilename - && !Path.GetFileNameWithoutExtension(x.Name) - .StartsWith(Parser.Parser.MacOsMetadataFileStartsWith) - && Parser.Parser.IsXml(x.FullName)); + + var entry = archive.Entries.FirstOrDefault(x => ValidComicInfoArchiveEntry(x.FullName, x.Name)); if (entry != null) { using var stream = entry.Open(); @@ -384,20 +366,19 @@ namespace API.Services case ArchiveLibrary.SharpCompress: { using var archive = ArchiveFactory.Open(archivePath); - var info = FindComicInfoXml(archive.Entries.Where(entry => !entry.IsDirectory - && !Parser.Parser - .HasBlacklistedFolderInPath( - Path.GetDirectoryName( - entry.Key) ?? string.Empty) - && !Path - .GetFileNameWithoutExtension( - entry.Key).StartsWith(Parser - .Parser - .MacOsMetadataFileStartsWith) - && Parser.Parser.IsXml(entry.Key))); - ComicInfo.CleanComicInfo(info); + var entry = archive.Entries.FirstOrDefault(entry => + ValidComicInfoArchiveEntry(Path.GetDirectoryName(entry.Key), entry.Key)); - return info; + if (entry != null) + { + using var stream = entry.OpenEntryStream(); + var serializer = new XmlSerializer(typeof(ComicInfo)); + var info = (ComicInfo) serializer.Deserialize(stream); + ComicInfo.CleanComicInfo(info); + return info; + } + + break; } case ArchiveLibrary.NotSupported: _logger.LogWarning("[GetComicInfo] This archive cannot be read: {ArchivePath}", archivePath);