Feature/performance pdf (#427)

* Added Timeout for Regex matching to ensure malicious filenames don't crash system

* Refactored GetCoverImage to use series format rather than library type

* Refactored download logs to use the download service

* Fixed accent color not looking well on light theme

* Refactored series format into dedicated component and added to search results

* Switch to using MemoryManager for Streams to attempt to minimize GC pressure and reduced bitmap manipulation for transparency hack.

* Refactored PDF extraction to re-use the same MemoryStream for all pages

* Debug code for another issue that only users with OpenMediaVault can run
This commit is contained in:
Joseph Milazzo 2021-07-24 17:17:28 -05:00 committed by GitHub
parent 81dfd63250
commit 107b70226c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 9 deletions

View File

@ -1,4 +1,5 @@
using System.IO;
using System;
using System.IO;
using System.Linq;
using API.Comparators;
@ -78,6 +79,7 @@ namespace API.Extensions
foreach (var subDirectory in directory.EnumerateDirectories())
{
Console.WriteLine($"Flattening {subDirectory}");
FlattenDirectory(root, subDirectory, ref directoryIndex);
}
}

View File

@ -383,6 +383,7 @@ namespace API.Services
private void ExtractArchiveEntries(ZipArchive archive, string extractPath)
{
// TODO: In cases where we try to extract, but there are InvalidPathChars, we need to inform the user
var needsFlattening = ArchiveNeedsFlattening(archive);
if (!archive.HasFiles() && !needsFlattening) return;

View File

@ -376,9 +376,11 @@ namespace API.Services
using var docReader = DocLib.Instance.GetDocReader(fileFilePath, new PageDimensions(1080, 1920));
var pages = docReader.GetPageCount();
using var stream = StreamManager.GetStream("BookService.GetPdfPage");
for (var pageNumber = 0; pageNumber < pages; pageNumber++)
{
using var stream = GetPdfPage(docReader, pageNumber);
// IDEA! Move stream out and use the same stream
GetPdfPage(docReader, pageNumber, stream);
File.WriteAllBytes(Path.Combine(targetDirectory, "Page-" + pageNumber + ".png"), stream.ToArray());
}
}
@ -427,8 +429,8 @@ namespace API.Services
using var docReader = DocLib.Instance.GetDocReader(fileFilePath, new PageDimensions(1080, 1920));
if (docReader.GetPageCount() == 0) return Array.Empty<byte>();
using var stream = GetPdfPage(docReader, 0);
stream.Seek(0, SeekOrigin.Begin);
using var stream = StreamManager.GetStream("BookService.GetPdfPage");
GetPdfPage(docReader, 0, stream);
if (!createThumbnail) return stream.ToArray();
@ -446,7 +448,7 @@ namespace API.Services
return Array.Empty<byte>();
}
private static MemoryStream GetPdfPage(IDocReader docReader, int pageNumber)
private static void GetPdfPage(IDocReader docReader, int pageNumber, Stream stream)
{
using var pageReader = docReader.GetPageReader(pageNumber);
var rawBytes = pageReader.GetImage(new NaiveTransparencyRemover());
@ -459,10 +461,9 @@ namespace API.Services
{
bmp.SetPixel(bmp.Width - 1, y, bmp.GetPixel(bmp.Width - 2, y));
}
var stream = StreamManager.GetStream("BookService.GetPdfPage");
stream.Seek(0, SeekOrigin.Begin);
bmp.Save(stream, ImageFormat.Jpeg);
return stream;
stream.Seek(0, SeekOrigin.Begin);
}
private static string RemoveWhiteSpaceFromStylesheets(string body)

View File

@ -7,6 +7,6 @@ export interface SearchResult {
name: string;
originalName: string;
sortName: string;
coverImage: string; // byte64 encoded
coverImage: string; // byte64 encoded (not used)
format: MangaFormat;
}