scanner: fix library isolation, file mtime, force rescan, and deletion handling

Fix 1 - File modification time for created_at:
- Get file.ModTime() in processMediaFile and pass to CreateMediaItem
- Modified SQL INSERT to include created_at column

Fix 2 - Force rescan UPDATE instead of DELETE+INSERT:
- Changed force rescan logic to call updateMediaItem instead of delete + create
- Preserves created_at timestamp on force rescan

Fix 3 - GetMediaItemByFilePath filters by library_id:
- Added library_id to WHERE clause in SQL query
- Created GetMediaItemByFilePathAnyLibrary for cross-library lookups (KOReader)
- Added SetLibraryID method to MediaScanner
- Updated handler to call SetLibraryID for watch mode

Fix 4 - File deletion handling with persistent logging:
- Added fsnotify.Remove handler in WatchChanges
- Added orphan cleanup in ScanFolders after scan completes
- Created scanner_logger.go with daily log rotation (7 days)
- Logs to /app/logs/scanner-deletes-YYYY-MM-DD.log and scanner-errors-YYYY-MM-DD.log
- Individual deletes with enhanced safety logging

Note: Integration tests can now safely scan /app/uploads because
GetMediaItemByFilePath now filters by library_id, preventing
cross-library interference.
This commit is contained in:
2026-02-26 16:39:42 -05:00
parent 56c80fbe14
commit d802236874
14 changed files with 1432 additions and 83 deletions
+11 -6
View File
@@ -2,15 +2,20 @@ info:
name: Get Scan Settings
type: http
seq: 2
http:
method: GET
url: '{{base_url}}/api/library/scan-settings'
auth: inherit
body:
type: none
url: "{{base_url}}/api/libraries/scan-settings"
headers:
- key: Content-Type
value: application/json
- name: ""
value: application/json
auth: inherit
settings:
encodeUrl: true
timeout: 0
followRedirects: true
maxRedirects: 5
docs: |-
## Get Scan Settings
+17 -7
View File
@@ -2,17 +2,27 @@ info:
name: Update Scan Settings
type: http
seq: 1
http:
method: PUT
url: '{{base_url}}/api/library/scan-settings'
auth: inherit
url: "{{base_url}}/api/libraries/scan-settings"
headers:
- name: ""
value: application/json
body:
type: json
jsonBody: "{\n \"scan_frequency_minutes\": 60,\n \"auto_scan_enabled\":\
\ true"
headers:
- key: Content-Type
value: application/json
data: |-
{
"scan_frequency_minutes": 30,
"auto_scan_enabled": true
}
auth: inherit
settings:
encodeUrl: true
timeout: 0
followRedirects: true
maxRedirects: 5
docs: |-
## Update Scan Settings