Custom keybinds, Default language per Library, and bugfixes (#4162)

Co-authored-by: Joseph Milazzo <josephmajora@gmail.com>
This commit is contained in:
Fesaa
2025-11-01 15:56:00 +01:00
committed by GitHub
parent f9280f6861
commit 2c6eddfebb
72 changed files with 6038 additions and 441 deletions
+1 -1
View File
@@ -89,7 +89,7 @@ public class BackupService : IBackupService
await SendProgress(0F, "Started backup");
await SendProgress(0.1F, "Copying core files");
var dateString = $"{DateTime.UtcNow.ToShortDateString()}_{DateTime.UtcNow.ToLongTimeString()}".Replace("/", "_").Replace(":", "_");
var dateString = $"{DateTime.UtcNow.ToShortDateString()}_{DateTime.UtcNow:s}Z".Replace("/", "_").Replace(":", "_");
var zipPath = _directoryService.FileSystem.Path.Join(backupDirectory, $"kavita_backup_{dateString}_v{BuildInfo.Version}.zip");
if (File.Exists(zipPath))
+38 -30
View File
@@ -21,7 +21,7 @@ public interface ICleanupService
{
Task Cleanup();
Task CleanupDbEntries();
void CleanupCacheAndTempDirectories();
Task CleanupCacheAndTempDirectories();
void CleanupCacheDirectory();
Task DeleteSeriesCoverImages();
Task DeleteChapterCoverImages();
@@ -80,38 +80,34 @@ public class CleanupService : ICleanupService
}
_logger.LogInformation("Starting Cleanup");
var cleanupSteps = new List<(Func<Task>, string)>
{
(() => Task.Run(() => _directoryService.ClearDirectory(_directoryService.TempDirectory)), "Cleaning temp directory"),
(CleanupCacheAndTempDirectories, "Cleaning cache and temp directories"),
(CleanupBackups, "Cleaning old database backups"),
(ConsolidateProgress, "Consolidating Progress Events"),
(CleanupMediaErrors, "Consolidating Media Errors"),
(CleanupDbEntries, "Cleaning abandoned database rows"), // Cleanup DB before removing files linked to DB entries
(DeleteSeriesCoverImages, "Cleaning deleted series cover images"),
(DeleteChapterCoverImages, "Cleaning deleted chapter cover images"),
(() => Task.WhenAll(DeleteTagCoverImages(), DeleteReadingListCoverImages(), DeletePersonCoverImages()), "Cleaning deleted cover images"),
(CleanupLogs, "Cleaning old logs"),
(EnsureChapterProgressIsCapped, "Cleaning progress events that exceed 100%")
};
await SendProgress(0F, "Starting cleanup");
_logger.LogInformation("Cleaning temp directory");
_directoryService.ClearDirectory(_directoryService.TempDirectory);
for (var i = 0; i < cleanupSteps.Count; i++)
{
var (method, subtitle) = cleanupSteps[i];
var progress = (float)(i + 1) / (cleanupSteps.Count + 1);
await SendProgress(0.1F, "Cleaning temp directory");
CleanupCacheAndTempDirectories();
_logger.LogInformation("{Message}", subtitle);
await method();
await SendProgress(progress, subtitle);
}
await SendProgress(0.25F, "Cleaning old database backups");
_logger.LogInformation("Cleaning old database backups");
await CleanupBackups();
await SendProgress(0.35F, "Consolidating Progress Events");
await ConsolidateProgress();
await SendProgress(0.4F, "Consolidating Media Errors");
await CleanupMediaErrors();
await SendProgress(0.50F, "Cleaning deleted cover images");
_logger.LogInformation("Cleaning deleted cover images");
await DeleteSeriesCoverImages();
await SendProgress(0.6F, "Cleaning deleted cover images");
await DeleteChapterCoverImages();
await SendProgress(0.7F, "Cleaning deleted cover images");
await DeleteTagCoverImages();
await DeleteReadingListCoverImages();
await SendProgress(0.8F, "Cleaning old logs");
await CleanupLogs();
await SendProgress(0.9F, "Cleaning progress events that exceed 100%");
await EnsureChapterProgressIsCapped();
await SendProgress(0.95F, "Cleaning abandoned database rows");
await CleanupDbEntries();
await SendProgress(1F, "Cleanup finished");
_logger.LogInformation("Cleanup finished");
}
@@ -174,10 +170,20 @@ public class CleanupService : ICleanupService
_directoryService.DeleteFiles(files.Where(file => !images.Contains(_directoryService.FileSystem.Path.GetFileName(file))));
}
/// <summary>
/// Remove all person cover images no longer associated with a person in the database
/// </summary>
public async Task DeletePersonCoverImages()
{
var images = await _unitOfWork.PersonRepository.GetAllCoverImagesAsync();
var files = _directoryService.GetFiles(_directoryService.CoverImageDirectory, ImageService.PersonCoverImageRegex);
_directoryService.DeleteFiles(files.Where(file => !images.Contains(_directoryService.FileSystem.Path.GetFileName(file))));
}
/// <summary>
/// Removes all files and directories in the cache and temp directory
/// </summary>
public void CleanupCacheAndTempDirectories()
public Task CleanupCacheAndTempDirectories()
{
_logger.LogInformation("Performing cleanup of Cache & Temp directories");
_directoryService.ExistOrCreate(_directoryService.CacheDirectory);
@@ -194,6 +200,8 @@ public class CleanupService : ICleanupService
}
_logger.LogInformation("Cache and temp directory purged");
return Task.CompletedTask;
}
public void CleanupCacheDirectory()
@@ -30,7 +30,7 @@ public interface ICoverDbService
Task<string> DownloadPublisherImageAsync(string publisherName, EncodeFormat encodeFormat);
Task<string?> DownloadPersonImageAsync(Person person, EncodeFormat encodeFormat);
Task<string?> DownloadPersonImageAsync(Person person, EncodeFormat encodeFormat, string url);
Task SetPersonCoverByUrl(Person person, string url, bool fromBase64 = true, bool checkNoImagePlaceholder = false);
Task SetPersonCoverByUrl(Person person, string url, bool fromBase64 = true, bool checkNoImagePlaceholder = false, bool chooseBetterImage = true);
Task SetSeriesCoverByUrl(Series series, string url, bool fromBase64 = true, bool chooseBetterImage = false);
Task SetChapterCoverByUrl(Chapter chapter, string url, bool fromBase64 = true, bool chooseBetterImage = false);
}
@@ -472,7 +472,8 @@ public class CoverDbService : ICoverDbService
/// <param name="url"></param>
/// <param name="fromBase64"></param>
/// <param name="checkNoImagePlaceholder">Will check against all known null image placeholders to avoid writing it</param>
public async Task SetPersonCoverByUrl(Person person, string url, bool fromBase64 = true, bool checkNoImagePlaceholder = false)
/// <param name="chooseBetterImage">If we check cross-reference the current cover for the better option</param>
public async Task SetPersonCoverByUrl(Person person, string url, bool fromBase64 = true, bool checkNoImagePlaceholder = false, bool chooseBetterImage = true)
{
if (!string.IsNullOrEmpty(url))
{
@@ -504,7 +505,7 @@ public class CoverDbService : ICoverDbService
try
{
if (!string.IsNullOrEmpty(person.CoverImage))
if (!string.IsNullOrEmpty(person.CoverImage) && chooseBetterImage)
{
var existingPath = Path.Combine(_directoryService.CoverImageDirectory, person.CoverImage);
var betterImage = existingPath.GetBetterImage(tempFullPath)!;
+9 -2
View File
@@ -331,9 +331,16 @@ public class ProcessSeries : IProcessSeries
series.Metadata.Summary = firstChapter.Summary;
}
if (!string.IsNullOrEmpty(firstChapter?.Language) && !series.Metadata.LanguageLocked)
if (!series.Metadata.LanguageLocked)
{
series.Metadata.Language = firstChapter.Language;
if (!string.IsNullOrEmpty(firstChapter?.Language))
{
series.Metadata.Language = firstChapter.Language;
}
else if (!string.IsNullOrEmpty(library.DefaultLanguage))
{
series.Metadata.Language = library.DefaultLanguage;
}
}
if (!string.IsNullOrEmpty(firstChapter?.WebLinks) && library.InheritWebLinksFromFirstChapter)