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 System.Linq;
using API.Comparators; using API.Comparators;
@ -78,6 +79,7 @@ namespace API.Extensions
foreach (var subDirectory in directory.EnumerateDirectories()) foreach (var subDirectory in directory.EnumerateDirectories())
{ {
Console.WriteLine($"Flattening {subDirectory}");
FlattenDirectory(root, subDirectory, ref directoryIndex); FlattenDirectory(root, subDirectory, ref directoryIndex);
} }
} }

View File

@ -383,6 +383,7 @@ namespace API.Services
private void ExtractArchiveEntries(ZipArchive archive, string extractPath) 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); var needsFlattening = ArchiveNeedsFlattening(archive);
if (!archive.HasFiles() && !needsFlattening) return; 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)); using var docReader = DocLib.Instance.GetDocReader(fileFilePath, new PageDimensions(1080, 1920));
var pages = docReader.GetPageCount(); var pages = docReader.GetPageCount();
using var stream = StreamManager.GetStream("BookService.GetPdfPage");
for (var pageNumber = 0; pageNumber < pages; pageNumber++) 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()); 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)); using var docReader = DocLib.Instance.GetDocReader(fileFilePath, new PageDimensions(1080, 1920));
if (docReader.GetPageCount() == 0) return Array.Empty<byte>(); if (docReader.GetPageCount() == 0) return Array.Empty<byte>();
using var stream = GetPdfPage(docReader, 0); using var stream = StreamManager.GetStream("BookService.GetPdfPage");
stream.Seek(0, SeekOrigin.Begin); GetPdfPage(docReader, 0, stream);
if (!createThumbnail) return stream.ToArray(); if (!createThumbnail) return stream.ToArray();
@ -446,7 +448,7 @@ namespace API.Services
return Array.Empty<byte>(); 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); using var pageReader = docReader.GetPageReader(pageNumber);
var rawBytes = pageReader.GetImage(new NaiveTransparencyRemover()); 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)); bmp.SetPixel(bmp.Width - 1, y, bmp.GetPixel(bmp.Width - 2, y));
} }
stream.Seek(0, SeekOrigin.Begin);
var stream = StreamManager.GetStream("BookService.GetPdfPage");
bmp.Save(stream, ImageFormat.Jpeg); bmp.Save(stream, ImageFormat.Jpeg);
return stream; stream.Seek(0, SeekOrigin.Begin);
} }
private static string RemoveWhiteSpaceFromStylesheets(string body) private static string RemoveWhiteSpaceFromStylesheets(string body)

View File

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