diff --git a/API/API.csproj b/API/API.csproj
index ab727275b..997ca6817 100644
--- a/API/API.csproj
+++ b/API/API.csproj
@@ -48,12 +48,12 @@
-
-
+
+
-
+
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/API/Controllers/DownloadController.cs b/API/Controllers/DownloadController.cs
index 1efcca35e..3e89c98ef 100644
--- a/API/Controllers/DownloadController.cs
+++ b/API/Controllers/DownloadController.cs
@@ -85,6 +85,7 @@ namespace API.Controllers
".epub" => "application/epub+zip",
".7z" => "application/x-7z-compressed",
".7zip" => "application/x-7z-compressed",
+ ".pdf" => "application/pdf",
_ => contentType
};
}
diff --git a/API/Services/BookService.cs b/API/Services/BookService.cs
index 513ff8db8..84136aa84 100644
--- a/API/Services/BookService.cs
+++ b/API/Services/BookService.cs
@@ -14,6 +14,7 @@ using API.Interfaces.Services;
using API.Parser;
using Docnet.Core;
using Docnet.Core.Models;
+using Docnet.Core.Readers;
using ExCSS;
using HtmlAgilityPack;
using Microsoft.Extensions.Logging;
@@ -375,22 +376,7 @@ namespace API.Services
for (var pageNumber = 0; pageNumber < pages; pageNumber++)
{
using var pageReader = docReader.GetPageReader(pageNumber);
- var rawBytes = pageReader.GetImage();
- var width = pageReader.GetPageWidth();
- var height = pageReader.GetPageHeight();
- using var doc = new Bitmap(width, height, PixelFormat.Format32bppArgb);
- using var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
- AddBytesToBitmap(bmp, rawBytes);
- for (int y = 0; y < bmp.Height; y++)
- {
- bmp.SetPixel(bmp.Width - 1, y, bmp.GetPixel(bmp.Width - 2, y));
- }
- var g = Graphics.FromImage(doc);
- g.FillRegion(Brushes.White, new Region(new Rectangle(0, 0, width, height)));
- g.DrawImage(bmp, new Point(0, 0));
- g.Save();
- using var stream = new MemoryStream();
- doc.Save(stream, ImageFormat.Jpeg);
+ using var stream = GetPdfPage(docReader, pageNumber);
File.WriteAllBytes(Path.Combine(targetDirectory, "Page-" + pageNumber + ".png"), stream.ToArray());
}
}
@@ -417,15 +403,12 @@ namespace API.Services
if (coverImageContent == null) return Array.Empty();
- if (createThumbnail)
- {
- using var stream = new MemoryStream(coverImageContent.ReadContent());
+ if (!createThumbnail) return coverImageContent.ReadContent();
- using var thumbnail = Image.ThumbnailStream(stream, MetadataService.ThumbnailWidth);
- return thumbnail.WriteToBuffer(".jpg");
- }
+ using var stream = new MemoryStream(coverImageContent.ReadContent());
+ using var thumbnail = Image.ThumbnailStream(stream, MetadataService.ThumbnailWidth);
+ return thumbnail.WriteToBuffer(".jpg");
- return coverImageContent.ReadContent();
}
catch (Exception ex)
{
@@ -442,32 +425,14 @@ namespace API.Services
using var docReader = DocLib.Instance.GetDocReader(fileFilePath, new PageDimensions(1080, 1920));
if (docReader.GetPageCount() == 0) return Array.Empty();
- using var pageReader = docReader.GetPageReader(0);
- var rawBytes = pageReader.GetImage();
- var width = pageReader.GetPageWidth();
- var height = pageReader.GetPageHeight();
- using var doc = new Bitmap(width, height, PixelFormat.Format32bppArgb);
- using var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
- AddBytesToBitmap(bmp, rawBytes);
- for (int y = 0; y < bmp.Height; y++)
- {
- bmp.SetPixel(bmp.Width - 1, y, bmp.GetPixel(bmp.Width - 2, y));
- }
- var g = Graphics.FromImage(doc);
- g.FillRegion(Brushes.White, new Region(new Rectangle(0, 0, width, height)));
- g.DrawImage(bmp, new Point(0, 0));
- g.Save();
- using var stream = new MemoryStream();
- doc.Save(stream, ImageFormat.Jpeg);
+ using var stream = GetPdfPage(docReader, 0);
stream.Seek(0, SeekOrigin.Begin);
- if (createThumbnail)
- {
- using var thumbnail = Image.ThumbnailStream(stream, MetadataService.ThumbnailWidth);
- return thumbnail.WriteToBuffer(".png");
- }
+ if (!createThumbnail) return stream.ToArray();
+
+ using var thumbnail = Image.ThumbnailStream(stream, MetadataService.ThumbnailWidth);
+ return thumbnail.WriteToBuffer(".png");
- return stream.ToArray();
}
catch (Exception ex)
{
@@ -479,6 +444,29 @@ namespace API.Services
return Array.Empty();
}
+ private static MemoryStream GetPdfPage(IDocReader docReader, int pageNumber)
+ {
+ using var pageReader = docReader.GetPageReader(pageNumber);
+ var rawBytes = pageReader.GetImage();
+ var width = pageReader.GetPageWidth();
+ var height = pageReader.GetPageHeight();
+ using var doc = new Bitmap(width, height, PixelFormat.Format32bppArgb);
+ using var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
+ AddBytesToBitmap(bmp, rawBytes);
+ for (int y = 0; y < bmp.Height; y++)
+ {
+ bmp.SetPixel(bmp.Width - 1, y, bmp.GetPixel(bmp.Width - 2, y));
+ }
+
+ using var g = Graphics.FromImage(doc);
+ g.FillRegion(Brushes.White, new Region(new Rectangle(0, 0, width, height)));
+ g.DrawImage(bmp, new Point(0, 0));
+ g.Save();
+ var stream = new MemoryStream();
+ doc.Save(stream, ImageFormat.Jpeg);
+ return stream;
+ }
+
private static string RemoveWhiteSpaceFromStylesheets(string body)
{
body = Regex.Replace(body, @"[a-zA-Z]+#", "#");
diff --git a/Dockerfile b/Dockerfile
index adead7274..496db0002 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -20,7 +20,7 @@ COPY --from=copytask /files/wwwroot /kavita/wwwroot
#Installs program dependencies
RUN apt-get update \
- && apt-get install -y libicu-dev libssl1.1 pwgen \
+ && apt-get install -y libicu-dev libssl1.1 pwgen libgdiplus \
&& rm -rf /var/lib/apt/lists/*
#Creates the data directory
diff --git a/Kavita.Common/Kavita.Common.csproj b/Kavita.Common/Kavita.Common.csproj
index b933425c0..284571b1a 100644
--- a/Kavita.Common/Kavita.Common.csproj
+++ b/Kavita.Common/Kavita.Common.csproj
@@ -11,7 +11,11 @@
-
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
diff --git a/UI/Web/package-lock.json b/UI/Web/package-lock.json
index 57c6fee31..64a49485a 100644
--- a/UI/Web/package-lock.json
+++ b/UI/Web/package-lock.json
@@ -22,8 +22,8 @@
"@ng-bootstrap/ng-bootstrap": "^9.1.0",
"@ngx-lite/nav-drawer": "^0.4.6",
"@ngx-lite/util": "0.0.0",
- "@sentry/angular": "^6.4.1",
- "@sentry/integrations": "^6.4.1",
+ "@sentry/angular": "^6.10.0",
+ "@sentry/integrations": "^6.10.0",
"@types/file-saver": "^2.0.1",
"angular-ng-autocomplete": "^2.0.5",
"bootstrap": "^4.5.0",
@@ -3140,13 +3140,13 @@
}
},
"node_modules/@sentry/angular": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/angular/-/angular-6.4.1.tgz",
- "integrity": "sha512-lpbc1nA19SYKzaaYd/kn/xqvxI8oRForAR+lM1iE0yru/56ZrFKoUreqQQjCgtMD5aKfI9cT4VrtIq5PVkfOeA==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/angular/-/angular-6.10.0.tgz",
+ "integrity": "sha512-SSnsz4sVu9LJh7RM+z9FopWytl2yYNZQ2nK/zv/6iQKIBOqvnCqUIPjVjq1rFYXOe0jOJKsn0QlQLKp4MajYMg==",
"dependencies": {
- "@sentry/browser": "6.4.1",
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/browser": "6.10.0",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"rxjs": "^6.6.0",
"tslib": "^1.9.3"
},
@@ -3165,13 +3165,13 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@sentry/browser": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.4.1.tgz",
- "integrity": "sha512-3cDud6GWutnJqcnheIq0lPNTsUJbrRLevQ+g1YfawVXFUxfmmY2bOsGd/Mxq17LxYeBHgKTitXv3DU1bsQ+WBQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.10.0.tgz",
+ "integrity": "sha512-H0Blgp8f8bomebkkGWIgxHVjabtQAlsKJDiFXBg7gIc75YcarRxwH0R3hMog1/h8mmv4CGGUsy5ljYW6jsNnvA==",
"dependencies": {
- "@sentry/core": "6.4.1",
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/core": "6.10.0",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"tslib": "^1.9.3"
},
"engines": {
@@ -3184,14 +3184,14 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@sentry/core": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.4.1.tgz",
- "integrity": "sha512-Lx13oTiP+Tjvm5VxulcCszNVd2S1wY4viSnr+ygq62ySVERR+t7uOZDSARZ0rZ259GwW6nkbMh9dDmD0d6VCGQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.10.0.tgz",
+ "integrity": "sha512-5KlxHJlbD7AMo+b9pMGkjxUOfMILtsqCtGgI7DMvZNfEkdohO8QgUY+hPqr540kmwArFS91ipQYWhqzGaOhM3Q==",
"dependencies": {
- "@sentry/hub": "6.4.1",
- "@sentry/minimal": "6.4.1",
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/hub": "6.10.0",
+ "@sentry/minimal": "6.10.0",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"tslib": "^1.9.3"
},
"engines": {
@@ -3204,12 +3204,12 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@sentry/hub": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.4.1.tgz",
- "integrity": "sha512-7IZRP5buDE6s/c3vWzzPR/ySE+8GUuHPgTEPiDCPOCWwUN11zXDafJDKkJqY3muJfebUKmC/JG67RyBx+XlnlQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.10.0.tgz",
+ "integrity": "sha512-MV8wjhWiFAXZAhmj7Ef5QdBr2IF93u8xXiIo2J+dRZ7eVa4/ZszoUiDbhUcl/TPxczaw4oW2a6tINBNFLzXiig==",
"dependencies": {
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"tslib": "^1.9.3"
},
"engines": {
@@ -3222,12 +3222,12 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@sentry/integrations": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.4.1.tgz",
- "integrity": "sha512-3kw6NcrFGXW+qlfT112EkYt7jdFX55m9yJN5eCt7Iad59YzA8ji8Pio5ohy9Pl+OfYXlKRFOvnYPpZZn80UjlQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.10.0.tgz",
+ "integrity": "sha512-NMtB0jjFYFZRxyjYu2dWLThk9YPIwqhi4hYywmWkbv4/ILzi5Rwnh+aqNW6yrj8qG4b9itNMh3YvEzmf0aqauw==",
"dependencies": {
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"localforage": "^1.8.1",
"tslib": "^1.9.3"
},
@@ -3241,12 +3241,12 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@sentry/minimal": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.4.1.tgz",
- "integrity": "sha512-4x/PRbDZACCKJqjta9EkhiIMyGMf7VgBX13EEWEDVWLP7ymFukBuTr4ap/Tz9429kB/yXZuDGGMIZp/G618H3g==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.10.0.tgz",
+ "integrity": "sha512-yarm046UgUFIBoxqnBan2+BEgaO9KZCrLzsIsmALiQvpfW92K1lHurSawl5W6SR7wCYBnNn7CPvPE/BHFdy4YA==",
"dependencies": {
- "@sentry/hub": "6.4.1",
- "@sentry/types": "6.4.1",
+ "@sentry/hub": "6.10.0",
+ "@sentry/types": "6.10.0",
"tslib": "^1.9.3"
},
"engines": {
@@ -3259,19 +3259,19 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@sentry/types": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.4.1.tgz",
- "integrity": "sha512-sTu/GaLsLYk1AkAqpkMT4+4q665LtZjhV0hkgiTD4N3zPl5uSf1pCIzxPRYjOpe7NEANmWv8U4PaGKGtc2eMfA==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.10.0.tgz",
+ "integrity": "sha512-M7s0JFgG7/6/yNVYoPUbxzaXDhnzyIQYRRJJKRaTD77YO4MHvi4Ke8alBWqD5fer0cPIfcSkBqa9BLdqRqcMWw==",
"engines": {
"node": ">=6"
}
},
"node_modules/@sentry/utils": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.4.1.tgz",
- "integrity": "sha512-xJ1uVa5fvg23pXQfulvCIBb9pQ3p1awyd1PapK2AYi+wKjTuYl4B9edmhjRREEQEExznl/d2OVm78fRXLq7M9Q==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.10.0.tgz",
+ "integrity": "sha512-F9OczOcZMFtazYVZ6LfRIe65/eOfQbiAedIKS0li4npuMz0jKYRbxrjd/U7oLiNQkPAp4/BujU4m1ZIwq6a+tg==",
"dependencies": {
- "@sentry/types": "6.4.1",
+ "@sentry/types": "6.10.0",
"tslib": "^1.9.3"
},
"engines": {
@@ -22898,13 +22898,13 @@
}
},
"@sentry/angular": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/angular/-/angular-6.4.1.tgz",
- "integrity": "sha512-lpbc1nA19SYKzaaYd/kn/xqvxI8oRForAR+lM1iE0yru/56ZrFKoUreqQQjCgtMD5aKfI9cT4VrtIq5PVkfOeA==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/angular/-/angular-6.10.0.tgz",
+ "integrity": "sha512-SSnsz4sVu9LJh7RM+z9FopWytl2yYNZQ2nK/zv/6iQKIBOqvnCqUIPjVjq1rFYXOe0jOJKsn0QlQLKp4MajYMg==",
"requires": {
- "@sentry/browser": "6.4.1",
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/browser": "6.10.0",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"rxjs": "^6.6.0",
"tslib": "^1.9.3"
},
@@ -22917,13 +22917,13 @@
}
},
"@sentry/browser": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.4.1.tgz",
- "integrity": "sha512-3cDud6GWutnJqcnheIq0lPNTsUJbrRLevQ+g1YfawVXFUxfmmY2bOsGd/Mxq17LxYeBHgKTitXv3DU1bsQ+WBQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.10.0.tgz",
+ "integrity": "sha512-H0Blgp8f8bomebkkGWIgxHVjabtQAlsKJDiFXBg7gIc75YcarRxwH0R3hMog1/h8mmv4CGGUsy5ljYW6jsNnvA==",
"requires": {
- "@sentry/core": "6.4.1",
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/core": "6.10.0",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"tslib": "^1.9.3"
},
"dependencies": {
@@ -22935,14 +22935,14 @@
}
},
"@sentry/core": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.4.1.tgz",
- "integrity": "sha512-Lx13oTiP+Tjvm5VxulcCszNVd2S1wY4viSnr+ygq62ySVERR+t7uOZDSARZ0rZ259GwW6nkbMh9dDmD0d6VCGQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.10.0.tgz",
+ "integrity": "sha512-5KlxHJlbD7AMo+b9pMGkjxUOfMILtsqCtGgI7DMvZNfEkdohO8QgUY+hPqr540kmwArFS91ipQYWhqzGaOhM3Q==",
"requires": {
- "@sentry/hub": "6.4.1",
- "@sentry/minimal": "6.4.1",
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/hub": "6.10.0",
+ "@sentry/minimal": "6.10.0",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"tslib": "^1.9.3"
},
"dependencies": {
@@ -22954,12 +22954,12 @@
}
},
"@sentry/hub": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.4.1.tgz",
- "integrity": "sha512-7IZRP5buDE6s/c3vWzzPR/ySE+8GUuHPgTEPiDCPOCWwUN11zXDafJDKkJqY3muJfebUKmC/JG67RyBx+XlnlQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.10.0.tgz",
+ "integrity": "sha512-MV8wjhWiFAXZAhmj7Ef5QdBr2IF93u8xXiIo2J+dRZ7eVa4/ZszoUiDbhUcl/TPxczaw4oW2a6tINBNFLzXiig==",
"requires": {
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"tslib": "^1.9.3"
},
"dependencies": {
@@ -22971,12 +22971,12 @@
}
},
"@sentry/integrations": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.4.1.tgz",
- "integrity": "sha512-3kw6NcrFGXW+qlfT112EkYt7jdFX55m9yJN5eCt7Iad59YzA8ji8Pio5ohy9Pl+OfYXlKRFOvnYPpZZn80UjlQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.10.0.tgz",
+ "integrity": "sha512-NMtB0jjFYFZRxyjYu2dWLThk9YPIwqhi4hYywmWkbv4/ILzi5Rwnh+aqNW6yrj8qG4b9itNMh3YvEzmf0aqauw==",
"requires": {
- "@sentry/types": "6.4.1",
- "@sentry/utils": "6.4.1",
+ "@sentry/types": "6.10.0",
+ "@sentry/utils": "6.10.0",
"localforage": "^1.8.1",
"tslib": "^1.9.3"
},
@@ -22989,12 +22989,12 @@
}
},
"@sentry/minimal": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.4.1.tgz",
- "integrity": "sha512-4x/PRbDZACCKJqjta9EkhiIMyGMf7VgBX13EEWEDVWLP7ymFukBuTr4ap/Tz9429kB/yXZuDGGMIZp/G618H3g==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.10.0.tgz",
+ "integrity": "sha512-yarm046UgUFIBoxqnBan2+BEgaO9KZCrLzsIsmALiQvpfW92K1lHurSawl5W6SR7wCYBnNn7CPvPE/BHFdy4YA==",
"requires": {
- "@sentry/hub": "6.4.1",
- "@sentry/types": "6.4.1",
+ "@sentry/hub": "6.10.0",
+ "@sentry/types": "6.10.0",
"tslib": "^1.9.3"
},
"dependencies": {
@@ -23006,16 +23006,16 @@
}
},
"@sentry/types": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.4.1.tgz",
- "integrity": "sha512-sTu/GaLsLYk1AkAqpkMT4+4q665LtZjhV0hkgiTD4N3zPl5uSf1pCIzxPRYjOpe7NEANmWv8U4PaGKGtc2eMfA=="
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.10.0.tgz",
+ "integrity": "sha512-M7s0JFgG7/6/yNVYoPUbxzaXDhnzyIQYRRJJKRaTD77YO4MHvi4Ke8alBWqD5fer0cPIfcSkBqa9BLdqRqcMWw=="
},
"@sentry/utils": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.4.1.tgz",
- "integrity": "sha512-xJ1uVa5fvg23pXQfulvCIBb9pQ3p1awyd1PapK2AYi+wKjTuYl4B9edmhjRREEQEExznl/d2OVm78fRXLq7M9Q==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.10.0.tgz",
+ "integrity": "sha512-F9OczOcZMFtazYVZ6LfRIe65/eOfQbiAedIKS0li4npuMz0jKYRbxrjd/U7oLiNQkPAp4/BujU4m1ZIwq6a+tg==",
"requires": {
- "@sentry/types": "6.4.1",
+ "@sentry/types": "6.10.0",
"tslib": "^1.9.3"
},
"dependencies": {
diff --git a/UI/Web/package.json b/UI/Web/package.json
index bafaa04c5..de53766f5 100644
--- a/UI/Web/package.json
+++ b/UI/Web/package.json
@@ -29,8 +29,8 @@
"@ng-bootstrap/ng-bootstrap": "^9.1.0",
"@ngx-lite/nav-drawer": "^0.4.6",
"@ngx-lite/util": "0.0.0",
- "@sentry/angular": "^6.4.1",
- "@sentry/integrations": "^6.4.1",
+ "@sentry/angular": "^6.10.0",
+ "@sentry/integrations": "^6.10.0",
"@types/file-saver": "^2.0.1",
"angular-ng-autocomplete": "^2.0.5",
"bootstrap": "^4.5.0",
diff --git a/UI/Web/src/app/shared/_services/download.service.ts b/UI/Web/src/app/shared/_services/download.service.ts
index 8e32ffca4..ad8d7752e 100644
--- a/UI/Web/src/app/shared/_services/download.service.ts
+++ b/UI/Web/src/app/shared/_services/download.service.ts
@@ -96,7 +96,7 @@ export class DownloadService {
*/
private getFilenameFromHeader(headers: HttpHeaders, defaultName: string) {
const tokens = (headers.get('content-disposition') || '').split(';');
- let filename = tokens[1].replace('filename=', '').replace('"', '').trim();
+ let filename = tokens[1].replace('filename=', '').replace(/"/ig, '').trim();
if (filename.startsWith('download_') || filename.startsWith('kavita_download_')) {
const ext = filename.substring(filename.lastIndexOf('.'), filename.length);
return defaultName + ext;
diff --git a/entrypoint.sh b/entrypoint.sh
index 6e69c9b4a..3a5328354 100755
--- a/entrypoint.sh
+++ b/entrypoint.sh
@@ -79,4 +79,6 @@ else
fi
+chmod +x ./Kavita
+
./Kavita