From 58800c0b4efbc4e8021f4efdc6e092c199222f71 Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Sat, 13 Jul 2024 11:52:23 -0500 Subject: [PATCH] Refactored how system fonts were loaded (at least covered for local development) so that instead of going through the api, they are instead resolved by using assets/fonts/{fontName}/{fontFile}. --- API/Controllers/FontController.cs | 63 ++++++++---- API/Controllers/ThemeController.cs | 2 +- API/DTOs/Font/EpubFontDto.cs | 4 +- API/Data/Repositories/EpubFontRepository.cs | 5 +- API/Data/Seed.cs | 96 ++++++++++++++++-- API/Services/Tasks/FontService.cs | 6 +- .../src/app/_models/preferences/epub-font.ts | 3 +- UI/Web/src/app/_services/font.service.ts | 9 +- .../book-reader/book-reader.component.ts | 1 + .../reader-settings.component.html | 4 +- .../reader-settings.component.ts | 8 +- .../user-preferences.component.ts | 3 +- .../EBGaramond-Italic-VariableFont_wght.ttf | Bin .../EBGaramond-Italic-VariableFont_wght.woff2 | Bin .../EBGaramond-VariableFont_wght.ttf | Bin .../EBGaramond-VariableFont_wght.woff2 | Bin .../fonts/{EBGarmond => EB Garmond}/OFL.txt | 0 .../FiraSans-Black.ttf | Bin .../FiraSans-Black.woff2 | Bin .../FiraSans-BlackItalic.ttf | Bin .../FiraSans-BlackItalic.woff2 | Bin .../FiraSans-Bold.ttf | Bin .../FiraSans-Bold.woff2 | Bin .../FiraSans-BoldItalic.ttf | Bin .../FiraSans-BoldItalic.woff2 | Bin .../FiraSans-ExtraBold.ttf | Bin .../FiraSans-ExtraBold.woff2 | Bin .../FiraSans-ExtraBoldItalic.ttf | Bin .../FiraSans-ExtraBoldItalic.woff2 | Bin .../FiraSans-ExtraLight.ttf | Bin .../FiraSans-ExtraLight.woff2 | Bin .../FiraSans-ExtraLightItalic.ttf | Bin .../FiraSans-ExtraLightItalic.woff2 | Bin .../FiraSans-Italic.ttf | Bin .../FiraSans-Italic.woff2 | Bin .../FiraSans-Light.ttf | Bin .../FiraSans-Light.woff2 | Bin .../FiraSans-LightItalic.ttf | Bin .../FiraSans-LightItalic.woff2 | Bin .../FiraSans-Medium.ttf | Bin .../FiraSans-Medium.woff2 | Bin .../FiraSans-MediumItalic.ttf | Bin .../FiraSans-MediumItalic.woff2 | Bin .../FiraSans-Regular.ttf | Bin .../FiraSans-Regular.woff2 | Bin .../FiraSans-SemiBold.ttf | Bin .../FiraSans-SemiBold.woff2 | Bin .../FiraSans-SemiBoldItalic.ttf | Bin .../FiraSans-SemiBoldItalic.woff2 | Bin .../FiraSans-Thin.ttf | Bin .../FiraSans-Thin.woff2 | Bin .../FiraSans-ThinItalic.ttf | Bin .../FiraSans-ThinItalic.woff2 | Bin .../fonts/{Fira_Sans => Fira Sans}/OFL.txt | 0 .../LibreBaskerville-Bold.ttf | Bin .../LibreBaskerville-Bold.woff2 | Bin .../LibreBaskerville-Italic.ttf | Bin .../LibreBaskerville-Italic.woff2 | Bin .../LibreBaskerville-Regular.ttf | Bin .../LibreBaskerville-Regular.woff2 | Bin .../OFL.txt | 0 .../LibreCaslonText-Bold.ttf | Bin .../LibreCaslonText-Bold.woff2 | Bin .../LibreCaslonText-Italic.ttf | Bin .../LibreCaslonText-Italic.woff2 | Bin .../LibreCaslonText-Regular.ttf | Bin .../LibreCaslonText-Regular.woff2 | Bin .../{Libre_Caslon => Libre Caslon}/OFL.txt | 0 .../NanumGothic-Bold.ttf | Bin .../NanumGothic-Bold.woff2 | Bin .../NanumGothic-ExtraBold.ttf | Bin .../NanumGothic-ExtraBold.woff2 | Bin .../NanumGothic-Regular.ttf | Bin .../NanumGothic-Regular.woff2 | Bin .../{Nanum_Gothic => Nanum Gothic}/OFL.txt | 0 .../OpenDyslexic-Bold.otf | Bin .../OpenDyslexic-Bold.woff2 | Bin .../OpenDyslexic-BoldItalic.otf | Bin .../OpenDyslexic-BoldItalic.woff2 | Bin .../OpenDyslexic-Italic.otf | Bin .../OpenDyslexic-Italic.woff2 | Bin .../OpenDyslexic-Regular.otf | Bin .../OpenDyslexic-Regular.woff2 | Bin .../{RocknRoll_One => RocknRoll One}/OFL.txt | 0 .../RocknRollOne-Regular.ttf | Bin .../RocknRollOne-Regular.woff2 | Bin UI/Web/src/styles.scss | 2 +- openapi.json | 68 ++++--------- 88 files changed, 177 insertions(+), 97 deletions(-) rename UI/Web/src/assets/fonts/{EBGarmond => EB Garmond}/EBGaramond-Italic-VariableFont_wght.ttf (100%) rename UI/Web/src/assets/fonts/{EBGarmond => EB Garmond}/EBGaramond-Italic-VariableFont_wght.woff2 (100%) rename UI/Web/src/assets/fonts/{EBGarmond => EB Garmond}/EBGaramond-VariableFont_wght.ttf (100%) rename UI/Web/src/assets/fonts/{EBGarmond => EB Garmond}/EBGaramond-VariableFont_wght.woff2 (100%) rename UI/Web/src/assets/fonts/{EBGarmond => EB Garmond}/OFL.txt (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Black.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Black.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-BlackItalic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-BlackItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Bold.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Bold.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-BoldItalic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-BoldItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ExtraBold.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ExtraBold.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ExtraBoldItalic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ExtraBoldItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ExtraLight.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ExtraLight.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ExtraLightItalic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ExtraLightItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Italic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Italic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Light.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Light.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-LightItalic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-LightItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Medium.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Medium.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-MediumItalic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-MediumItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Regular.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Regular.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-SemiBold.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-SemiBold.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-SemiBoldItalic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-SemiBoldItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Thin.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-Thin.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ThinItalic.ttf (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/FiraSans-ThinItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{Fira_Sans => Fira Sans}/OFL.txt (100%) rename UI/Web/src/assets/fonts/{Libre_Baskerville => Libre Baskerville}/LibreBaskerville-Bold.ttf (100%) rename UI/Web/src/assets/fonts/{Libre_Baskerville => Libre Baskerville}/LibreBaskerville-Bold.woff2 (100%) rename UI/Web/src/assets/fonts/{Libre_Baskerville => Libre Baskerville}/LibreBaskerville-Italic.ttf (100%) rename UI/Web/src/assets/fonts/{Libre_Baskerville => Libre Baskerville}/LibreBaskerville-Italic.woff2 (100%) rename UI/Web/src/assets/fonts/{Libre_Baskerville => Libre Baskerville}/LibreBaskerville-Regular.ttf (100%) rename UI/Web/src/assets/fonts/{Libre_Baskerville => Libre Baskerville}/LibreBaskerville-Regular.woff2 (100%) rename UI/Web/src/assets/fonts/{Libre_Baskerville => Libre Baskerville}/OFL.txt (100%) rename UI/Web/src/assets/fonts/{Libre_Caslon => Libre Caslon}/LibreCaslonText-Bold.ttf (100%) rename UI/Web/src/assets/fonts/{Libre_Caslon => Libre Caslon}/LibreCaslonText-Bold.woff2 (100%) rename UI/Web/src/assets/fonts/{Libre_Caslon => Libre Caslon}/LibreCaslonText-Italic.ttf (100%) rename UI/Web/src/assets/fonts/{Libre_Caslon => Libre Caslon}/LibreCaslonText-Italic.woff2 (100%) rename UI/Web/src/assets/fonts/{Libre_Caslon => Libre Caslon}/LibreCaslonText-Regular.ttf (100%) rename UI/Web/src/assets/fonts/{Libre_Caslon => Libre Caslon}/LibreCaslonText-Regular.woff2 (100%) rename UI/Web/src/assets/fonts/{Libre_Caslon => Libre Caslon}/OFL.txt (100%) rename UI/Web/src/assets/fonts/{Nanum_Gothic => Nanum Gothic}/NanumGothic-Bold.ttf (100%) rename UI/Web/src/assets/fonts/{Nanum_Gothic => Nanum Gothic}/NanumGothic-Bold.woff2 (100%) rename UI/Web/src/assets/fonts/{Nanum_Gothic => Nanum Gothic}/NanumGothic-ExtraBold.ttf (100%) rename UI/Web/src/assets/fonts/{Nanum_Gothic => Nanum Gothic}/NanumGothic-ExtraBold.woff2 (100%) rename UI/Web/src/assets/fonts/{Nanum_Gothic => Nanum Gothic}/NanumGothic-Regular.ttf (100%) rename UI/Web/src/assets/fonts/{Nanum_Gothic => Nanum Gothic}/NanumGothic-Regular.woff2 (100%) rename UI/Web/src/assets/fonts/{Nanum_Gothic => Nanum Gothic}/OFL.txt (100%) rename UI/Web/src/assets/fonts/{OpenDyslexic2 => Open Dyslexic 2}/OpenDyslexic-Bold.otf (100%) rename UI/Web/src/assets/fonts/{OpenDyslexic2 => Open Dyslexic 2}/OpenDyslexic-Bold.woff2 (100%) rename UI/Web/src/assets/fonts/{OpenDyslexic2 => Open Dyslexic 2}/OpenDyslexic-BoldItalic.otf (100%) rename UI/Web/src/assets/fonts/{OpenDyslexic2 => Open Dyslexic 2}/OpenDyslexic-BoldItalic.woff2 (100%) rename UI/Web/src/assets/fonts/{OpenDyslexic2 => Open Dyslexic 2}/OpenDyslexic-Italic.otf (100%) rename UI/Web/src/assets/fonts/{OpenDyslexic2 => Open Dyslexic 2}/OpenDyslexic-Italic.woff2 (100%) rename UI/Web/src/assets/fonts/{OpenDyslexic2 => Open Dyslexic 2}/OpenDyslexic-Regular.otf (100%) rename UI/Web/src/assets/fonts/{OpenDyslexic2 => Open Dyslexic 2}/OpenDyslexic-Regular.woff2 (100%) rename UI/Web/src/assets/fonts/{RocknRoll_One => RocknRoll One}/OFL.txt (100%) rename UI/Web/src/assets/fonts/{RocknRoll_One => RocknRoll One}/RocknRollOne-Regular.ttf (100%) rename UI/Web/src/assets/fonts/{RocknRoll_One => RocknRoll One}/RocknRollOne-Regular.woff2 (100%) diff --git a/API/Controllers/FontController.cs b/API/Controllers/FontController.cs index 7f36bf521..6db01aebe 100644 --- a/API/Controllers/FontController.cs +++ b/API/Controllers/FontController.cs @@ -6,18 +6,15 @@ using System.Threading.Tasks; using API.Constants; using API.Data; using API.DTOs.Font; -using API.Extensions; +using API.Entities.Enums.Font; using API.Services; using API.Services.Tasks; using API.Services.Tasks.Scanner.Parser; using AutoMapper; -using Kavita.Common; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; using MimeTypes; -using Serilog; namespace API.Controllers; @@ -25,72 +22,98 @@ public class FontController : BaseApiController { private readonly IUnitOfWork _unitOfWork; private readonly IDirectoryService _directoryService; - private readonly ITaskScheduler _taskScheduler; private readonly IFontService _fontService; private readonly IMapper _mapper; private readonly Regex _fontFileExtensionRegex = new(Parser.FontFileExtensions, RegexOptions.IgnoreCase, Parser.RegexTimeout); - public FontController(IUnitOfWork unitOfWork, ITaskScheduler taskScheduler, IDirectoryService directoryService, + public FontController(IUnitOfWork unitOfWork, IDirectoryService directoryService, IFontService fontService, IMapper mapper) { _unitOfWork = unitOfWork; _directoryService = directoryService; - _taskScheduler = taskScheduler; _fontService = fontService; _mapper = mapper; } - [ResponseCache(CacheProfileName = "10Minute")] + /// + /// List out the fonts + /// + /// + [ResponseCache(CacheProfileName = ResponseCacheProfiles.TenMinute)] [HttpGet("all")] public async Task>> GetFonts() { return Ok(await _unitOfWork.EpubFontRepository.GetFontDtosAsync()); } + /// + /// Returns a font + /// + /// + /// + /// [HttpGet] [AllowAnonymous] public async Task GetFont(int fontId, string apiKey) { var userId = await _unitOfWork.UserRepository.GetUserIdByApiKeyAsync(apiKey); - if (userId == 0) return BadRequest(); var font = await _unitOfWork.EpubFontRepository.GetFontAsync(fontId); - if (font == null) return NotFound(); + // var fontDirectory = _directoryService.EpubFontDirectory; + // if (font.Provider == FontProvider.System) + // { + // fontDirectory = _directoryService. + // } + var contentType = MimeTypeMap.GetMimeType(Path.GetExtension(font.FileName)); var path = Path.Join(_directoryService.EpubFontDirectory, font.FileName); + return PhysicalFile(path, contentType); } + /// + /// Removes a font from the system + /// + /// + /// If the font is in use by other users and an admin wants it deleted, they must confirm to force delete it + /// [HttpDelete] - public async Task DeleteFont(int fontId) + public async Task DeleteFont(int fontId, bool confirmed = false) { + // TODO: We need to check if this font is used by anyone else and if so, need to inform the user + // Need to check if this is a system font as well + var forceDelete = User.IsInRole(PolicyConstants.AdminRole) && confirmed; await _fontService.Delete(fontId); return Ok(); } + /// + /// Manual upload + /// + /// + /// [HttpPost("upload")] public async Task> UploadFont(IFormFile formFile) { - if (!_fontFileExtensionRegex.IsMatch(Path.GetExtension(formFile.FileName))) - return BadRequest("Invalid file"); + if (!_fontFileExtensionRegex.IsMatch(Path.GetExtension(formFile.FileName))) return BadRequest("Invalid file"); + + if (formFile.FileName.Contains("..")) return BadRequest("Invalid file"); - if (formFile.FileName.Contains("..")) - return BadRequest("Invalid file"); var tempFile = await UploadToTemp(formFile); var font = await _fontService.CreateFontFromFileAsync(tempFile); return Ok(_mapper.Map(font)); } - [HttpPost("upload-url")] - public async Task> UploadFontByUrl(string url) - { - throw new NotImplementedException(); - } + // [HttpPost("upload-url")] + // public async Task> UploadFontByUrl(string url) + // { + // throw new NotImplementedException(); + // } private async Task UploadToTemp(IFormFile file) { diff --git a/API/Controllers/ThemeController.cs b/API/Controllers/ThemeController.cs index fb9371919..cdffa43ca 100644 --- a/API/Controllers/ThemeController.cs +++ b/API/Controllers/ThemeController.cs @@ -40,7 +40,7 @@ public class ThemeController : BaseApiController _mapper = mapper; } - [ResponseCache(CacheProfileName = "10Minute")] + [ResponseCache(CacheProfileName = ResponseCacheProfiles.TenMinute)] [AllowAnonymous] [HttpGet] public async Task>> GetThemes() diff --git a/API/DTOs/Font/EpubFontDto.cs b/API/DTOs/Font/EpubFontDto.cs index 9397e8357..8eb2712a4 100644 --- a/API/DTOs/Font/EpubFontDto.cs +++ b/API/DTOs/Font/EpubFontDto.cs @@ -8,6 +8,6 @@ public class EpubFontDto public int Id { get; set; } public string Name { get; set; } public FontProvider Provider { get; set; } - public DateTime Created { get; set; } - public DateTime LastModified { get; set; } + public string FileName { get; set; } + } diff --git a/API/Data/Repositories/EpubFontRepository.cs b/API/Data/Repositories/EpubFontRepository.cs index 7be343b55..8a396d6dd 100644 --- a/API/Data/Repositories/EpubFontRepository.cs +++ b/API/Data/Repositories/EpubFontRepository.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading.Tasks; using API.DTOs.Font; using API.Entities; +using API.Extensions; using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.EntityFrameworkCore; @@ -52,6 +53,8 @@ public class EpubFontRepository: IEpubFontRepository public async Task> GetFontDtosAsync() { return await _context.EpubFont + .OrderBy(s => s.Name == "Default" ? -1 : 0) + .ThenBy(s => s) .ProjectTo(_mapper.ConfigurationProvider) .ToListAsync(); } @@ -67,7 +70,7 @@ public class EpubFontRepository: IEpubFontRepository public async Task GetFontDtoByNameAsync(string name) { return await _context.EpubFont - .Where(f => f.Name.Equals(name)) + .Where(f => f.NormalizedName.Equals(name.ToNormalized())) .ProjectTo(_mapper.ConfigurationProvider) .FirstOrDefaultAsync(); } diff --git a/API/Data/Seed.cs b/API/Data/Seed.cs index ea96ea37a..8ddd960e6 100644 --- a/API/Data/Seed.cs +++ b/API/Data/Seed.cs @@ -32,13 +32,90 @@ public static class Seed [ ..new List { + new () + { + Name = "Default", + NormalizedName = Parser.Normalize("Default"), + Provider = FontProvider.System, + FileName = string.Empty, + }, new () { Name = "Merriweather", NormalizedName = Parser.Normalize("Merriweather"), Provider = FontProvider.System, FileName = "Merriweather-Regular.woff2", - } + }, + new () + { + Name = "EB Garamond", + NormalizedName = Parser.Normalize("EB Garamond"), + Provider = FontProvider.System, + FileName = "EBGaramond-VariableFont_wght.woff2", + }, + new () + { + Name = "Fira Sans", + NormalizedName = Parser.Normalize("Fira Sans"), + Provider = FontProvider.System, + FileName = "FiraSans-Regular.woff2", + }, + new () + { + Name = "Lato", + NormalizedName = Parser.Normalize("Lato"), + Provider = FontProvider.System, + FileName = "Lato-Regular.woff2", + }, + new () + { + Name = "Libre Baskerville", + NormalizedName = Parser.Normalize("Libre Baskerville"), + Provider = FontProvider.System, + FileName = "LibreBaskerville-Regular.woff2", + }, + new () + { + Name = "Libre Caslon", + NormalizedName = Parser.Normalize("Libre Caslon"), + Provider = FontProvider.System, + FileName = "LibreCaslonText-Regular.woff2", + }, + new () + { + Name = "Nanum Gothic", + NormalizedName = Parser.Normalize("Nanum Gothic"), + Provider = FontProvider.System, + FileName = "NanumGothic-Regular.woff2", + }, + new () + { + Name = "Open Dyslexic 2", + NormalizedName = Parser.Normalize("Open Dyslexic 2"), + Provider = FontProvider.System, + FileName = "OpenDyslexic-Regular.woff2", + }, + new () + { + Name = "Oswald", + NormalizedName = Parser.Normalize("Oswald"), + Provider = FontProvider.System, + FileName = "Oswald-VariableFont_wght.woff2", + }, + new () + { + Name = "RocknRoll One", + NormalizedName = Parser.Normalize("RocknRoll One"), + Provider = FontProvider.System, + FileName = "RocknRollOne-Regular.woff2", + }, + new () + { + Name = "Spartan", + NormalizedName = Parser.Normalize("Spartan"), + Provider = FontProvider.System, + FileName = "Spartan-VariableFont_wght.woff2", + }, } ]; @@ -159,7 +236,7 @@ public static class Seed foreach (var theme in DefaultThemes) { - var existing = context.SiteTheme.FirstOrDefault(s => s.Name.Equals(theme.Name)); + var existing = await context.SiteTheme.FirstOrDefaultAsync(s => s.Name.Equals(theme.Name)); if (existing == null) { await context.SiteTheme.AddAsync(theme); @@ -172,9 +249,10 @@ public static class Seed public static async Task SeedFonts(DataContext context) { await context.Database.EnsureCreatedAsync(); + foreach (var font in DefaultFonts) { - var existing = context.SiteTheme.FirstOrDefaultAsync(f => f.Name.Equals(font.Name)); + var existing = await context.EpubFont.FirstOrDefaultAsync(f => f.Name.Equals(font.Name)); if (existing == null) { await context.EpubFont.AddAsync(font); @@ -290,7 +368,7 @@ public static class Seed foreach (var defaultSetting in DefaultSettings) { - var existing = context.ServerSetting.FirstOrDefault(s => s.Key == defaultSetting.Key); + var existing = await context.ServerSetting.FirstOrDefaultAsync(s => s.Key == defaultSetting.Key); if (existing == null) { await context.ServerSetting.AddAsync(defaultSetting); @@ -300,15 +378,15 @@ public static class Seed await context.SaveChangesAsync(); // Port, IpAddresses and LoggingLevel are managed in appSettings.json. Update the DB values to match - context.ServerSetting.First(s => s.Key == ServerSettingKey.Port).Value = + (await context.ServerSetting.FirstAsync(s => s.Key == ServerSettingKey.Port)).Value = Configuration.Port + string.Empty; - context.ServerSetting.First(s => s.Key == ServerSettingKey.IpAddresses).Value = + (await context.ServerSetting.FirstAsync(s => s.Key == ServerSettingKey.IpAddresses)).Value = Configuration.IpAddresses; - context.ServerSetting.First(s => s.Key == ServerSettingKey.CacheDirectory).Value = + (await context.ServerSetting.FirstAsync(s => s.Key == ServerSettingKey.CacheDirectory)).Value = directoryService.CacheDirectory + string.Empty; - context.ServerSetting.First(s => s.Key == ServerSettingKey.BackupDirectory).Value = + (await context.ServerSetting.FirstAsync(s => s.Key == ServerSettingKey.BackupDirectory)).Value = DirectoryService.BackupDirectory + string.Empty; - context.ServerSetting.First(s => s.Key == ServerSettingKey.CacheSize).Value = + (await context.ServerSetting.FirstAsync(s => s.Key == ServerSettingKey.CacheSize)).Value = Configuration.CacheSize + string.Empty; await context.SaveChangesAsync(); diff --git a/API/Services/Tasks/FontService.cs b/API/Services/Tasks/FontService.cs index a85148857..7869088c8 100644 --- a/API/Services/Tasks/FontService.cs +++ b/API/Services/Tasks/FontService.cs @@ -79,16 +79,14 @@ public class FontService: IFontService } var font = await _unitOfWork.EpubFontRepository.GetFontAsync(fontId); - if (font == null) - return; + if (font == null) return; await RemoveFont(font); } public async Task RemoveFont(EpubFont font) { - if (font.Provider == FontProvider.System) - return; + if (font.Provider == FontProvider.System) return; var prefs = await _unitOfWork.UserRepository.GetAllPreferencesByFontAsync(font.Name); foreach (var pref in prefs) diff --git a/UI/Web/src/app/_models/preferences/epub-font.ts b/UI/Web/src/app/_models/preferences/epub-font.ts index 29ffa2cb6..8ac1747f7 100644 --- a/UI/Web/src/app/_models/preferences/epub-font.ts +++ b/UI/Web/src/app/_models/preferences/epub-font.ts @@ -13,6 +13,5 @@ export interface EpubFont { id: number; name: string; provider: FontProvider; - created: Date; - lastModified: Date; + fileName: string; } diff --git a/UI/Web/src/app/_services/font.service.ts b/UI/Web/src/app/_services/font.service.ts index 4ff4e5f1c..ecb9b95a9 100644 --- a/UI/Web/src/app/_services/font.service.ts +++ b/UI/Web/src/app/_services/font.service.ts @@ -1,13 +1,12 @@ import {DestroyRef, inject, Injectable} from "@angular/core"; import {map, ReplaySubject} from "rxjs"; -import {EpubFont} from "../_models/preferences/epub-font"; +import {EpubFont, FontProvider} from "../_models/preferences/epub-font"; import {environment} from 'src/environments/environment'; import {HttpClient} from "@angular/common/http"; -import {EVENTS, MessageHubService} from "./message-hub.service"; +import {MessageHubService} from "./message-hub.service"; import {NgxFileDropEntry} from "ngx-file-drop"; import {AccountService} from "./account.service"; import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; -import {NotificationProgressEvent} from "../_models/events/notification-progress-event"; @Injectable({ providedIn: 'root' @@ -41,6 +40,10 @@ export class FontService { } getFontFace(font: EpubFont): FontFace { + if (font.provider === FontProvider.System) { + return new FontFace(font.name, `url('/assets/fonts/${font.name}/${font.fileName}')`); + } + return new FontFace(font.name, `url(${this.baseUrl}font?fontId=${font.id}&apiKey=${this.encodedKey})`); } diff --git a/UI/Web/src/app/book-reader/_components/book-reader/book-reader.component.ts b/UI/Web/src/app/book-reader/_components/book-reader/book-reader.component.ts index 08cecc80b..a6680a1db 100644 --- a/UI/Web/src/app/book-reader/_components/book-reader/book-reader.component.ts +++ b/UI/Web/src/app/book-reader/_components/book-reader/book-reader.component.ts @@ -588,6 +588,7 @@ export class BookReaderComponent implements OnInit, AfterViewInit, OnDestroy { this.fontService.getFonts().subscribe(fonts => { fonts.forEach(font => { this.fontService.getFontFace(font).load().then(loadedFace => { + console.log('loaded font: ', loadedFace); (this.document as any).fonts.add(loadedFace); }); }) diff --git a/UI/Web/src/app/book-reader/_components/reader-settings/reader-settings.component.html b/UI/Web/src/app/book-reader/_components/reader-settings/reader-settings.component.html index 5e2602807..8040678c3 100644 --- a/UI/Web/src/app/book-reader/_components/reader-settings/reader-settings.component.html +++ b/UI/Web/src/app/book-reader/_components/reader-settings/reader-settings.component.html @@ -16,7 +16,9 @@
diff --git a/UI/Web/src/app/book-reader/_components/reader-settings/reader-settings.component.ts b/UI/Web/src/app/book-reader/_components/reader-settings/reader-settings.component.ts index 20b1bb99e..e9fb03a49 100644 --- a/UI/Web/src/app/book-reader/_components/reader-settings/reader-settings.component.ts +++ b/UI/Web/src/app/book-reader/_components/reader-settings/reader-settings.component.ts @@ -85,6 +85,7 @@ export const bookColorThemes = [ ]; const mobileBreakpointMarginOverride = 700; +const defaultFontFamily = 'Default'; @Component({ selector: 'app-reader-settings', @@ -132,7 +133,6 @@ export class ReaderSettingsComponent implements OnInit { /** * List of all font families user can select from */ - fontOptions: Array = []; fontFamilies: Array = []; /** * Internal property used to capture all the different css properties to render on all elements @@ -178,7 +178,6 @@ export class ReaderSettingsComponent implements OnInit { ngOnInit(): void { this.fontService.getFonts().subscribe(fonts => { this.fontFamilies = fonts; - this.fontOptions = fonts.map(f => f.name); this.cdRef.markForCheck(); }) @@ -187,7 +186,7 @@ export class ReaderSettingsComponent implements OnInit { this.user = user; if (this.user.preferences.bookReaderFontFamily === undefined) { - this.user.preferences.bookReaderFontFamily = 'default'; + this.user.preferences.bookReaderFontFamily = defaultFontFamily; } if (this.user.preferences.bookReaderFontSize === undefined || this.user.preferences.bookReaderFontSize < 50) { this.user.preferences.bookReaderFontSize = 100; @@ -211,7 +210,8 @@ export class ReaderSettingsComponent implements OnInit { this.settingsForm.addControl('bookReaderFontFamily', new FormControl(this.user.preferences.bookReaderFontFamily, [])); this.settingsForm.get('bookReaderFontFamily')!.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(fontName => { - if (fontName === 'default') { + console.log('updating font-family to ', fontName); + if (fontName === defaultFontFamily) { this.pageStyles['font-family'] = 'inherit'; } else { this.pageStyles['font-family'] = "'" + fontName + "'"; diff --git a/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.ts b/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.ts index 9da748e86..90c4bb4f8 100644 --- a/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.ts +++ b/UI/Web/src/app/user-settings/user-preferences/user-preferences.component.ts @@ -74,7 +74,6 @@ import {ManageScrobblingProvidersComponent} from "../manage-scrobbling-providers import {PdfLayoutModePipe} from "../../pdf-reader/_pipe/pdf-layout-mode.pipe"; import {PdfTheme} from "../../_models/preferences/pdf-theme"; import {PdfScrollMode} from "../../_models/preferences/pdf-scroll-mode"; -import {PdfLayoutMode} from "../../_models/preferences/pdf-layout-mode"; import {PdfSpreadMode} from "../../_models/preferences/pdf-spread-mode"; import {FontManagerComponent} from "../font-manager/font-manager/font-manager.component"; import {FontService} from "../../_services/font.service"; @@ -234,7 +233,7 @@ export class UserPreferencesComponent implements OnInit, OnDestroy { this.user.preferences = results.pref; if (this.fontFamilies.indexOf(this.user.preferences.bookReaderFontFamily) < 0) { - this.user.preferences.bookReaderFontFamily = 'default'; + this.user.preferences.bookReaderFontFamily = 'Default'; } this.settingsForm.addControl('readingDirection', new FormControl(this.user.preferences.readingDirection, [])); diff --git a/UI/Web/src/assets/fonts/EBGarmond/EBGaramond-Italic-VariableFont_wght.ttf b/UI/Web/src/assets/fonts/EB Garmond/EBGaramond-Italic-VariableFont_wght.ttf similarity index 100% rename from UI/Web/src/assets/fonts/EBGarmond/EBGaramond-Italic-VariableFont_wght.ttf rename to UI/Web/src/assets/fonts/EB Garmond/EBGaramond-Italic-VariableFont_wght.ttf diff --git a/UI/Web/src/assets/fonts/EBGarmond/EBGaramond-Italic-VariableFont_wght.woff2 b/UI/Web/src/assets/fonts/EB Garmond/EBGaramond-Italic-VariableFont_wght.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/EBGarmond/EBGaramond-Italic-VariableFont_wght.woff2 rename to UI/Web/src/assets/fonts/EB Garmond/EBGaramond-Italic-VariableFont_wght.woff2 diff --git a/UI/Web/src/assets/fonts/EBGarmond/EBGaramond-VariableFont_wght.ttf b/UI/Web/src/assets/fonts/EB Garmond/EBGaramond-VariableFont_wght.ttf similarity index 100% rename from UI/Web/src/assets/fonts/EBGarmond/EBGaramond-VariableFont_wght.ttf rename to UI/Web/src/assets/fonts/EB Garmond/EBGaramond-VariableFont_wght.ttf diff --git a/UI/Web/src/assets/fonts/EBGarmond/EBGaramond-VariableFont_wght.woff2 b/UI/Web/src/assets/fonts/EB Garmond/EBGaramond-VariableFont_wght.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/EBGarmond/EBGaramond-VariableFont_wght.woff2 rename to UI/Web/src/assets/fonts/EB Garmond/EBGaramond-VariableFont_wght.woff2 diff --git a/UI/Web/src/assets/fonts/EBGarmond/OFL.txt b/UI/Web/src/assets/fonts/EB Garmond/OFL.txt similarity index 100% rename from UI/Web/src/assets/fonts/EBGarmond/OFL.txt rename to UI/Web/src/assets/fonts/EB Garmond/OFL.txt diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Black.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Black.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Black.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Black.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Black.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Black.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Black.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Black.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-BlackItalic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-BlackItalic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-BlackItalic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-BlackItalic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-BlackItalic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-BlackItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-BlackItalic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-BlackItalic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Bold.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Bold.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Bold.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Bold.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Bold.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Bold.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Bold.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Bold.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-BoldItalic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-BoldItalic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-BoldItalic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-BoldItalic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-BoldItalic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-BoldItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-BoldItalic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-BoldItalic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraBold.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraBold.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraBold.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraBold.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraBold.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraBold.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraBold.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraBold.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraBoldItalic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraBoldItalic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraBoldItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraBoldItalic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraLight.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraLight.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraLight.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraLight.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraLight.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraLight.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraLight.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraLight.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraLightItalic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraLightItalic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraLightItalic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraLightItalic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraLightItalic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraLightItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ExtraLightItalic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ExtraLightItalic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Italic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Italic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Italic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Italic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Italic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Italic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Italic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Italic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Light.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Light.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Light.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Light.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Light.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Light.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Light.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Light.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-LightItalic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-LightItalic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-LightItalic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-LightItalic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-LightItalic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-LightItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-LightItalic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-LightItalic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Medium.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Medium.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Medium.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Medium.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Medium.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Medium.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Medium.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Medium.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-MediumItalic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-MediumItalic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-MediumItalic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-MediumItalic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-MediumItalic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-MediumItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-MediumItalic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-MediumItalic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Regular.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Regular.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Regular.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Regular.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Regular.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Regular.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Regular.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Regular.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-SemiBold.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-SemiBold.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-SemiBold.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-SemiBold.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-SemiBold.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-SemiBold.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-SemiBold.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-SemiBold.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-SemiBoldItalic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-SemiBoldItalic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-SemiBoldItalic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-SemiBoldItalic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-SemiBoldItalic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-SemiBoldItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-SemiBoldItalic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-SemiBoldItalic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Thin.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Thin.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Thin.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Thin.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Thin.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-Thin.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-Thin.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-Thin.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ThinItalic.ttf b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ThinItalic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ThinItalic.ttf rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ThinItalic.ttf diff --git a/UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ThinItalic.woff2 b/UI/Web/src/assets/fonts/Fira Sans/FiraSans-ThinItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/FiraSans-ThinItalic.woff2 rename to UI/Web/src/assets/fonts/Fira Sans/FiraSans-ThinItalic.woff2 diff --git a/UI/Web/src/assets/fonts/Fira_Sans/OFL.txt b/UI/Web/src/assets/fonts/Fira Sans/OFL.txt similarity index 100% rename from UI/Web/src/assets/fonts/Fira_Sans/OFL.txt rename to UI/Web/src/assets/fonts/Fira Sans/OFL.txt diff --git a/UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Bold.ttf b/UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Bold.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Bold.ttf rename to UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Bold.ttf diff --git a/UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Bold.woff2 b/UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Bold.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Bold.woff2 rename to UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Bold.woff2 diff --git a/UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Italic.ttf b/UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Italic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Italic.ttf rename to UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Italic.ttf diff --git a/UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Italic.woff2 b/UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Italic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Italic.woff2 rename to UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Italic.woff2 diff --git a/UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Regular.ttf b/UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Regular.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Regular.ttf rename to UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Regular.ttf diff --git a/UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Regular.woff2 b/UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Regular.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Baskerville/LibreBaskerville-Regular.woff2 rename to UI/Web/src/assets/fonts/Libre Baskerville/LibreBaskerville-Regular.woff2 diff --git a/UI/Web/src/assets/fonts/Libre_Baskerville/OFL.txt b/UI/Web/src/assets/fonts/Libre Baskerville/OFL.txt similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Baskerville/OFL.txt rename to UI/Web/src/assets/fonts/Libre Baskerville/OFL.txt diff --git a/UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Bold.ttf b/UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Bold.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Bold.ttf rename to UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Bold.ttf diff --git a/UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Bold.woff2 b/UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Bold.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Bold.woff2 rename to UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Bold.woff2 diff --git a/UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Italic.ttf b/UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Italic.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Italic.ttf rename to UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Italic.ttf diff --git a/UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Italic.woff2 b/UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Italic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Italic.woff2 rename to UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Italic.woff2 diff --git a/UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Regular.ttf b/UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Regular.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Regular.ttf rename to UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Regular.ttf diff --git a/UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Regular.woff2 b/UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Regular.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Caslon/LibreCaslonText-Regular.woff2 rename to UI/Web/src/assets/fonts/Libre Caslon/LibreCaslonText-Regular.woff2 diff --git a/UI/Web/src/assets/fonts/Libre_Caslon/OFL.txt b/UI/Web/src/assets/fonts/Libre Caslon/OFL.txt similarity index 100% rename from UI/Web/src/assets/fonts/Libre_Caslon/OFL.txt rename to UI/Web/src/assets/fonts/Libre Caslon/OFL.txt diff --git a/UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-Bold.ttf b/UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-Bold.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-Bold.ttf rename to UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-Bold.ttf diff --git a/UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-Bold.woff2 b/UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-Bold.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-Bold.woff2 rename to UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-Bold.woff2 diff --git a/UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-ExtraBold.ttf b/UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-ExtraBold.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-ExtraBold.ttf rename to UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-ExtraBold.ttf diff --git a/UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-ExtraBold.woff2 b/UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-ExtraBold.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-ExtraBold.woff2 rename to UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-ExtraBold.woff2 diff --git a/UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-Regular.ttf b/UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-Regular.ttf similarity index 100% rename from UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-Regular.ttf rename to UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-Regular.ttf diff --git a/UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-Regular.woff2 b/UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-Regular.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/Nanum_Gothic/NanumGothic-Regular.woff2 rename to UI/Web/src/assets/fonts/Nanum Gothic/NanumGothic-Regular.woff2 diff --git a/UI/Web/src/assets/fonts/Nanum_Gothic/OFL.txt b/UI/Web/src/assets/fonts/Nanum Gothic/OFL.txt similarity index 100% rename from UI/Web/src/assets/fonts/Nanum_Gothic/OFL.txt rename to UI/Web/src/assets/fonts/Nanum Gothic/OFL.txt diff --git a/UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Bold.otf b/UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Bold.otf similarity index 100% rename from UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Bold.otf rename to UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Bold.otf diff --git a/UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Bold.woff2 b/UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Bold.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Bold.woff2 rename to UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Bold.woff2 diff --git a/UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-BoldItalic.otf b/UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-BoldItalic.otf similarity index 100% rename from UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-BoldItalic.otf rename to UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-BoldItalic.otf diff --git a/UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-BoldItalic.woff2 b/UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-BoldItalic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-BoldItalic.woff2 rename to UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-BoldItalic.woff2 diff --git a/UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Italic.otf b/UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Italic.otf similarity index 100% rename from UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Italic.otf rename to UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Italic.otf diff --git a/UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Italic.woff2 b/UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Italic.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Italic.woff2 rename to UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Italic.woff2 diff --git a/UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Regular.otf b/UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Regular.otf similarity index 100% rename from UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Regular.otf rename to UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Regular.otf diff --git a/UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Regular.woff2 b/UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Regular.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/OpenDyslexic2/OpenDyslexic-Regular.woff2 rename to UI/Web/src/assets/fonts/Open Dyslexic 2/OpenDyslexic-Regular.woff2 diff --git a/UI/Web/src/assets/fonts/RocknRoll_One/OFL.txt b/UI/Web/src/assets/fonts/RocknRoll One/OFL.txt similarity index 100% rename from UI/Web/src/assets/fonts/RocknRoll_One/OFL.txt rename to UI/Web/src/assets/fonts/RocknRoll One/OFL.txt diff --git a/UI/Web/src/assets/fonts/RocknRoll_One/RocknRollOne-Regular.ttf b/UI/Web/src/assets/fonts/RocknRoll One/RocknRollOne-Regular.ttf similarity index 100% rename from UI/Web/src/assets/fonts/RocknRoll_One/RocknRollOne-Regular.ttf rename to UI/Web/src/assets/fonts/RocknRoll One/RocknRollOne-Regular.ttf diff --git a/UI/Web/src/assets/fonts/RocknRoll_One/RocknRollOne-Regular.woff2 b/UI/Web/src/assets/fonts/RocknRoll One/RocknRollOne-Regular.woff2 similarity index 100% rename from UI/Web/src/assets/fonts/RocknRoll_One/RocknRollOne-Regular.woff2 rename to UI/Web/src/assets/fonts/RocknRoll One/RocknRollOne-Regular.woff2 diff --git a/UI/Web/src/styles.scss b/UI/Web/src/styles.scss index 5e7de8cab..296298e85 100644 --- a/UI/Web/src/styles.scss +++ b/UI/Web/src/styles.scss @@ -53,7 +53,7 @@ // Global Styles @font-face { font-family: "EBGarmond"; - src: url("assets/fonts/EBGarmond/EBGaramond-VariableFont_wght.woff2") format("woff2"); + src: url("assets/fonts/EB Garmond/EBGaramond-VariableFont_wght.woff2") format("woff2"); font-display: swap; } diff --git a/openapi.json b/openapi.json index fcf5fbd5b..e72afcbc2 100644 --- a/openapi.json +++ b/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.1", "info": { "title": "Kavita", - "description": "Kavita provides a set of APIs that are authenticated by JWT. JWT token can be copied from local storage. Assume all fields of a payload are required. Built against v0.8.2.0", + "description": "Kavita provides a set of APIs that are authenticated by JWT. JWT token can be copied from local storage. Assume all fields of a payload are required. Built against v0.8.2.1", "license": { "name": "GPL-3.0", "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE" @@ -2319,6 +2319,7 @@ "tags": [ "Font" ], + "summary": "List out the fonts", "responses": { "200": { "description": "OK", @@ -2357,10 +2358,12 @@ "tags": [ "Font" ], + "summary": "Returns a font", "parameters": [ { "name": "fontId", "in": "query", + "description": "", "schema": { "type": "integer", "format": "int32" @@ -2369,6 +2372,7 @@ { "name": "apiKey", "in": "query", + "description": "", "schema": { "type": "string" } @@ -2384,14 +2388,25 @@ "tags": [ "Font" ], + "summary": "Removes a font from the system", "parameters": [ { "name": "fontId", "in": "query", + "description": "", "schema": { "type": "integer", "format": "int32" } + }, + { + "name": "confirmed", + "in": "query", + "description": "If the font is in use by other users and an admin wants it deleted, they must confirm to force delete it", + "schema": { + "type": "boolean", + "default": false + } } ], "responses": { @@ -2406,6 +2421,7 @@ "tags": [ "Font" ], + "summary": "Manual upload", "requestBody": { "content": { "multipart/form-data": { @@ -2450,44 +2466,6 @@ } } }, - "/api/Font/upload-url": { - "post": { - "tags": [ - "Font" - ], - "parameters": [ - { - "name": "url", - "in": "query", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "text/plain": { - "schema": { - "$ref": "#/components/schemas/EpubFontDto" - } - }, - "application/json": { - "schema": { - "$ref": "#/components/schemas/EpubFontDto" - } - }, - "text/json": { - "schema": { - "$ref": "#/components/schemas/EpubFontDto" - } - } - } - } - } - } - }, "/api/Health": { "get": { "tags": [ @@ -13818,7 +13796,7 @@ }, "missingSeriesFromSource": { "type": "string", - "description": "A \n separated string of all missing series", + "description": "A \r\n separated string of all missing series", "nullable": true }, "appUser": { @@ -13913,7 +13891,7 @@ }, "missingSeriesFromSource": { "type": "string", - "description": "A \n separated string of all missing series", + "description": "A \r\n separated string of all missing series", "nullable": true } }, @@ -16373,13 +16351,9 @@ "type": "integer", "format": "int32" }, - "created": { + "fileName": { "type": "string", - "format": "date-time" - }, - "lastModified": { - "type": "string", - "format": "date-time" + "nullable": true } }, "additionalProperties": false