mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-05-31 04:04:19 -04:00
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:
parent
81dfd63250
commit
107b70226c
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user