diff --git a/src/backend/model/DiskManger.ts b/src/backend/model/DiskManger.ts index 749b71e0..06433f35 100644 --- a/src/backend/model/DiskManger.ts +++ b/src/backend/model/DiskManger.ts @@ -3,6 +3,7 @@ import {Logger} from '../Logger'; import {Config} from '../../common/config/private/Config'; import {DiskManagerTH} from './threading/ThreadPool'; import {DiskMangerWorker} from './threading/DiskMangerWorker'; +import {FileDTO} from '../../common/entities/FileDTO'; const LOG_TAG = '[DiskManager]'; @@ -16,6 +17,13 @@ export class DiskManager { } } + + public static async scanDirectoryNoMetadata(relativeDirectoryName: string, + settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise> { + settings.noMetadata = true; + return this.scanDirectory(relativeDirectoryName, settings); + } + public static async scanDirectory(relativeDirectoryName: string, settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise { diff --git a/src/backend/model/jobs/jobs/FileJob.ts b/src/backend/model/jobs/jobs/FileJob.ts index 7bf2860a..08668a9c 100644 --- a/src/backend/model/jobs/jobs/FileJob.ts +++ b/src/backend/model/jobs/jobs/FileJob.ts @@ -28,6 +28,7 @@ export abstract class FileJob> { + settings.noMetadata = true; + return this.scanDirectory(relativeDirectoryName, settings); + } + public static async scanDirectory(relativeDirectoryName: string, settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise { @@ -103,6 +109,11 @@ export class DiskMangerWorker { media: [], metaFile: [] }; + + // nothing to scan, we are here for the empty dir + if (settings.noPhoto === true && settings.noMetadata === true && settings.noVideo === true) { + return directory; + } const list = await fsp.readdir(absoluteDirectoryName); for (let i = 0; i < list.length; i++) { const file = list[i]; @@ -119,12 +130,15 @@ export class DiskMangerWorker { maxPhotos: Config.Server.Indexing.folderPreviewSize, noMetaFile: true, noVideo: true, - noDirectory: true + noDirectory: true, + noPhoto: settings.noChildDirPhotos || settings.noPhoto } ); + d.lastScanned = 0; // it was not a fully scan d.isPartial = true; directory.directories.push(d); + } else if (PhotoProcessing.isPhoto(fullFilePath)) { if (settings.noPhoto === true) { continue; @@ -132,9 +146,10 @@ export class DiskMangerWorker { directory.media.push({ name: file, directory: null, - metadata: await MetadataLoader.loadPhotoMetadata(fullFilePath) + metadata: settings.noMetadata === true ? null : await MetadataLoader.loadPhotoMetadata(fullFilePath) }); + if (settings.maxPhotos && directory.media.length > settings.maxPhotos) { break; } @@ -146,7 +161,7 @@ export class DiskMangerWorker { directory.media.push({ name: file, directory: null, - metadata: await MetadataLoader.loadVideoMetadata(fullFilePath) + metadata: settings.noMetadata === true ? null : await MetadataLoader.loadVideoMetadata(fullFilePath) }); } catch (e) { Logger.warn('Media loading error, skipping: ' + file + ', reason: ' + e.toString()); @@ -185,5 +200,7 @@ export namespace DiskMangerWorker { noVideo?: boolean; noPhoto?: boolean; noDirectory?: boolean; + noMetadata?: boolean; + noChildDirPhotos?: boolean; } } diff --git a/src/common/entities/DirectoryDTO.ts b/src/common/entities/DirectoryDTO.ts index d69e7d49..af4246de 100644 --- a/src/common/entities/DirectoryDTO.ts +++ b/src/common/entities/DirectoryDTO.ts @@ -1,17 +1,17 @@ import {MediaDTO} from './MediaDTO'; import {FileDTO} from './FileDTO'; -export interface DirectoryDTO { +export interface DirectoryDTO { id: number; name: string; path: string; lastModified: number; lastScanned: number; isPartial?: boolean; - parent: DirectoryDTO; + parent: DirectoryDTO; mediaCount: number; - directories: DirectoryDTO[]; - media: MediaDTO[]; + directories: DirectoryDTO[]; + media: S[]; metaFile: FileDTO[]; }