* Implemented the framework for Refresh Token. Needs testing.
* Implemented Refresh Tokens. Users are issued tokens that last 7 days, just before the 7 days, the UI will request a new token to avoid having to re-authenticate.
* Fixed Day not getting set when reading from epubs.
* Fixed typo for "On Going" to "Ongoing"
* Removed filtering on Reading List page since it doesn't make sense
* Cleaned up some old code in download bookmark that could create pointless temp folders.
* Fixed a bad http call on reading list remove read and cleaned up the messaging
* Undid an optimization in finding cover image due to it perfoming depth first rather than breadth.
* Updated CleanComicInfo to have Translators and CoverArtists, which were previously missing.
* Renamed Refresh Metadata to Refresh Covers on the UI, given Metadata refresh is done in Scan.
* Library detail will now retain the search query in the UI. Reduced the amount of api calls to the backend on load.
* Reverted allowing the filter to reside in the UI (even though it does work).
* Updated the Age Rating to match the v2.1 spec.
* Fixed a bug where progress wasn't being saved
* Fixed line height not having any effect due to not applying to children elements in the reader
* Fixed some wording for Refresh Covers confirmation
* Delete Series will now send an event to the UI informing that series was deleted.
* Change Progress widget to show Refreshing Covers for
* When we exit early due to potential missing folders/drives in a scan, tell the UI that scan is 100% done.
* Fixed manage library not supressing scan loader when a complete came in
* Fixed a spelling difference for Publication Status between filter and series detail
* Fixed a bug where collection detail page would flash on first load due to duplicate load events
* Added bookmarks to backups
* Fixed issues where fullscreen mode would break infinite scroller contiunous reader
* Normalized paths on download controller and when scan is killed due to missing or empty folders, log a critical error.
* Tweaked the query for OnDeck to better promote recently added chapters in a series with read progress, but it's still not perfect.
* Fixed an issue where up/down key weren't working unless you clicked on the book explicitly
* Fixed an issue where infinite scroller was broken in fullscreen mode
* When toggling fullscreen mode on infinite scroller, the current page is retained as current position
* Fixed an issue where a double render would occur when we didn't need to render as fit split
* Stop showing loader when not using fit split
* When performing a scan, series should group if they share the same localized name as a pre-existing series.
* Fixed a bug where a series with a different name and localized name weren't merging with a different set of files with the same naming as localized name.
* Added a lot of tests
* More tests! Added a Parser.NormalizePath to normalize all paths within Kavita.
* Fixed a bug where MarkChaptersAsUnread implementation wasn't consistent between different files and lead to extra row generation for no reason.
* Added more unit tests
* Found a better implementation for Natural Sorting. Added tests and validate it works. Next commit will swap out natural Sort for new Extension.
* Replaced NaturalSortComparer with OrderByNatural.
* Drastically simplified and sped up FindFirstEntry for finding cover images in archives
* Initial fix for a epub bug where metadata defines key as absolute path but document uses a relative path. We now have a hack to correct for the epub.
* Fixed a bug in CleanupBookmarks where the Except was deleting all files because the path separators didn't match.
* Added unit tests for ParseScannedFiles.cs.
* Fixed some unit tests. Parser will now clear out multiple spaces in a row and replace with a single.
* Cleaned up a ton of warnings/suggestions from the IDE.
* Fixed a bug when clearing the filters some presets could be undone.
* Renamed a class in the OPDS spec
* Simplified logic for when Fit To Screen rendering logic occurs. It now works always rather than only on cover images.
* Give some additional info to the user on what the differences between Library Types are
* Don't scan .qpkg folders (QNAP devices)
* Refactored some code to enable ability to test CoverImage Test. This is a broken test, test.zip is waiting on an issue in NetVips.
* Fixed an issue where Extra might get flagged as special too early, if in a word like Extraordinary
* Cleaned up the regex for the extra issue to be more flexible
* Refactored updating chapter metadata from ComicInfo into the Scan loop. This let's us avoid an additional N file reads (expensive) in the metadata service, as we already have to read them in the scan loop.
* Refactored Series level metadata aggregation into the scan loop. This allows for the batching of DB updates to be much smaller, thus faster without much overhead of GC.
* Refactored some of the code for ProcessFile to remove a few redundant if statements
* Fixed the book reader off by one issue with loading last page
* Fixed a case where scanner would not delete a series if another series with same name but different format was added in that same scan.
* Added some missing tag generation (chapter language and summary)
* Added a tooltip to inform user that format and collection filter selections do not only show for the selected library.
* Refactored a lot of code around when we update chapter cover images. Applied an optimization for when we re-calculate volume/series covers, such that it only occurs when the first chapter's image updates.
* Updated code to ensure only lastmodified gets refreshed in metadata since it always follows a scan
* Optimized how metadata is populated on the series. Instead of re-reading the comicInfos, instead I read the data from the underlying chapter entities. This reduces N additional reads AND enables the ability in the future to show/edit chapter level metadata.
* Spelling mistake
* Fixed a concurency issue by not selecting Genres from DB. Added a test for long paths.
* Fixed a bug in filter where collection tag wasn't populating on load
* Cleaned up the logic for changelog to better compare against the installed verison. For nightly users, show the last stable as installed.
* Removed some demo code
* SplitQuery to allow loading tags much faster for series metadata load.
* Refactored the Font Escaping Regex with new unit tests.
* Fonts are now properly escaped, somehow a regression was introduced.
* Refactored most of the book page loading for the reader into the service.
* Fixed a bug where going into fullscreen in non dark mode will cause the background of the reader to go black. Fixed a rendering issue with margin left/right screwing html up. Fixed an issue where line-height: 100% would break book's css, now we remove the styles if they are non-valuable.
* Changed how I fixed the black mode in fullscreen
* Fixed an issue where anchors wouldn't be colored blue in white mode
* Fixed a bug in the code that checks if a filename is a cover where it would choose "backcover" as a cover, despite it not being a valid case.
* Validate if ReleaseYear is a valid year and if not, set it to 0 to disable it.
* Fixed an issue where some large images could blow out the screen when reading on mobile. Now images will force to be max of width of browser
* Put my hack back in for fullscreen putting background color to black
* Change forwarded headers from All to explicit names
* Fixed an issue where Scheme was not https when it should have been. Now the browser will handle which scheme to request.
* Cleaned up the user preferences to stack multiple controls onto one row
* Fixed fullscreen scroll issue with progress, but now sticky top is missing.
* Corrected the element on which we fullscreen
* Fixed a bug which didn't take sort direction when not changing sort field
* Added foundation for Bookmark refactor
* Code broken, need to take a break. Issue is Getting bookmark image needs authentication but UI doesn't send.
* Implemented the ability to send bookmarked files to the web. Implemented ability to clear bookmarks on disk on a re-occuring basis.
* Updated the bookmark design to have it's own card that is self contained. View bookmarks modal has been updated to better lay out the cards.
* Refactored download bookmark codes to select files from bookmark directory directly rather than open underlying files.
* Wrote the basic logic to kick start the bookmark migration.
Added Installed Version into the DB to allow us to know more accurately when to run migrations
* Implemented the ability to change the bookmarks directory
* Updated all references to BookmarkDirectory to use setting from the DB.
Updated Server Settings page to use 2 col for some rows.
* Refactored some code to DirectoryService (hasWriteAccess) and fixed up some unit tests from a previous PR.
* Treat folders that start with ._ as blacklisted.
* Implemented Reset User preferences. Some extra code to prep for the migration.
* Implemented a migration for existing bookmarks to using new filesystem based bookmarks
* Send stack trace to the UI on prod mode
* Pdfs will now generate cover images. I missed something a few releases ago.
* Ignore @Recently-Snapshot directories for QNAP.
* Refactored Bitmap code to use ImageSharp so it's truly cross platform.
* Updated pdf extraction to use a multi-threaded approach to greatly speed up pdf image extraction
* Hooked in Characters tag from ComicInfo.xml
* Fixed OPDS urls to work with new Filtering schema
* Fixed a rendering issue with Language tag when it's null
* Fixed a bug where locked covers were resetting during refresh metadata.
* Redid all the migrations and put some extra checks due to a bad migration from previous release (EF Core was producing an error).
* Fixed a bug which didn't take sort direction when not changing sort field
* Default installs now backup daily
* Added a reoccuring task to cleanup db entries that might be abandoned. On library page, the Library in question will be prepoulated.
* Laid out the foundation for customized sorting. Added all series page to the UI when clicking on Libraries section header on home page so user can apply any filtering they like.
* When filtering, the current library filter will now automatically filter out the options for people and genres.
* Implemented Sorting controls
* Clear now clears sorting and read progress. Sorting is disabled on deck and recently added.
* Fixed an issue where all-series page couldn't click to open series
* Don't let the user unselect the last read progress. Added new comicinfo v2.1 draft tags.
* Hooked in Translator tag into backend and UI.
* Fixed an issue where you could open multiple typeaheads at the same time
* Integrated Translator and Tags ComicInfo extension fields. Started work on a badge expander.
* Reworked a bit more on badge expander. Added the UI code for Age Rating and Tags
* Integrated backend for Tags, Translator, and Age Rating
* Metadata tags now collapse if more than 4 present
* Some code cleanup
* Made the not read badge slightly smaller
* Laying the foundation for the filter rework
* Filtering by Genre is now possible.
* Cleaned up code and preparing for People filtering
* People filtering is hooked up for the frontend
* Filtering now works. On Deck does not work with filtering currently due to a unique implementation.
* More cleanup
* Implemented the ability to reset the filters
* Added a mobile drawer for filtering
* Added some additional cases for NaturalSortComparer. Filter now uses a drawer on smaller screens.
* Fixed a bug where backup service was not pointing to the correct directory.
* Undid the fix, it's working as expected
* Added a new endpoint to get all Series with Progress info.
* Fixed up some potential NPEs during scan
* Commented out filter code, not ready for it.
* Fixed up a parsing case for european comics
* Refactored FilterDto to allow for specifying multiple formats to return.
* Refactored FilterDto to allow for specifying multiple formats to return.
* Refactored the UI to show OPDS as 3rd Party Clients since Tachiyomi now uses OPDS url scheme for authentication.
* Fixed a case where chapter was being parsed incorrectly when the series title ends in a number.
* Updated Kavita to support Tome/T notation found in French comics
* Added support for identifying European specials and expanded support for cleaning some tags used in European comics. During cleaning, if series starts with - or comma, remove it.
* Fixed an issue where add to collection for a single series wasn't calling the bulk action handler
* Fixed a NPE on AgeRating conversion. Fixed a bug where when looking for cover image, file extensions was throwing off sort code.
* Refactored Natural Sort ordering to better follow how Windows behaves. This is a departure from how the original code executes.
* GetCachedPagePath now uses natural sorting to pick the images for reading in a more correct order.
* Updated parser to handle a case where there was more than one space as a separator
* Stashing code
* removed some debug code on series detail page. Now detail is collapsed by default.
* Added AgeRating
* Fixed a crash when NetVips tries to write a cover file and cover directory is not existing.
* When a card is selected for bulk actions, show an outline in addition to select box
* Added AgeRating into the metadata parsing. Added a hack where ComicInfo uses Number in ComicInfo rather than Volume. This is to test out the effects on users libraries.
* Added AgeRating and ReleaseDate to the metadata implelentation.
* Refactored all files to have Interfaces within the same file. Started moving over to file-scoped namespaces.
* Refactored common methods for getting underlying file's cover, pages, and extracting into 1 interface.
* More refactoring around removing dependence on explicit filetype testing for getting information.
* Code is buildable, tests are broken. Huge refactor (not completed) which makes most of DirectoryService testable with a mock filesystem (and thus the services that utilize it).
* Finished porting DirectoryService to use mocked filesystem implementation.
* Added a null check
* Added a null check
* Finished all unit tests for DirectoryService.
* Some misc cleanup on the code
* Fixed up some bugs from refactoring scan loop.
* Implemented CleanupService testing and refactored more of DirectoryService to be non-static.
Fixed a bug where cover file cleanup wasn't properly finding files due to a regex bug.
* Fixed an issue in CleanupBackup() where we weren't properly selecting database files older than 30 days. Finished CleanupService Tests.
* Refactored Flatten and RemoveNonImages to directory service to allow CacheService to be testable.
* Finally have CacheService tested. Rewrote GetCachedPagePath() to be much more straightforward & performant.
* Updated DefaultParserTests.cs to contain all existing tests and follow new test layout format.
* All tests fixed up
* Started with some basic plumbing with comic info parsing updating Series/Volume.
* We can now get chapter title from comicInfo.xml
* Hooked in the ability to store people into the chapter metadata.
* Removed no longer used imports, fixed up some foreign key constraints on deleting series with person linked.
* Refactored Summary out of the UI for Series into SeriesMetadata. Updated application to .net 6. There is a bug in metadata code for updating.
* Removed the parallel.ForEach with a normal foreach which lets us use async. For I/O heavy code, shouldn't change much.
* Refactored scan code to only check extensions with comic info, fixed a bug on scan events not using correct method name, removed summary field (still buggy)
* Fixed a bug where on cancelling a metadata request in modal, underlying button would get stuck in a disabled state.
* Changed how metadata selects the first volume to read summary info from. It will now select the first non-special volume rather than Volume 1.
* More debugging and found more bugs to fix
* Redid all the migrations as one single one. Fixed a bug with GetChapterInfo returning null when ChapterMetadata didn't exist for that Chapter.
Fixed an issue with mapper failing on GetChapterMetadata. Started work on adding people and a design for people.
* Fixed a bug where checking if file modified now takes into account if file has been processed at least once. Introduced a bug in saving people to series.
* Just made code compilable again
* Fixed up code. Now people for series and chapters add correctly without any db issues.
* Things are working, but I'm not happy with how the management of Person is. I need to take into account that 1 person needs to map to an image and role is arbitrary.
* Started adding UI code to showcase chapter metadata
* Updated workflow to be .NET 6
* WIP of updating card detail to show the information more clearly and without so many if statements
* Removed ChatperMetadata and store on the Chapter itself. Much easier to use and less joins.
* Implemented Genre on SeriesMetadata level
* Genres and People are now removed from Series level if they are no longer on comicInfo
* PeopleHelper is done with unit tests. Everything is working.
* Unit tests in place for Genre Helper
* Starting on CacheHelper
* Finished tests for ShouldUpdateCoverImage. Fixed and added tests in ArchiveService/ScannerService.
* CacheHelper is fully tested
* Some DI cleanup
* Scanner Service now calls GetComicInfo for books. Added ability to update Series Sort name from metadata files (mainly epub as comicinfo doesn't have a field)
* Forgot to move a line of code
* SortName now populates from metadata (epub only, ComicInfo has no tags)
* Cards now show the chapter title name if it's set on hover, else will default back to title.
* Fixed a major issue with how MangaFiles were being updated with LastModified, which messed up our logic for avoiding refreshes.
* Woohoo, more tests and some refactors to be able to test more services wtih mock filesystem. Fixed an issue where SortName was getting set as first chapter, but the Series was in a group.
* Refactored the MangaFile creation code into the DbFactory where we also setup the first LastModified update.
* Has file changed bug is now finally fixed
* Remove dead genres, refactor genre to use title instead of name.
* Refactored out a directory from ShouldUpdateCoverImage() to keep the code clean
* Unit tests for ComicInfo on BookService.
* Refactored series detail into it's own component
* Series-detail now received refresh metadata events to refresh what's on screen
* Removed references to Artist on PersonRole as it has no metadata mapping
* Security audit
* Fixed a benchmark
* Updated JWT Token generator to use new methods in .NET 6
* Updated all the docker and build commands to use net6.0
* Commented out sonar scan since it's not setup for net6.0 yet.
* Implemented ability to see downloads users are performing on the events widget.
* Fixed a bug where version update task was calling wrong code
* Fixed a bug where when checking for updates, the event wouldn't be pushed to server with correct name.
Added update check to the event widget rather than opening a modal on the user.
* Relaxed password requirements to only be 6-32 characters and inform user on register form about the requirements
* Removed a ton of duplicate logic for series cards where the logic was already defined in action service
* Fixed OPDS total items giving a rounded number rather than total items.
* Fixed off by one issue on OPDS pagination
* Updated readme with new host information and new feature site.
* Implemented basic fit to screen splitting option for manga reader such that the reader will try to fit the whole cover on the screen via scaling it.
Updated a bunch of defaults in the preferences to give a better experience for first installs.
* Refactored the stat scheduling code slightly to clean it up and have better logging.
* Replaced @import with @use to lower css bundling.
* Changed up the defaults for the reading preferences to give a better experience. Fixed a duplicate render on automatic scaling due to emitting a valuechange with automatic scaling changing fit.
Implemented basic form of fit to screen. Still needs some tweaking and optimization.
* Update link to new feature server and update kavita homepage to use www.
* Updated the serverInfo to match backend. Tweaked some of the css for the changelog
* Added publish date for changelog
* First page works except for tablet
* I'm stumped, taking a break
* Hide the arrow for nav events
* Ensure specials in reading lists don't have their extensions visible
* Testing out removing no-connection
* Fixed a bug in infinite scroller where next chapter spacer when clicked would emit for prev chapter load. Fixed an issue where next/prev chapter loaders would execute when they shouldn't.
* Fit Split is working in all cases as of this code. New optimization is still needed.
* Fit to screen is now working well
* Updated the bookmark effect to look much better
* Updated new issue template to inform users to request features on our site.
* Removed an empty migration
* Fixed a duplicate check for updates. Changed checking from weekly to daily.
* Refactored how dark variables were accessed to reduce size of component css. Refactored Stats code to use lesser information for reporting.
* Use the installId from the database which is most unlikely to change.
* Fixed a missing interface with stat service
* Added DotnetVersion back into collection
* Updated url to new host.
* Implemented a new widget to show when operations are occuring in the backend (tasks + progress events). Fixed an oversight on progress reporting where I sent 100F instead of 1F.
* Hooked in more progress events for tasks on the backend. Cleaned up code and integrated some RBS into it. CSS needed.
* Show a colored icon when events are active
* Added some styling to the progress widget
* Some small changes to how maxPage is handled for better page tracking on webtoon reader.
* Fixed a bug in cover image selection (#756)
* Refactored webtoon reader to report page progress exactly as manga reader does. In addition, manga reader moved progress saving to setPageNumber making them the same.
* Updated some signatures to avoid a ToArray() within a loop.
* Use UpdateSeries directly when adding new series, rather than a modified version for new series only.
* Refactored some messages for scanner loop to reduce duplicate code and write messages more clear. Hooked in a RefreshMetadataProgress event (no UI changes).
* Fixed a bug on docker where backup service was using different logic than non-docker, which isn't needed after config change last release.
* Allow user to make more than 1 backup per day
* Implemented a select all checkbox for library access modal
* Fixed an issue where backups were failing due to files being in config directory
* Changed up the exception messages to be more clear when a unique constraint fails on adding a new series.
* Added the actual index that is causing the conflict.
* Change update check to be between noon and 6pm.
* Added a UI change that was missed
* Fixed an issue on register user where input boxes were not styled correctly
* Fixed renaming a series to an existing series name of a different format.
* Change webtoon reader debug mode
* Change css scoping to be on the book content itself only to prevent any leaking on the reading section code. Apply a margin so that book margins on the whole content doesn't show black lines.
* Take out debug outline on webtoon reader
* Removed some imports
* Fixed an issue where when restoring current page in webtoon mode, the page number would jump forward
* Last page on webtoon reader now properly counts. This was due to a - 1 issue fixing previous issues.
* Fixed an issue where scrollToPage (from progress bar or go to page) wouldn't work if the page somehow was visible.
* Ready for testing on beta users
* Fixed a bug where partial volume support got missed on the epub parser.
* When a drive is unavailable during when a scan starts, abort so user doesn't loose half library if their networked drive goes down.
* Moved format for card details to highest level (since all chapters/files have same format) and added date added to each file to help when new chapters/files are added and grouped into a volume.
* Implemented handling on the UI when a series is deleted
* Added case for series removal for series detail
* Only redirect for this series
* Make the appsettings public on Configuration and change how we detect when to migrate for non-docker users.
* Fixed up non-docker copy command and removed duplicate check on source directory for a copy.
* Don't delete files unless we know we are successful
* Refactored all the config files for Kavita to be loaded from config/. This will allow docker to just mount one folder and for Update functionality to be trivial.
* Cleaned up documentation around new update method.
* Updated docker files to support config directory
* Removed entrypoint, no longer needed
* Update appsettings to point to config directory for logs
* Updated message for docker users that are upgrading
* Ensure that docker users that have not updated their mount points from upgrade cannot start the server
* Code smells
* More cleanup
* Added entrypoint to fix bind mount issues
* Updated README with new folder structure
* Fixed build system for new setup
* Updated string path if user is docker
* Updated the migration flow for docker to work properly and Fixed LogFile configuration updating.
* Migrating docker images is now working 100%
* Fixed config from bad code
* Code cleanup
* Fixed monorepo-build.sh
Co-authored-by: Chris Plaatjes <kizaing@gmail.com>