Reworked the logic for finding comicinfo to ensure that it finds top-level first and stream lined the logic. (#1008)

This commit is contained in:
Joseph Milazzo 2022-01-29 08:50:24 -08:00 committed by GitHub
parent c3a6e53cbb
commit fd46cda7c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 39 deletions

View File

@ -257,6 +257,17 @@ namespace API.Tests.Services
Assert.Equal("Junya Inoue", comicInfo.Writer); 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 #endregion
#region CanParseComicInfo #region CanParseComicInfo

View File

@ -322,27 +322,13 @@ namespace API.Services
return false; return false;
} }
private static bool ValidComicInfoArchiveEntry(string fullName, string name)
private static ComicInfo FindComicInfoXml(IEnumerable<IArchiveEntry> entries)
{ {
foreach (var entry in entries) var filenameWithoutExtension = Path.GetFileNameWithoutExtension(name).ToLower();
{ return !Parser.Parser.HasBlacklistedFolderInPath(fullName)
var filename = Path.GetFileNameWithoutExtension(entry.Key).ToLower(); && filenameWithoutExtension.Equals(ComicInfoFilename, StringComparison.InvariantCultureIgnoreCase)
if (filename.EndsWith(ComicInfoFilename) && !filenameWithoutExtension.StartsWith(Parser.Parser.MacOsMetadataFileStartsWith)
&& !filename.StartsWith(Parser.Parser.MacOsMetadataFileStartsWith) && Parser.Parser.IsXml(name);
&& !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;
} }
/// <summary> /// <summary>
@ -364,12 +350,8 @@ namespace API.Services
case ArchiveLibrary.Default: case ArchiveLibrary.Default:
{ {
using var archive = ZipFile.OpenRead(archivePath); using var archive = ZipFile.OpenRead(archivePath);
var entry = archive.Entries.FirstOrDefault(x =>
!Parser.Parser.HasBlacklistedFolderInPath(x.FullName) var entry = archive.Entries.FirstOrDefault(x => ValidComicInfoArchiveEntry(x.FullName, x.Name));
&& Path.GetFileNameWithoutExtension(x.Name)?.ToLower() == ComicInfoFilename
&& !Path.GetFileNameWithoutExtension(x.Name)
.StartsWith(Parser.Parser.MacOsMetadataFileStartsWith)
&& Parser.Parser.IsXml(x.FullName));
if (entry != null) if (entry != null)
{ {
using var stream = entry.Open(); using var stream = entry.Open();
@ -384,20 +366,19 @@ namespace API.Services
case ArchiveLibrary.SharpCompress: case ArchiveLibrary.SharpCompress:
{ {
using var archive = ArchiveFactory.Open(archivePath); using var archive = ArchiveFactory.Open(archivePath);
var info = FindComicInfoXml(archive.Entries.Where(entry => !entry.IsDirectory var entry = archive.Entries.FirstOrDefault(entry =>
&& !Parser.Parser ValidComicInfoArchiveEntry(Path.GetDirectoryName(entry.Key), entry.Key));
.HasBlacklistedFolderInPath(
Path.GetDirectoryName(
entry.Key) ?? string.Empty)
&& !Path
.GetFileNameWithoutExtension(
entry.Key).StartsWith(Parser
.Parser
.MacOsMetadataFileStartsWith)
&& Parser.Parser.IsXml(entry.Key)));
ComicInfo.CleanComicInfo(info);
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: case ArchiveLibrary.NotSupported:
_logger.LogWarning("[GetComicInfo] This archive cannot be read: {ArchivePath}", archivePath); _logger.LogWarning("[GetComicInfo] This archive cannot be read: {ArchivePath}", archivePath);