**Refactor directory scanning and add scan task support**

- Added a new `scan_directory` task to enable folder scans as asynchronous tasks while maintaining compatibility with the immediate backend.
- Introduced the `reconcile` function, replacing `generate_directory` for improved separation of concerns between database writes and read operations.
- Established a unique constraint on `Directory` (`one_directory_name_per_parent`) to prevent duplicate directories under the same parent.
- Added a "Scan" button to the frontend for re-reading folders from disk, along with new task invocation endpoints in the API.
- Updated tests across modules to validate the new `scan_directory` task, unique constraints, and database indexing logic.
- Improved cleanup logic for stale files, directories, and thumbnails to handle concurrent operations efficiently.
- Simplified `scan_comics` management command by removing user dependency and aligning it with the new `reconcile` function.
- Enhanced frontend components (`TheComicReader`, `TheComicList`, and others) to include lifecycle method cleanups, prevent memory leaks, and handle task-based scans.
This commit is contained in:
ajurna committed 2026-10-13 15:58:06 +01:00
1 parent 4d0ba750ad
commit ce809ed1a9
18 files changed
+364 -81

No files matched your search

+14 -2
View File
@@ -131,10 +131,11 @@ export default {
}).then(() => {
this.deck.slide(this.current_page)
api.put(set_read_url, {page: this.current_page})
this.deck.on( 'slidechanged', (event) => {
this.slideChanged = (event) => {
this.$refs.comic_box.scrollIntoView({behavior: 'smooth'})
api.put(set_read_url, {page: event.indexh})
});
}
this.deck.on('slidechanged', this.slideChanged);
})
this.hammertime = new Hammer(this.$refs.comic_box, {})
@@ -153,6 +154,17 @@ export default {
},
beforeUnmount() {
window.removeEventListener('keyup', this.keyPressDebounce)
clearTimeout(this.key_timeout)
if (this.deck) {
if (this.slideChanged) {
this.deck.off('slidechanged', this.slideChanged)
}
try {
this.deck.destroy()
} catch (e) {
console.log(e)
}
}
try {
this.hammertime.off('swipeleft')
this.hammertime.off('swiperight')