* Implemented the ability to link different series together through Edit Series. CSS pending.
* Fixed up the css for related cards to show the relation
* Working on making all tabs in edit seris modal save in one go. Taking a break.
* Some fixes for Robbie to help with styling on
* Linked series pill, center library
* Centering library detail and related pill spacing
- Library detail cards are now centered if total number of items is > 6 or if mobile.
- Added ability to determine if mobile (viewport width <= 480px
- Fixed related card spacing
- Fixed related card pill spacing
* Updating relation form spacing
* Fixed a bug in card detail layout when there is no pagination, we create one in a way that all items render at once.
* Only auto-close side nav on phones, not tablets
* Fixed a bug where we had flipped state on sideNavCollapsed$
* Cleaned up some misleading comments
* Implemented RBS back in and now if you have a relationship besides prequel/sequel, the target series will show a link back to it's parent.
* Added Parentto pipe
* Missed a relationship type
Co-authored-by: Robbie Davis <robbie@therobbiedavis.com>
* Cleaned up random strings and unified them in one place.
* Implemented the ability to disable typeaheads
* Refactored disable state to disable controls on filter
* Fixed an overflow regression on title
* Updated ComicInfo DTO which had some bad properties on it
* Cleaned up some code around disabled typeaheads/filters
* Fixed typeaheads causing resets to state and mucking up filter presets
* Fixed state not refreshing between page loads
* Fixed a bad parsing for My Charms Are Wasted on Kuroiwa Medaka - Ch. 37.5 - Volume Extras
* Cleanup within the metadata filter to reuse logic and minimize extra loops.
* Fixed a timing issue with typeahead and first load for people
* Fixed a bug in Publication Status for a given library, which would fail due to not performing some of the query in memory. Removed a custom index on Series table that wasn't used and potentially caused constraint issues.
* Added a wiki link for stats collections
* Security bump
* Fixed the regex
* Added playwright and started writing e2e tests.
* To make things easy, disabled other browsers while I get confortable. Added a login flow (assumes my dev env)
* More tests on login page
* Lots more testing code, trying to figure out auth code.
* Ensure we don't track DBs inside config
* Added a new date property for when chapters are added to a series which helps with OnDeck calculations. Changed a lot of heavy api calls to use IEnumerable to stream repsonse to UI.
* Fixed OnDeck with a new field for when last chapter was added on Series. This is a streamlined way to query.
Updated Reading List with NormalizedTitle, CoverImage, CoverImageLocked.
* Implemented the ability to read a random item in the reading list and for the reading list to be intact for order.
* Tweaked the style for webtoon to not span the whole width, but use max width
* When we update a cover image just send an event so we don't need to have logic for when updates occur
* Fixed a bad name for entity type on cover updates
* Aligned the edit collection tag modal to align with new tab design
* Rewrote code for picking the first file for metadata to ensure it always picks the correct file, esp if the first chapter of a series starts with a float (1.1)
* Refactored setting LastChapterAdded to ensure we do it on the Series.
* Updated Chapter updating in scan loop to avoid nested for loop and an additional loop.
* Fixed a bug where locked person fields wouldn't persist between scans.
* Updated Contributing to reflect how to view the swagger api
* Added the skeleton code for layout, hooked up Age Rating, Publication Status, and Tags
* Tweaked message of Scan service to Finished scan of to better indicate the total scan time
* Hooked in foundation for person typeaheads
* Fixed people not populating typeaheads on load
* For manga/comics, when parsing, set the SeriesSort from ComicInfo if it exists.
* Implemented the ability to override and create new genre tags. Code is ready to flush out the rest.
* Ability to update metadata from the UI is hooked up. Next is locking.
* Updated typeahead to allow for non-multiple usage. Implemented ability to update Language tag in Series Metadata.
* Fixed a bug in GetContinuePoint for a case where we have Volumes, Loose Leaf chapters and no read progress.
* Added ETag headers on Images to allow for better caching (bookmarks and images in manga reader)
* Built out UI code to show locked indication to user
* Implemented Series locking and refactored a lot of styles in typeahead to make the lock setting work, plus misc cleanup.
* Added locked properties to dtos. Updated typeahead loading indicator to not interfere with close button if present
* Hooked up locking flags in UI
* Integrated regular field locking/unlocking
* Removed some old code
* Prevent input group from wrapping
* Implemented some basic layout for metadata on volume/chapter card modal. Refactored out all metadata from Chapter object in terms of UI and put into a separate call to ensure speedy delivery and simplicity of code.
* Refactored code to hide covers section if not an admin
* Implemented ability to modify a chapter/volume cover from the detail modal
* Removed a few variables and change cover image modal
* Added bookmark to single chapter view
* Put a temp fix in for a ngb v12 z-index bug (reported). Bumped ngb to 12.0 stable and fixed some small rendering bugs
* loading buttons ftw
* Lots of cleanup, looks like the story is finished
* Changed action name from Info to Details
* Style tweaks
* Fixed an issue where Summary would assume it's locked due to a subscription firing on setting the model
* Fixed some misc bugs
* Code smells
Co-authored-by: Robbie Davis <robbie@therobbiedavis.com>
* Added an alt implementation which shows Recently Added chapters. No extra grouping is performed if multiple chapters per volume.
* Started working on a grouping implementation for series.
* Disabled the code for bookmarks cleanup as there is some critical issue in there.
* Implemented a Series Group activity stream which shows recently updated series and providers a count badge showing how many new chapters/volumes were added in that series.
* Removed the bookmark disabling code
* Cleaned up code
* One more code cleanup
* 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
* 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.
* 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
* Some performance refactoring around getting Library and avoid a byte[] copy for getting cover images for epubs.
* Initial commit. Rewrote the main series scan loop to use chunks of data at a time. Not fully shaken out.
* Hooked in the ability for the UI to react to series being added or removed from the DB.
* Cleaned up the messaging in the scan loop to be more clear.
* Metadata scan and scan work as expected and populate data to the UI. There is a slow down in speed for overall operation.
Scan series and refresh series metadata does not work fully.
* Fixed a bug where MangaFiles were not having LastModified Updated correctly, meaning they were opening archives every scan.
* Modified the code to be more realistic to the underlying file
* Updated ScanService to properly handle deleted files and not result in a higher-level scan.
* Shuffled around volume related repo apis to the volume repo rather than being in series.
* Rewrote scan series to be much cleaner and more concise on the flow. Fixed an issue in UpdateVolumes such that the debug code to log out removed volumes could throw an exception and actually break updating volumes.
* Refactored the code to set MangaFile last modified timestamp into the MangaFile entity.
* Added Series Name to ScanSeries event
* Added additional checks in ScanSeries to ensure we never go outside the library folder.
Added extra debug messages for when a metadata refresh doesn't actually make changes and for when we regen cover images.
* More logging statements saying where they originate from. Fixed a critical bug which caused only 1 chunk to ever be processed.
* Fixed a concurrency issue with natural sorter which could cause issues in ArchiveService.cs.
* Log cleanups
* Fixed an issue with logging out total time of a scan.
* Only show added toastrs for admins. When kicking off a refresh metadata for series, make sure we regenerate all cover images.
* Code smells on benchmark despite it being ignored
* Updating wording on card item when total pages is 0, to be just "Cannot Read" since it could be a non-archive file
* Refactored cover images to be stored on disk. This first commit has the extraction to disk and the metadata service to handle updating when applicable.
* Refactored code to have the actual save to cover image directory done by ImageService.
* Implemented the ability to override cover images.
* Some cleanup on Image service
* Implemented the ability to cleanup old covers nightly
* Added a migration to migrate existing covers to new cover image format (files).
* Refactored all CoverImages to just be the filename, leaving the Join with Cover directory to higher level code.
* Ensure when getting user progress, we pick the first.
* Added cleanup cover images for deleted tags. Don't pull any cover images that are blank.
* After series update, clear out cover image. No change on UI, but just keeps things clear before metadata refresh hits
* Refactored image formats for covers to ImageService.
* Fixed an issue where after refactoring how images were stored, the cleanup service was deleting them after each scan.
* Changed how ShouldUpdateCoverImage works to check if file exists or not even if cover image is locked.
* Fixed unit tests
* Added caching back to cover images.
* Caching on series as well
* Code Cleanup items
* Ensure when checking if a file exists in MetadataService, that we join for cover image directory. After we scan library, do one last filter to delete any series that have 0 pages total.
* Catch exceptions so we don't run cover migration if this is first time run.
* After a scan, only clear out the cache directory and not do a deep clean.
* Implemented the ability to backup custom locked covers only.
* Fixed unit tests
* Trying to figure out why GA crashes when running MetadataServiceTests.cs
* Some debugging on GA tests not running
* Commented out tests that were causing issues in GA.
* Fixed an issue where series cover images wouldn't migrate
* Fixed the updating of links to actually do all series and not just locked
* Added some documentation. Removed Require Admin Role from Search Tags. Added Summary to be updated on UpdateTag.
* Added Swagger xml doc generation to beef up the documentation. Started adding xml comments to the APIs. This is a needed, slow task for upcoming Plugins system.
* Implemented the ability to upload a custom series image to override the existing cover image.
Refactored some code out to use ImageService and added more documentation
* When a page cache fails, delete cache directory so user can try to reload.
* Implemented the ability to lock a series cover image such that after user uploads something, it wont get refreshed by Kavita.
* Implemented the ability to reset cover image for series by unlocking
* Kick off a series refresh after a cover is unlocked.
* Ability to press enter to load a url
* Ability to reset selection
* Cleaned up cover chooser such that reset is nicer, errors inform user to use file upload, series edit modal now doesn't use scrollable body. Mobile tweaks. CoverImageLocked is now sent to the UI.
* More css changes to look better
* When no bookmarks, don't show both markups
* Fixed issues where images wouldn't refresh after cover image was changed.
* Implemented the ability to change the cover images for collection tags.
* Added property and API for chapter cover image update
* Added UI code to prepare for updating cover image for chapters. need to rearrange components
* Moved a ton of code around to separate card related screens into their own module.
* Implemented the ability to update a chapter/volume cover image
* Refactored action for volume to say edit to reflect modal action
* Fixed issue where after editing chapter cover image, the underlying card wouldn't update
* Fixed an issue where we were passing volumeId to the reset chapter lock. Changed some logic in volume cover image generation.
* Automatically apply when you hit reset cover image
# Added
- Added support for PDFs within Kavita. PDFs will open in the Manga reader and you can read through them as images. PDFs are heavier than archives, so they may take longer to open for reading. (Fixes#187)
# Changed
- Changed: Major change in how Kavita libraries work. Kavita libraries will now allow for mixed media types, that means you can have raw images, archives, epubs, and pdfs all within your Manga library. In the case that the same Series exists between 2 different types of medias, they will be separated and an icon will show to help you identify the types. The correct reader will open regardless of what library you are on. Note: Nightly users need to delete their Raw Images libraries before updating.
# Fixed
- Fixed: Fixed an issue where checking if a file was modified since last scan always returned true, meaning we would do more I/O than was needed (Fixes#415)
- Fixed: There wasn't enough spacing on the top menu bar on the Manga reader
- Fixed: Fixed a bug where user preferences dark mode control always showed true, even if you were not using dark mode
# Dev stuff
- For image extraction, if there is only 1 image we will extract just that, else we will extract only images
- Refactored all the Parser code out of the ScannerService into a self contained class. The class should be created for any scans, allowing multiple tasks to run without any chance of cross over.
* Fixed indentation for cs files
* Fixed an issue where the logic for if a file had been modified or not was not working and always saying modified, meaning we were doing more file I/O than needed.
* Implemented the ability to have PDF books. No reader functionality.
* Implemented a basic form of scanning for PDF files. Reworked Image based libraries to remove the need to separate in a special library and instead just work within the Manga/Comic library.
* Removed the old library types.
* Removed some extra code around old raw library types
* Fully implemented PDF support into Kavita by using docnet. Removed old libraries we tried that did not work. PDFs take about 200ms to save the file to disk, so they are much slower than reading archives.
* Refactored Libraries so that they can have any file extension and the UI will decide which reader to use.
* Reworked the Series Parsing code.
We now use a separate instance for each task call, so there should be no cross over if 2 tasks are running at the same time.
Second, we now store Format with the Series, so we can have duplicate Series with the same name, but a different type of files underneath.
* Fixed PDF transparency issues
- Used this code to fix an issue when a PDF page doesn't have a background. https://github.com/GowenGit/docnet/issues/8#issuecomment-538985672
- This also fixes the same issue for cover images
* Fixed an issue where if a raw image was in a directory with non-image files, those would get moved to cache when trying to open the file.
* For image extraction, if there is only 1 image, just copy that to cache instead of everything else in the directory that is an image.
* Add some spacing to the top menu bar
* Added an icon to the card to showcase the type of file
* Added a tag badge to the series detail page
* Fixed a bug in user preferences where dark mode control would default to true, even if you weren't on it
* Fixed some tests up
* Some code smells
Co-authored-by: Robbie Davis <robbie@therobbiedavis.com>
* Code cleanup, refactored FileRepository into Unit of Work.
* Added AutoCloseMenu and ReaderMode user perferences to match UI
* Added extra information to ChapterInfo
* Build changes
* Updated the readme to have open collective information and thanks to sponsors
* Fixed an issue with UnitOfWork refactor and how stats was bootsrapped. Replaced stats.kavitareader with a temp url to test out redirection bug.
* Readme refactored to be more clean and clear, taking inspiration from wiki.js's readme.
* Initial backend for Collections and basic metadata implemented.
* More build flavors for Raspberry Pi users and updated Install since we don't need users to set their own JWT Token Key. Update a typo in appsettings.json file for prod.
* Fixed#224. Sort before getting a First?Last() chatper
* The rough ability to add and get series metadata and tags.
* Fix a bug on getting metadata for when it doesn't exist.
* Fixed a bug where flattening directories with some unique filenames could cause reading order of images to be out of order.
* Added a seed code to ensure all series have SeriesMetdata
* Ensure all instances of opening an epub is using "using" so we don't lock the file. When we have a malformed html file, log the issues and inform the user we can't open the file.
* Book reader now handles @Import "" statements in CSS and inlines the css into css file that references them. This allows for them to be scoped. In addition, if the html or body tag had classes, we now send back a single div with those classes.
* Fixed GetSeriesDtoForCollectionAsync which was not properly returning series
* Implemented cover image for collection tag. Fixed an issue in metadata update call.
* Add check for user access when resolving series for a collection tag. When asking for all tags, if the user is not an admin, only give promotoed tags back.
* Implemented updateTag api
* Implemented the ability to update series the tags have access to.
* Cleanup, sorting, and null check
* More sorting changes
* Ensure we can delete tags when editing a series tags
* Fix order of update to make sure a tag is properly deleted
* Code smells
* Added book filetype detection and reorganized tests due to size of file
* Added ability to get basic Parse Info from Book and Pages.
* We can now scan books and get them in a library with cover images.
* Take the first image in the epub if the cover isn't set.
* Implemented the ability to unzip the ebup to cache. Implemented a test api to load html files.
* Just some test code to figure out how to approach this.
* Fixed some merge conflicts
* Removed some dead code from merge
* Snapshot: I can now load everything properly into the UI by rewriting the urls before I send them back. I don't notice any lag from this method. It can be optimized further.
* Implemented a way to load the content in the browser not via an iframe.
* Added a note
* Anchor mappings is complete. New anchors are updated so references now resolve to javascript:void() for UI to take care of internally loading and the appropriate page is mapped to it. Anchors that are external have target="_blank" added so they don't force you out of the app and styles are of course inlined.
* Oops i need this
* Table of contents api implemented (rough) and some small enhancements to codebase for books.
* GetBookPageResources now only loads files from within the book. Nested chapter list support and images now use html parsing instead of string parsing.
* Fonts now are remapped to load from endpoint.
* book-resources now uses a key, ensuring the file is in proper format for lookup. Changed chapter list based on structure with one HEADER and nested chapters.
* Properly handle svg resource requests and when there are part anchors that are clickable, make sure we handle them in the UI by adding a kavita-page handler.
* Add Chapter group page even if one isn't set by using first page (without part) from nestedChildren.
* Added extra debug code for issue #163.
* Added new user preferences for books and updated the css so we scope it to our reading section.
* Cleaned up style code
* Implemented ability to save book preferences and some cleanup on existing apis.
* Added an api for checking if a user has read something in a library type before.
* Forgot to make sure the has reading progress is against a user lol.
* Remove cacheservice code for books, sine we use an in-memory method
* Handle svg images as well
* Enhanced cover image extraction to check for a "cover" image if the cover image wasn't set in OPF before falling back to the first image.
* Fixed an issue with special books not properly generating metadata due to not having filename set.
* Cleanup, removed warmup task code from statup/program and changed taskscheduler to schedule tasks on startup only (or if tasks are changed from UI).
* Code cleanup
* Code cleanup
* So much code. Lots of refactors to try to test scanner service. Moved a lot of the queries into Extensions to allow to easier test, even though it's hacky. Support @font-face src:url swaps with ' and ". Source summary information from epubs.
* Well...baseURL needs to come from BE and not from UI lol.
* Adjusted migrations so default values match Entity
* Removed comment
* I think I finally fixed#163! The issue was that when i checked if it had a parserInfo, i wasn't considering that the chapter range might have a - in it (0-6) and so when the code to check if range could parse out a number failed, it treated it like a special and checked range against info's filename.
* Some bugfixes
* Lots of testing, extracting code to make it easier to test. This code is buggy, but fixed a bug where 1) If we changed the normalization code, we would remove the whole db during a scan and 2) We weren't actually removing series properly.
Other than that, code is being extracted to remove duplication and centralize logic.
* More code cleanup and test cleanup to ensure scan loop is working as expected and matches expectaions from tests.
* Cleaned up the code and made it so if I change normalization, which I do in this branch, it wont break existing DBs.
* Some comic parser changes for partial chapter support.
* Added some code for directory service and scanner service along with python code to generate test files (not used yet). Fixed up all the tests.
* Code smells