mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-07-09 03:04:19 -04:00
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:
parent
c3a6e53cbb
commit
fd46cda7c4
@ -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
|
||||
|
Binary file not shown.
@ -322,27 +322,13 @@ namespace API.Services
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
private static ComicInfo FindComicInfoXml(IEnumerable<IArchiveEntry> 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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user