- Introduce option to automatically move books when their metadata is updated
- Simplify the file monitoring workflow for improved reliability and clarity
* write, read ComicInfo.xml for CBZ files
* updated with recommendations from previous PR https://github.com/booklore-app/booklore/pull/1069
* read ComicInfo.xml on CBR, extract first image for CBZ/CBR files, save CBR metadata in ComicInfo.xml as CBZ
* Delete CBR file after CBZ conversion. Update DB
* Backs up file before updating. Restores back up if errored
* Test classes
* Update booklore-api/src/main/java/com/adityachandel/booklore/service/metadata/BookMetadataUpdater.java
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update booklore-api/src/main/java/com/adityachandel/booklore/service/metadata/writer/CbxMetadataWriter.java
Updating RAR binary availability check
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update booklore-api/src/main/java/com/adityachandel/booklore/service/metadata/extractor/CbxMetadataExtractor.java
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update booklore-api/src/main/java/com/adityachandel/booklore/service/metadata/extractor/CbxMetadataExtractor.java
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Code updates from PR suggestions
* Support to extract ComicInfo.xml for .cb7 files
* Writer extension for .cb7 files
* Adding com.github.junrar to build.gradle (forgot in previous commit)
* Settings toggle to control CBR/CB7 to CBZ conversion
* indentation complains
* removed duplicated junrar inport
* Restore comicinfo.xml metadata in edit view
* retrieve ComicInfo.xml metadata for new files in library scan
* private class definition was missed after merge
* Delete
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
- Implement MonitoringProtectionService with thread-safe pause/resume logic
- Add monitoring protection to file operations preventing data loss from race conditions
- Add comprehensive test coverage including concurrent and integration tests
Race condition scenario: File operations (move/delete) detected as "missing files"
by monitoring system before filesystem operations complete, causing incorrect
book removal and data loss.
Solution: Thread-safe monitoring pause during file operations with delayed resume
to ensure filesystem operations complete before monitoring resumes.
* fixing permissions to be able to run springboot with given UID and GID
* Adding USER_ID and GROUP_ID to specify permission without making breaking change
* move su exec to start.sh
---------
Co-authored-by: Aditya Chandel <8075870+adityachandelgit@users.noreply.github.com>
* feat: support Douban as metadata provider.
Douban.com is a platform of sharing films, music and books in China.
* format code
* support douban reviews
---------
Co-authored-by: Aditya Chandel <8075870+adityachandelgit@users.noreply.github.com>
* test: add content-type assertion for user auth
* fix: specify JSON content type in authorizeUser method
Set content type to JSON for user authorization response.
* feat(api/model): add new entity BookAdditionalFileEntity
* feat(api/db): add book additional file repository
* feat(api/db): add migration
* test(api/db): add book additional file repository test
* test(api/db): add book additional file repository tests for hash uniqueness
* feat(api/domain): add support to additional file model
* feat(api): add additional files controller
* refactor(api): move addAdditionalFile to FileUploadService as uploadAdditionalFile method
* feat(service): search book by additional file
* feat(services): process deleted additional files with ability to promote alternative formats to book instead of deleting them
* refactor(util): use common code to resolve patter for entity and domain object
* feat(service): move additional files
* test(service): test move additional files along with book itself
* feat(ui/domain): add alternativeFormats and supplementaryFiles to book model
* feat(ui/domain): add download additional file method to book service
* refactor(api/domain): extract FileInfo interface with common fields
Allow to share the same interface thet is implemented by AdditionFile and Book
* feat(ui): show multiple download options
* feat(ui/domain): add delete additional file method to book service
* feat(ui): add delete additional file ui
* feat(ui): add additional-file-uploader.component
* feat(ui/domain): add uploadAdditionalFile to the service
* feat(ui): add Upload File menu item
* feat(ui): show supplementary files in download menu item
* feat(ui): show supplementary files in delete file menu item
* feat(ui): book card allow to select single file to download or delete
* feat(api/domain): add scan mode and default book format to the library
* feat(ui): select scan mode and default book format
* feat(api): create/update library settings
* refactor(services): get processor based on scan mode
* feat(services): read all files if processor supports supplimentary files
* fix(services): detectNewBookPaths should check additional files as well
* feat(services): implement folder as book file processor
* test(service): add tests for FolderAsBookFileProcessor
* feat(services): allow follow links for search library files
* test(library): add tests for folder as book file processor
* refactor(library): use Path instead of String for directory path
* feat(library): sort directories before processing
* feat(library): reuse library file book type
* fix(library): do not add additional format if it is used in another book
* test(library): test same hashes files
* refactor(library): simplify FolderAsBookFileProcessor
* test(library): add test with deep folder structure
* test(library): add additional files to existing book
---------
Co-authored-by: Aditya Chandel <8075870+adityachandelgit@users.noreply.github.com>
* feat(api/model): add new entity BookAdditionalFileEntity
* feat(api/db): add book additional file repository
* feat(api/db): add migration
* test(api/db): add book additional file repository test
* test(api/db): add book additional file repository tests for hash uniqueness
* feat(api/domain): add support to additional file model
* feat(api): add additional files controller
* refactor(api): move addAdditionalFile to FileUploadService as uploadAdditionalFile method
* feat(service): search book by additional file
* feat(services): process deleted additional files with ability to promote alternative formats to book instead of deleting them
* refactor(util): use common code to resolve patter for entity and domain object
* feat(service): move additional files
* test(service): test move additional files along with book itself
* Fixed issue with not updating the book finished date when updating read status
* Added ability to set a date finished after setting the book status to Read.
---------
Co-authored-by: Aditya Chandel <8075870+adityachandelgit@users.noreply.github.com>
* Fixed issue with not updating the book finished date when updating read status
* Added ability to set a date finished after setting the book status to Read.
---------
Co-authored-by: Aditya Chandel <8075870+adityachandelgit@users.noreply.github.com>