This release has been an interesting time. Originally a small release with a big impact (auto updating) has turned into a release just about polishing and battle testing the scan loop from last release. Rewriting the scan loop last release was a huge effort and despite being diligent with testing with our nightly testers, bugs still slipped through. I wanted to take a step back and get Kavita sorted out before moving forward with new features, but I couldn't leave you with just fixes, so I made it action packed instead. With that, let's get into what's in this release.
Let's start with some big asks since the initial release of Kavita--the ability to send files directly to users devices. This is something Calibre has that avid book readers on Kindle need. Over the past few releases, I've been laying the ground work for this and with v0.6, we finally get to use it and from what the nightly users express, it's awesome. Any user in Kavita can setup devices with an email, this could be your Kindle email, your personal email, or anything. Give it a name and from any epub or pdf, you can send the file or files to your device. Currently this is limited to epub and pdf as there are no readers that support cbz, etc. However, if you have use cases, reach out. In order to use this, you must run your own KavitaEmail service.
Speaking of email, you know what's annoying? Having to have an email when you sign up for Kavita. Even though Kavita doesn't validate your email or require you to put in a real email, users have still complained about it. In this release, I updated the flows to better reflect this. Invite user will still ask for one but make it known it can be anything (although if it's not a real email an invite email will not send). When users sign up or an admin sets up the account, the email field is optional. On top of all this, Kavita now has a new Profile tab in User Settings which allows a central place to update and see their profile information and add/change it.
From emails to profiles, another big ask was Kid accounts. Many users have large libraries and want to restrict some profiles to certain levels of content. This is a tricky one as not all file formats are the same. PDFs and Epubs don't have an Age Rating field like CB* files, which expose it via the ComicInfo standard. Luckily, Kavita can store this information for you. With that, you can now setup Age Restrictions on accounts and grant those accounts the ability to maintain their own rating or not. Age Restrictions restricts all content that is higher than the rating set. If there are Unknowns (which is the default state), Kavita let's you set whether that is allowed for said profile or not. This restriction is applied at the highest level. So if you have one issue that is Mature while account is on Teen, the whole series will be purged from the user, including any promoted reading lists or collections.
That's a lot of heavy hitters, but I have more to talk about. This one is my favorite, Folder Watching. Folder Watching was introduced last release as an experimental feature and after much battle testing and reworking the code, I've cracked the code and gotten it to a really stable place. I personally have been running it for the last month without issue. This essentially brings your content into your server without having to wait for nightly scans. Do note, it is not designed for moving massive amounts of content over a long period of time into your library. It will still work, but you might get some partial series you have to manually cleanup.
Lastly, I want to talk more about the polish that this release is all about. Not only did the scan loop get major polish, from the release notes you'll see so did the parser, reader bugs (like double page layout now works consistently), and many quality of life enhancements.
A few shout outs on features as well:
- We are finally done with Tachiyomi. We have a PR open into the main application and it's been slotted into a release by the Tachiyomi developers. Huge thanks to @ThePromidius (who recently joined our Kavita team after 6+ months of battling Kotlin in development of our extension) for taking on this effort and working with our users to get it polished out.
- The Kavita Tachiyomi Extension (the preview build) contains full progress tracking support and has been working perfectly for the past month.
- Kavita now has a Readarr connection hook, which can do what Folder Watching does, without having to have it enabled. If you have Folder Watching enabled, you do not need the hook. This will be available in Readarr once Readarr releases next version.
To wrap up, I want to call out to some issues that cropped up in v0.5.6. As mentioned in the opening, the code was tested a ton but things slipped through. After you update, you need to pay attention to your logs. Your logs will indicate corrupted volumes or series that you need to manually cleanup from Kavita. This is an unfortunate reality, but luckily doesn't require data loss.
If you've still read to this point, props to you. If you've been enjoying Kavita, please consider donating or becoming a supporter. It makes a huge difference for me to continue pouring thousands of hours into the project (not just coding but support). Thank you again to my current supporters and those whom have donated.
Added
- Added: New Role for allowing users to bookmark. Bookmarking can consume a considerable amount of resources on the host system, so a role needs to be introduced to restrict this action. By default, existing users will have this role off (admins excluded, they have all abilities).
- Added: Kavita is now using Tiered Compilation and Dynamic PGO. These are techniques by .NET to analyze the application as it runs and optimize on the fly. This just means Kavita over time will get faster without any extra work by me or you.
- Added: Users can now search for a series on Bookmarks page. No other filter is active.
- Added: Implemented Russian filename parsing for Manga and Comics
- Added: When in the manga reader, you can now double click to bookmark pages.
- Added: When a user reads the full series of anything that is Completed or Cancelled and exists on their Want to Read list, Kavita will now remove the item from said Want to Read list on a nightly basis. This can be triggered at any time from Tasks page.
- Added: Kavita can now filter against release year (min, max, or both). If only min, all series that have a release year of or greater than the min are returned. If only max, all series that have a release year or less than or equal will be returned. Lastly if both, any series that fits in that range is returned.
- Added: Kavita can now sort by release year.
- Added: Added a new setting to manage how many log files exists in terms of days, since Kavita uses splitting on days now.
- Added: Added new stats for tracking to help with some of the reader feature utilization for some upcoming redesign/polish work
- Added: User's can now setup devices for readers that cannot access Kavita via web, but can receive files via email.
- Added: User's can now send pdf and epub files to devices via the context menu. Users MUST have their own email service setup in order to do this.
- Added: Added -화, -회, -장 for volume parsing for Korean filenames (Thanks @DeltaLaboratory for handling this)
- Added: Added -회 for chapter parsing for Korean filenames (Thanks @DeltaLaboratory for handling this)
- Added: New validation added to Edit Series modal to ensure Name and SortName are required
- Added: Series cover selection will now show all volume images or all chapter images (if only chapters exist)
- Added: New user setting to disable transition effects (animations) in the app. Great for e-ink readers.
- Added: When browsing on screens with infinite scroll, the scroller will now try to resume to the approximate location (nearest jump key) when navigating back.
- Added: Added the ability to edit Release Year on the Series
- Added: Admins can now setup restricted profiles for their users (or users can restrict themselves). A restricted profile will restrict content that does not match their Age Restriction rating. For example, all content on the server that is Mature would be hidden from a user with a Age Restriction of Teen. Age restrictions do not apply to admin accounts.
- Added: A new role called 'Change Restriction' now exists to allow a user to change their own age restriction.
- Added: Added a new Series relation called Edition. (A generic relation with no Parent relation)
Changed
- Changed: Swapped out the default logger with Serilog, which enables more expressive logs and powerful Sinks
- Changed: Log file rolling is enabled by default and now uses a day by day format. The new format will be kavitayyyyMMdd.log.
- Changed: Logging levels now affect other types of loggers from libraries and are now handled by Kavita. So Debug can provide rich logs, while Information can keep the other loggers to Error to keep the logs clean. Loggers have been significantly cleaned up and Debug is safe to use without so much spam. Trace will now have that same spammy output.
- Changed: Removed the data connection for the database out of appsettings.json and hard coded it. This is a prerequisite for auto updating.
- Changed: Updated pdf viewer to 15.0.0 (pdf.js 2.6) which now supports east-asian fonts.
- Changed: Unified the star rating design in series detail to match metadata filter.
- Changed: Changed Normalization to not strip ! from the resulting string. This requires an expensive migration which will take time on first load of this version. This will allow users to have series that differ by !
- Changed: When parsing epub files, ensure SeriesSort tag is used when defined
- Changed: Disable Angular Animations for older iOS (<14) devices to allow the readers to still function (Thank you @ocgineer for tackling this)
- Changed: Optimized the bookmark and unbookmark flows to remove 2 DB calls and reworked the flow of logic.
- Changed: Collection cover image chooser will now prompt with all series posters from within the collection.
- Changed: Cover image chooser now has the reset button first (if applicable)
- Changed: Moved the brightness value readout to the same label line as Brightness in Manga reader
- Changed: Updated our epub parser which now supports reading Link properties and includes more cover handling logic.
- Changed: Changed the code that checks for ComicInfo.xml inside archives to follow the spec and enforce case and only check root of archive first, then fallback to a more loose ComicInfo.xml check.
- Changed: Reworked Folder Watching nearly completely to be more robust and moved it out of Experimental
- Changed: Optimized some of the parser methods. CleanTitle is up to 10 times faster. (Thanks @tjarls )
- Changed: Support additional variants for special keywords 'One Shot', 'Hors-Série' (Thanks @tjarls )
- Changed: Debug and Info logger is much less noisy. If you want SQL Output for debugging, use Trace.
- Changed: Word wrapping on the title and localized title, instead of break-all.
- Changed: Actionable menus are now able to have nested menus (Thanks @KorakotSanti for driving this home)
- Changed: Removed the Lock field on Series name since it inherently is locked
- Changed: Kavita now sends InstallId (represents a unique install) to Email Service to allow throughput tracking. InstallId is not able to be tracked to personal information about your install.
- Changed: When performing actions on series detail, don't disable the button anymore.
- Changed: (Auth) Users no longer need to signup with an email. It is now optional for all of Kavita. If not used, then Forgot Password will not function.
- Changed: (Auth) Users can now edit their email after the fact via Profile tab in user settings. Email confirmation via log file or email is required for the email change to take effect.
- Changed: Fixed up some typos on word publicly
- Changed: The scan loop is now synchronous. From testing, there is no major performance difference and this fixes duplication issues or some scan errors.
- Changed: Updated the LibraryWatcher to now suspend watching if multiple internal buffer exceptions occur. After an hour, the scanner will restart.
- Changed: Release Year on info cards now shows as Year
- Changed: When ScanFolder runs (via api or library watcher), ensure we don't queue duplicate tasks
- Changed: Series Detail api will now cache for a min to reduce load
- Changed: The scan loop log will now complain if there is a corrupted volume from buggy code in v0.5.6. This new log informs users to delete the series and rescan.
- Changed: Moved Folder Watching out of experimental. It is now stable to a point that it can be used as a primary driver for changes.
- Changed: When ScanFolder is invoked and the folder resides in a book library, a full library scan will be invoked to ensure changes are picked up for users that have multiple series in one shared folder.
- Changed: When ScanFolder schedules a library or series scan, it will now wait 1 min to give time for any other requests behind it to be dropped.
- Changed: When updating a reading list's title, explicitly check against other reading lists, like we do when we create a list
- Changed: Removed an additional epub parse when scanning and handled merging differently
Fixed
- Fixed: Fixed up some regex for parsing volumes that have a float number, so Series v3.5 will now properly parse as Volume 3.5
- Fixed: Fixed a bug where tooltip for Publication Status wouldn't show Current Items / Max Items.
- Fixed: Fixed some weird parsing rules where v1.1 would parse as volume 1 chapter 1
- Fixed: Fixed a bug in bulk selection code where when using shift selection, the inverse of what was selected was toggled.
- Fixed: Fixed up some old code where if on all series page, only English would show as a language
- Fixed: Fixed an issue where some users were missing a theme entry and the Save user preferences wouldn't work for them
- Fixed: Fixed an assumption that the environment always uses US time format which could cause ReleaseYear parsing of ComicInfo to fail.
- Fixed: Fixed a ComicInfo XML de-serialization bug with empty elements of xs:int type into ints
- Fixed: Fixed a typo in manage tasks of Reoccuring -> Recurring
- Fixed: Fixed a bug in MinimumNumberFromRange where a regex wasn't properly contstructed which could skew results
- Fixed: Fixed a bug where Volume numbers that were a float wouldn't render correctly in the manga reader menu
- Fixed: Fixed a case where when using double (manga) layout, bookmarking a page wouldn't show it on both pages, despite them both being saved.
- Fixed: Fixed a log message that wasn't properly formatted after a scan ran and there were 0 files (everything was skipped).
- Fixed: Fixed the prefetcher in the Manga reader to always load in the correct sequence
- Fixed: Fixed a bug where continuous scroller wouldn't trigger in fullscreen mode of webtoon reader
- Fixed: Fixed a bug where manga reader when given an image of height smaller than reading area, the pagination area wouldn't extend to the bottom of the reader.
- Fixed: Fixed a bug where manipulating background color in user preferences of manga reader wouldn't enable the save button
- Fixed: Fixed a bug where scanner could select the wrong first file when a series is first imported and has ComicInfo.
- Fixed: Fixed a bug where volumes that had larger than 1 difference wouldn't properly return next/prev chapter (for continuous reader) (ie volume 1 -> volume 3 wouldn't work)
- Fixed: Special regexps are now word bound which reduces false positives (Thanks @tjarls )
- Fixed: Cases where CleanTitle would erase the entire file name when it starts and ends with parenthesis (Thanks @tjarls )
- Fixed: Fixed a concurrency issue when saving new Series in scan loop
- Fixed: Fixed a regression from a downstream epub library that broke reading some epub books
- Fixed: Fixed inline validations not rendering throughout the app
- Fixed: Don't allow the user to bookmark in bookmark mode
- Fixed: Fixed a bug where Scan Series would skip over Specials folder due to how new scan loop works
- Fixed: Fixed scroll to top persisting between page loads
- Fixed: Fixed up the way the Series Detail page lays out to work better in all breakpoints
- Fixed: Fixed a bug where Email Service errors weren't propagating to the UI Layer.
- Fixed: Fixed a bug where .kavitaignore wasn't being applied at library root level
- Fixed: Fixed a bug where multiple theme scans could occur at the same time, throwing an error
- Fixed: Fixed an issue where empty folders could break scan loop
- Fixed: ScanSeries job will now check for .kavitaignores higher than it's own folder and respect library level ignores
- Fixed: Fixed an issue where image series with a folder name containing the word folder could get ignored as though the image itself was a cover image.
- Fixed: Fixed a bug where get next/prev chapter wouldn't respect floating point volume numbers
- Fixed: Fixed a bug when building kavita ignore exclusions, blank lines could break scanner
- Fixed: Fixed a bug where changing the name in Kavita of a series then doing a scan series, the series would be deleted
- Fixed: Fixed cover generation choosing a special file for the Series when there is only specials and chapters in the Series
- Fixed: Fixed a scaling issue in the epub reader, where images could scale when they shouldn't
- Fixed: Fixed foreign constraint issue when cleaning up series not seen at end of scan loop. The Scan loop will alert you if there are bad entities that need deleting. You need to remove any related series then delete the series.
- Fixed: Fixed an issue where removing a series from want to read page wouldn't update the page correctly
- Fixed: Fixed a bug where uploading a new image in cover chooser wouldn't properly select the image. This fix includes auto selecting the newly uploaded cover.
- Fixed: Fixed title bar being all white on PWA. This will be investigated to be theme-able later.
- Fixed: Fixed a bug where bulk selection on series detail wouldn't allow you to select the whole card, only checkbox
- Fixed: Fixed a bug where volume cards weren't properly updating their read state based on events from backend
- Fixed: Fixed broken white theme in eink reader
- Fixed: Fixed the positioning of the 'Library | Recommended' buttons, which would jump up or down depending on which was selected (Thanks @TheIceCreamTroll )
- Fixed: Fixed the reading list deletion process not navigating the user back to the reading list library (Thanks @TheIceCreamTroll )
- Fixed: Fixed a bug where scanning for themes would always report theme didn't exist
Security
- Fixed: Fixed a security vulnerability (https://huntr.dev/bounties/8a3e652f-d6bf-436e-877e-0eaf5c69ef95/). Note: The report will be made available a few days after the release to allow clients to update.
Removed
- Removed: Removed a migration of config files from pre-v0.4.9. If you are updating from this version, do not update directly to v0.6.0.
API
- Changed: Refactored some APIs in /api/reader/ around bookmarks to remove get-
- Changed: (API) series/series-for-chapter, series/series-for-mangafile, and library/search have now all moved under search/
- Removed: (API) Removed the api library/libraries as library/ did the same thing already
New Contributors
- @ocgineer made their first contribution in #1504
- @KorakotSanti made their first contribution in #1554
- @DeltaLaboratory made their first contribution in #1556