mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-06-06 15:14:15 -04:00
* Moved libraryType into chapter info * Fixed a bug where you could not reset cover on a series * Patched in relevant changes from another polish branch * Refactored invite user setup to shift the checking for accessibility to the backend and always show the link. This will help with users who have some unique setups in docker. * Refactored invite user to always print the url to setup a new account. * Single page renderer uses canvasImage rather than re-requesting and relying on cache * Fixed a rendering issue where fit to split on single on a cover wouldn't force width scaling just for that image * Fixed a rendering bug with split image functionality * Added title to copy button * Fixed a bug in GetContinuePoint when a chapter is added to an already read volume and a new chapter is added loose leaf. The loose leaf would be prioritized over the volume chapter. Refactored 2 methods from controller into service and unit tested. * Fixed a bug on opening a volume in series detail that had a chapter added to it after the volume (0 chapter) was read would cause a loose leaf chapter to be opened. * Added mark as read/actionables on Files in volume detail modal. Fixed a bug where we were showing the wrong page count in a volume detail modal. * Removed OnDeck page and replaced it with a pre-filtered All-Series. Hooked up the ability to pass read state to the filter via query params. Fixed some spacing on filter post bootstrap update. * Fixed up some poor documentation on FilterDto. * Some string equals enhancements to reduce extra allocations * Fixed an issue when trying to download via a url, to remove query parameters to get the format * Made an optimization to Normalize method to reduce memory pressure by 100MB over the course of a scan (16k files) * Adjusted the styles on dashboard for first time setup and used a routerlink rather than href to avoid a fresh load. * Use framgment on router link * Hooked in the ability to search by release year (along with series optionally) and series will be returned back. * Fixed a bug in the filter format code where it was sending the wrong type * Only show clear all on typeahead when there are at least one selected item * Cleaned up the styles of the styles of the typeahead * Removed some dead code * Implemented the ability to filter against a series name. * Fixed filter top offset * Ensure that when we add or remove libraries, the side nav of users gets updated. * Tweaked the width on the mobile side nav * Close side nav on clicking overlay on mobile viewport * Don't show a pointer if the carousel section title is not actually selectable * Removed the User profile on the side nav so home is always first. Tweaked styles to match * Fixed up some poor documentation on FilterDto. * Fixed a bug where Latest read date wasn't being set due to an early short circuit. * When sending the chapter file, format the title of the FeedEntry more like Series Detail. * Removed dead code
339 lines
11 KiB
C#
339 lines
11 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using API.DTOs.Update;
|
|
using API.Entities;
|
|
|
|
namespace API.SignalR
|
|
{
|
|
public static class MessageFactory
|
|
{
|
|
/// <summary>
|
|
/// An update is available for the Kavita instance
|
|
/// </summary>
|
|
public const string UpdateAvailable = "UpdateAvailable";
|
|
/// <summary>
|
|
/// Used to tell when a scan series completes. This also informs UI to update series metadata
|
|
/// </summary>
|
|
public const string ScanSeries = "ScanSeries";
|
|
/// <summary>
|
|
/// Event sent out during Refresh Metadata for progress tracking
|
|
/// </summary>
|
|
private const string CoverUpdateProgress = "CoverUpdateProgress";
|
|
/// <summary>
|
|
/// Series is added to server
|
|
/// </summary>
|
|
public const string SeriesAdded = "SeriesAdded";
|
|
/// <summary>
|
|
/// Series is removed from server
|
|
/// </summary>
|
|
public const string SeriesRemoved = "SeriesRemoved";
|
|
/// <summary>
|
|
/// When a user is connects/disconnects from server
|
|
/// </summary>
|
|
public const string OnlineUsers = "OnlineUsers";
|
|
/// <summary>
|
|
/// When a series is added to a collection
|
|
/// </summary>
|
|
public const string SeriesAddedToCollection = "SeriesAddedToCollection";
|
|
/// <summary>
|
|
/// Event sent out during backing up the database
|
|
/// </summary>
|
|
private const string BackupDatabaseProgress = "BackupDatabaseProgress";
|
|
/// <summary>
|
|
/// Event sent out during cleaning up temp and cache folders
|
|
/// </summary>
|
|
private const string CleanupProgress = "CleanupProgress";
|
|
/// <summary>
|
|
/// Event sent out during downloading of files
|
|
/// </summary>
|
|
private const string DownloadProgress = "DownloadProgress";
|
|
/// <summary>
|
|
/// A cover was updated
|
|
/// </summary>
|
|
public const string CoverUpdate = "CoverUpdate";
|
|
/// <summary>
|
|
/// A custom site theme was removed or added
|
|
/// </summary>
|
|
private const string SiteThemeProgress = "SiteThemeProgress";
|
|
/// <summary>
|
|
/// A type of event that has progress (determinate or indeterminate).
|
|
/// The underlying event will have a name to give details on how to handle.
|
|
/// </summary>
|
|
public const string NotificationProgress = "NotificationProgress";
|
|
/// <summary>
|
|
/// Event sent out when Scan Loop is parsing a file
|
|
/// </summary>
|
|
private const string FileScanProgress = "FileScanProgress";
|
|
/// <summary>
|
|
/// A generic error that can occur in background processing
|
|
/// </summary>
|
|
public const string Error = "Error";
|
|
/// <summary>
|
|
/// When DB updates are occuring during a library/series scan
|
|
/// </summary>
|
|
private const string ScanProgress = "ScanProgress";
|
|
/// <summary>
|
|
/// When a library is created/deleted in the Server
|
|
/// </summary>
|
|
public const string LibraryModified = "LibraryModified";
|
|
|
|
|
|
public static SignalRMessage ScanSeriesEvent(int seriesId, string seriesName)
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = ScanSeries,
|
|
Body = new
|
|
{
|
|
SeriesId = seriesId,
|
|
SeriesName = seriesName
|
|
}
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage SeriesAddedEvent(int seriesId, string seriesName, int libraryId)
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = SeriesAdded,
|
|
Body = new
|
|
{
|
|
SeriesId = seriesId,
|
|
SeriesName = seriesName,
|
|
LibraryId = libraryId
|
|
}
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage SeriesRemovedEvent(int seriesId, string seriesName, int libraryId)
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = SeriesRemoved,
|
|
Body = new
|
|
{
|
|
SeriesId = seriesId,
|
|
SeriesName = seriesName,
|
|
LibraryId = libraryId
|
|
}
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage CoverUpdateProgressEvent(int libraryId, float progress, string eventType, string subtitle = "")
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = CoverUpdateProgress,
|
|
Title = "Refreshing Covers",
|
|
SubTitle = subtitle,
|
|
EventType = eventType,
|
|
Progress = ProgressType.Determinate,
|
|
Body = new
|
|
{
|
|
LibraryId = libraryId,
|
|
Progress = progress,
|
|
EventTime = DateTime.Now
|
|
}
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage BackupDatabaseProgressEvent(float progress, string subtitle = "")
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = BackupDatabaseProgress,
|
|
Title = "Backing up Database",
|
|
SubTitle = subtitle,
|
|
EventType = progress switch
|
|
{
|
|
0f => "started",
|
|
1f => "ended",
|
|
_ => "updated"
|
|
},
|
|
Progress = ProgressType.Determinate,
|
|
Body = new
|
|
{
|
|
Progress = progress
|
|
}
|
|
};
|
|
}
|
|
public static SignalRMessage CleanupProgressEvent(float progress, string subtitle = "")
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = CleanupProgress,
|
|
Title = "Performing Cleanup",
|
|
SubTitle = subtitle,
|
|
EventType = progress switch
|
|
{
|
|
0f => "started",
|
|
1f => "ended",
|
|
_ => "updated"
|
|
},
|
|
Progress = ProgressType.Determinate,
|
|
Body = new
|
|
{
|
|
Progress = progress
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
public static SignalRMessage UpdateVersionEvent(UpdateNotificationDto update)
|
|
{
|
|
return new SignalRMessage
|
|
{
|
|
Name = UpdateAvailable,
|
|
Title = "Update Available",
|
|
SubTitle = update.UpdateTitle,
|
|
EventType = ProgressEventType.Single,
|
|
Progress = ProgressType.None,
|
|
Body = update
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage SeriesAddedToCollectionEvent(int tagId, int seriesId)
|
|
{
|
|
return new SignalRMessage
|
|
{
|
|
Name = SeriesAddedToCollection,
|
|
Progress = ProgressType.None,
|
|
EventType = ProgressEventType.Single,
|
|
Body = new
|
|
{
|
|
TagId = tagId,
|
|
SeriesId = seriesId
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* A generic error that will show on events widget in the UI
|
|
*/
|
|
public static SignalRMessage ErrorEvent(string title, string subtitle)
|
|
{
|
|
return new SignalRMessage
|
|
{
|
|
Name = Error,
|
|
Title = title,
|
|
SubTitle = subtitle,
|
|
Progress = ProgressType.None,
|
|
EventType = ProgressEventType.Single,
|
|
Body = new
|
|
{
|
|
Title = title,
|
|
SubTitle = subtitle,
|
|
}
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage LibraryModifiedEvent(int libraryId, string action)
|
|
{
|
|
return new SignalRMessage
|
|
{
|
|
Name = LibraryModified,
|
|
Title = "Library modified",
|
|
Progress = ProgressType.None,
|
|
EventType = ProgressEventType.Single,
|
|
Body = new
|
|
{
|
|
LibrayId = libraryId,
|
|
Action = action,
|
|
}
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage DownloadProgressEvent(string username, string downloadName, float progress, string eventType = "updated")
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = DownloadProgress,
|
|
Title = $"Downloading {downloadName}",
|
|
SubTitle = $"{username} is downloading {downloadName}",
|
|
EventType = eventType,
|
|
Progress = ProgressType.Determinate,
|
|
Body = new
|
|
{
|
|
UserName = username,
|
|
DownloadName = downloadName,
|
|
Progress = progress
|
|
}
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// Represents a file being scanned by Kavita for processing and grouping
|
|
/// </summary>
|
|
/// <remarks>Does not have a progress as it's unknown how many files there are. Instead sends -1 to represent indeterminate</remarks>
|
|
/// <param name="filename"></param>
|
|
/// <param name="libraryName"></param>
|
|
/// <param name="eventType"></param>
|
|
/// <returns></returns>
|
|
public static SignalRMessage FileScanProgressEvent(string filename, string libraryName, string eventType)
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = FileScanProgress,
|
|
Title = $"Scanning {libraryName}",
|
|
SubTitle = Path.GetFileName(filename),
|
|
EventType = eventType,
|
|
Progress = ProgressType.Indeterminate,
|
|
Body = new
|
|
{
|
|
Title = $"Scanning {libraryName}",
|
|
Subtitle = filename,
|
|
Filename = filename,
|
|
EventTime = DateTime.Now,
|
|
}
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage LibraryScanProgressEvent(string libraryName, string eventType, string seriesName = "")
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = ScanProgress,
|
|
Title = $"Scanning {libraryName}",
|
|
SubTitle = seriesName,
|
|
EventType = eventType,
|
|
Progress = ProgressType.Indeterminate,
|
|
Body = null
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage CoverUpdateEvent(int id, string entityType)
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = CoverUpdate,
|
|
Title = "Updating Cover",
|
|
//SubTitle = series.Name, // TODO: Refactor this
|
|
Progress = ProgressType.None,
|
|
Body = new
|
|
{
|
|
Id = id,
|
|
EntityType = entityType,
|
|
}
|
|
};
|
|
}
|
|
|
|
public static SignalRMessage SiteThemeProgressEvent(string subtitle, string themeName, string eventType)
|
|
{
|
|
return new SignalRMessage()
|
|
{
|
|
Name = SiteThemeProgress,
|
|
Title = "Scanning Site Theme",
|
|
SubTitle = subtitle,
|
|
EventType = eventType,
|
|
Progress = ProgressType.Indeterminate,
|
|
Body = new
|
|
{
|
|
ThemeName = themeName,
|
|
}
|
|
};
|
|
}
|
|
}
|
|
}
|