1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2025-01-14 14:43:17 +08:00

improving fileJob directory scanning

This commit is contained in:
Patrik J. Braun 2019-12-31 11:12:59 +01:00
parent 8b5785679d
commit 5a0222024b
4 changed files with 34 additions and 8 deletions

View File

@ -3,6 +3,7 @@ import {Logger} from '../Logger';
import {Config} from '../../common/config/private/Config'; import {Config} from '../../common/config/private/Config';
import {DiskManagerTH} from './threading/ThreadPool'; import {DiskManagerTH} from './threading/ThreadPool';
import {DiskMangerWorker} from './threading/DiskMangerWorker'; import {DiskMangerWorker} from './threading/DiskMangerWorker';
import {FileDTO} from '../../common/entities/FileDTO';
const LOG_TAG = '[DiskManager]'; const LOG_TAG = '[DiskManager]';
@ -16,6 +17,13 @@ export class DiskManager {
} }
} }
public static async scanDirectoryNoMetadata(relativeDirectoryName: string,
settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise<DirectoryDTO<FileDTO>> {
settings.noMetadata = true;
return this.scanDirectory(relativeDirectoryName, settings);
}
public static async scanDirectory(relativeDirectoryName: string, public static async scanDirectory(relativeDirectoryName: string,
settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise<DirectoryDTO> { settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise<DirectoryDTO> {

View File

@ -28,6 +28,7 @@ export abstract class FileJob<S extends { indexedOnly: boolean } = { indexedOnly
protected constructor(private scanFilter: DiskMangerWorker.DirectoryScanSettings) { protected constructor(private scanFilter: DiskMangerWorker.DirectoryScanSettings) {
super(); super();
this.scanFilter.noChildDirPhotos = true;
if (Config.Server.Database.type !== ServerConfig.DatabaseType.memory) { if (Config.Server.Database.type !== ServerConfig.DatabaseType.memory) {
this.ConfigTemplate.push({ this.ConfigTemplate.push({
id: 'indexedOnly', id: 'indexedOnly',
@ -96,7 +97,7 @@ export abstract class FileJob<S extends { indexedOnly: boolean } = { indexedOnly
private async loadADirectoryFromDisk() { private async loadADirectoryFromDisk() {
const directory = this.directoryQueue.shift(); const directory = this.directoryQueue.shift();
this.Progress.log('scanning directory: ' + directory); this.Progress.log('scanning directory: ' + directory);
const scanned = await DiskManager.scanDirectory(directory, this.scanFilter); const scanned = await DiskManager.scanDirectoryNoMetadata(directory, this.scanFilter);
for (let i = 0; i < scanned.directories.length; i++) { for (let i = 0; i < scanned.directories.length; i++) {
this.directoryQueue.push(path.join(scanned.directories[i].path, scanned.directories[i].name)); this.directoryQueue.push(path.join(scanned.directories[i].path, scanned.directories[i].name));
} }

View File

@ -81,6 +81,12 @@ export class DiskMangerWorker {
return false; return false;
} }
public static async scanDirectoryNoMetadata(relativeDirectoryName: string,
settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise<DirectoryDTO<FileDTO>> {
settings.noMetadata = true;
return this.scanDirectory(relativeDirectoryName, settings);
}
public static async scanDirectory(relativeDirectoryName: string, public static async scanDirectory(relativeDirectoryName: string,
settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise<DirectoryDTO> { settings: DiskMangerWorker.DirectoryScanSettings = {}): Promise<DirectoryDTO> {
@ -103,6 +109,11 @@ export class DiskMangerWorker {
media: [], media: [],
metaFile: [] 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); const list = await fsp.readdir(absoluteDirectoryName);
for (let i = 0; i < list.length; i++) { for (let i = 0; i < list.length; i++) {
const file = list[i]; const file = list[i];
@ -119,12 +130,15 @@ export class DiskMangerWorker {
maxPhotos: Config.Server.Indexing.folderPreviewSize, maxPhotos: Config.Server.Indexing.folderPreviewSize,
noMetaFile: true, noMetaFile: true,
noVideo: true, noVideo: true,
noDirectory: true noDirectory: true,
noPhoto: settings.noChildDirPhotos || settings.noPhoto
} }
); );
d.lastScanned = 0; // it was not a fully scan d.lastScanned = 0; // it was not a fully scan
d.isPartial = true; d.isPartial = true;
directory.directories.push(d); directory.directories.push(d);
} else if (PhotoProcessing.isPhoto(fullFilePath)) { } else if (PhotoProcessing.isPhoto(fullFilePath)) {
if (settings.noPhoto === true) { if (settings.noPhoto === true) {
continue; continue;
@ -132,9 +146,10 @@ export class DiskMangerWorker {
directory.media.push(<PhotoDTO>{ directory.media.push(<PhotoDTO>{
name: file, name: file,
directory: null, directory: null,
metadata: await MetadataLoader.loadPhotoMetadata(fullFilePath) metadata: settings.noMetadata === true ? null : await MetadataLoader.loadPhotoMetadata(fullFilePath)
}); });
if (settings.maxPhotos && directory.media.length > settings.maxPhotos) { if (settings.maxPhotos && directory.media.length > settings.maxPhotos) {
break; break;
} }
@ -146,7 +161,7 @@ export class DiskMangerWorker {
directory.media.push(<VideoDTO>{ directory.media.push(<VideoDTO>{
name: file, name: file,
directory: null, directory: null,
metadata: await MetadataLoader.loadVideoMetadata(fullFilePath) metadata: settings.noMetadata === true ? null : await MetadataLoader.loadVideoMetadata(fullFilePath)
}); });
} catch (e) { } catch (e) {
Logger.warn('Media loading error, skipping: ' + file + ', reason: ' + e.toString()); Logger.warn('Media loading error, skipping: ' + file + ', reason: ' + e.toString());
@ -185,5 +200,7 @@ export namespace DiskMangerWorker {
noVideo?: boolean; noVideo?: boolean;
noPhoto?: boolean; noPhoto?: boolean;
noDirectory?: boolean; noDirectory?: boolean;
noMetadata?: boolean;
noChildDirPhotos?: boolean;
} }
} }

View File

@ -1,17 +1,17 @@
import {MediaDTO} from './MediaDTO'; import {MediaDTO} from './MediaDTO';
import {FileDTO} from './FileDTO'; import {FileDTO} from './FileDTO';
export interface DirectoryDTO { export interface DirectoryDTO<S extends FileDTO = MediaDTO> {
id: number; id: number;
name: string; name: string;
path: string; path: string;
lastModified: number; lastModified: number;
lastScanned: number; lastScanned: number;
isPartial?: boolean; isPartial?: boolean;
parent: DirectoryDTO; parent: DirectoryDTO<S>;
mediaCount: number; mediaCount: number;
directories: DirectoryDTO[]; directories: DirectoryDTO<S>[];
media: MediaDTO[]; media: S[];
metaFile: FileDTO[]; metaFile: FileDTO[];
} }