diff --git a/API.Tests/Services/ArchiveServiceTests.cs b/API.Tests/Services/ArchiveServiceTests.cs
index b3c4ac877..86f186b95 100644
--- a/API.Tests/Services/ArchiveServiceTests.cs
+++ b/API.Tests/Services/ArchiveServiceTests.cs
@@ -32,7 +32,7 @@ namespace API.Tests.Services
}
[Theory]
- [InlineData("non existant file.zip", false)]
+ [InlineData("non existent file.zip", false)]
[InlineData("wrong extension.rar", false)]
[InlineData("empty.zip", false)]
[InlineData("flat file.zip", true)]
@@ -45,6 +45,20 @@ namespace API.Tests.Services
Assert.Equal(expected, _archiveService.IsValidArchive(Path.Join(testDirectory, archivePath)));
}
+ [Theory]
+ [InlineData("non existent file.zip", 0)]
+ [InlineData("wrong extension.rar", 0)]
+ [InlineData("empty.zip", 0)]
+ [InlineData("flat file.zip", 1)]
+ [InlineData("file in folder in folder.zip", 1)]
+ [InlineData("file in folder.zip", 1)]
+ [InlineData("file in folder_alt.zip", 1)]
+ public void GetNumberOfPagesFromArchiveTest(string archivePath, int expected)
+ {
+ var testDirectory = Path.Join(Directory.GetCurrentDirectory(), "../../../Services/Test Data/ArchiveService/Archives");
+ Assert.Equal(expected, _archiveService.GetNumberOfPagesFromArchive(Path.Join(testDirectory, archivePath)));
+ }
+
[Theory]
[InlineData("v10.cbz", "v10.expected.jpg")]
[InlineData("v10 - with folder.cbz", "v10 - with folder.expected.jpg")]
diff --git a/API/Services/ArchiveService.cs b/API/Services/ArchiveService.cs
index b1615c705..41d20a8e7 100644
--- a/API/Services/ArchiveService.cs
+++ b/API/Services/ArchiveService.cs
@@ -11,11 +11,12 @@ using NetVips;
namespace API.Services
{
///
- /// Responsible for manipulating Archive files. Used by almost exclusively.
+ /// Responsible for manipulating Archive files. Used by and
///
public class ArchiveService : IArchiveService
{
private readonly ILogger _logger;
+ private const int ThumbnailWidth = 320;
public ArchiveService(ILogger logger)
{
@@ -25,7 +26,6 @@ namespace API.Services
public int GetNumberOfPagesFromArchive(string archivePath)
{
if (!IsValidArchive(archivePath)) return 0;
-
_logger.LogDebug($"Getting Page numbers from {archivePath}");
try
@@ -53,53 +53,43 @@ namespace API.Services
try
{
if (!IsValidArchive(filepath)) return Array.Empty();
- //if (string.IsNullOrEmpty(filepath) || !File.Exists(filepath) || !Parser.Parser.IsArchive(filepath)) return Array.Empty();
-
_logger.LogDebug($"Extracting Cover image from {filepath}");
+
using ZipArchive archive = ZipFile.OpenRead(filepath);
if (!archive.HasFiles()) return Array.Empty();
var folder = archive.Entries.SingleOrDefault(x => Path.GetFileNameWithoutExtension(x.Name).ToLower() == "folder");
var entries = archive.Entries.Where(x => Path.HasExtension(x.FullName) && Parser.Parser.IsImage(x.FullName)).OrderBy(x => x.FullName).ToList();
- ZipArchiveEntry entry;
-
- if (folder != null)
- {
- entry = folder;
- } else if (!entries.Any())
- {
- return Array.Empty();
- }
- else
- {
- entry = entries[0];
- }
+ var entry = folder ?? entries[0];
-
- if (createThumbnail)
- {
- try
- {
- using var stream = entry.Open();
- var thumbnail = Image.ThumbnailStream(stream, 320);
- return thumbnail.WriteToBuffer(".jpg");
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "There was a critical error and prevented thumbnail generation.");
- }
- }
-
- return ExtractEntryToImage(entry);
+ return createThumbnail ? CreateThumbnail(entry) : ConvertEntryToByteArray(entry);
}
catch (Exception ex)
{
_logger.LogError(ex, "There was an exception when reading archive stream.");
- return Array.Empty();
}
+
+ return Array.Empty();
}
-
- private static byte[] ExtractEntryToImage(ZipArchiveEntry entry)
+
+ private byte[] CreateThumbnail(ZipArchiveEntry entry)
+ {
+ var coverImage = Array.Empty();
+ try
+ {
+ using var stream = entry.Open();
+ using var thumbnail = Image.ThumbnailStream(stream, ThumbnailWidth);
+ coverImage = thumbnail.WriteToBuffer(".jpg");
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "There was a critical error and prevented thumbnail generation. Defaulting to no cover image.");
+ }
+
+ return coverImage;
+ }
+
+ private static byte[] ConvertEntryToByteArray(ZipArchiveEntry entry)
{
using var stream = entry.Open();
using var ms = new MemoryStream();