mirror of
https://github.com/xuthus83/pigallery2.git
synced 2025-01-14 14:43:17 +08:00
Implement youngest and oldest photo date for directories
This commit is contained in:
parent
7ec6725c59
commit
8c083ed59b
@ -208,6 +208,8 @@ export class IndexingManager {
|
|||||||
currentDir.lastModified = scannedDirectory.lastModified;
|
currentDir.lastModified = scannedDirectory.lastModified;
|
||||||
currentDir.lastScanned = scannedDirectory.lastScanned;
|
currentDir.lastScanned = scannedDirectory.lastScanned;
|
||||||
currentDir.mediaCount = scannedDirectory.mediaCount;
|
currentDir.mediaCount = scannedDirectory.mediaCount;
|
||||||
|
currentDir.youngestMedia = scannedDirectory.youngestMedia;
|
||||||
|
currentDir.oldestMedia = scannedDirectory.oldestMedia;
|
||||||
await directoryRepository.save(currentDir);
|
await directoryRepository.save(currentDir);
|
||||||
return currentDir.id;
|
return currentDir.id;
|
||||||
} else {
|
} else {
|
||||||
@ -216,6 +218,8 @@ export class IndexingManager {
|
|||||||
mediaCount: scannedDirectory.mediaCount,
|
mediaCount: scannedDirectory.mediaCount,
|
||||||
lastModified: scannedDirectory.lastModified,
|
lastModified: scannedDirectory.lastModified,
|
||||||
lastScanned: scannedDirectory.lastScanned,
|
lastScanned: scannedDirectory.lastScanned,
|
||||||
|
youngestMedia: scannedDirectory.youngestMedia,
|
||||||
|
oldestMedia: scannedDirectory.oldestMedia,
|
||||||
name: scannedDirectory.name,
|
name: scannedDirectory.name,
|
||||||
path: scannedDirectory.path,
|
path: scannedDirectory.path,
|
||||||
} as DirectoryEntity)
|
} as DirectoryEntity)
|
||||||
|
@ -64,6 +64,24 @@ export class DirectoryEntity
|
|||||||
@Column('mediumint', { unsigned: true })
|
@Column('mediumint', { unsigned: true })
|
||||||
mediaCount: number;
|
mediaCount: number;
|
||||||
|
|
||||||
|
@Column('bigint', {
|
||||||
|
nullable: true,
|
||||||
|
transformer: {
|
||||||
|
from: (v) => parseInt(v, 10),
|
||||||
|
to: (v) => v,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
oldestMedia: number;
|
||||||
|
|
||||||
|
@Column('bigint', {
|
||||||
|
nullable: true,
|
||||||
|
transformer: {
|
||||||
|
from: (v) => parseInt(v, 10),
|
||||||
|
to: (v) => v,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
youngestMedia: number;
|
||||||
|
|
||||||
@Index()
|
@Index()
|
||||||
@ManyToOne((type) => DirectoryEntity, (directory) => directory.directories, {
|
@ManyToOne((type) => DirectoryEntity, (directory) => directory.directories, {
|
||||||
onDelete: 'CASCADE',
|
onDelete: 'CASCADE',
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
import {promises as fsp, Stats} from 'fs';
|
import {promises as fsp, Stats} from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import {
|
import {ParentDirectoryDTO, SubDirectoryDTO,} from '../../../common/entities/DirectoryDTO';
|
||||||
ParentDirectoryDTO,
|
|
||||||
SubDirectoryDTO,
|
|
||||||
} from '../../../common/entities/DirectoryDTO';
|
|
||||||
import {PhotoDTO} from '../../../common/entities/PhotoDTO';
|
import {PhotoDTO} from '../../../common/entities/PhotoDTO';
|
||||||
import {ProjectPath} from '../../ProjectPath';
|
import {ProjectPath} from '../../ProjectPath';
|
||||||
import {Config} from '../../../common/config/private/Config';
|
import {Config} from '../../../common/config/private/Config';
|
||||||
@ -120,15 +117,17 @@ export class DiskMangerWorker {
|
|||||||
name: directoryName,
|
name: directoryName,
|
||||||
path: directoryParent,
|
path: directoryParent,
|
||||||
lastModified: this.calcLastModified(stat),
|
lastModified: this.calcLastModified(stat),
|
||||||
lastScanned: Date.now(),
|
|
||||||
directories: [],
|
directories: [],
|
||||||
isPartial: false,
|
isPartial: settings.coverOnly === true,
|
||||||
mediaCount: 0,
|
mediaCount: 0,
|
||||||
cover: null,
|
cover: null,
|
||||||
validCover: false,
|
validCover: false,
|
||||||
media: [],
|
media: [],
|
||||||
metaFile: [],
|
metaFile: [],
|
||||||
};
|
};
|
||||||
|
if (!settings.coverOnly) {
|
||||||
|
directory.lastScanned = Date.now();
|
||||||
|
}
|
||||||
|
|
||||||
// nothing to scan, we are here for the empty dir
|
// nothing to scan, we are here for the empty dir
|
||||||
if (
|
if (
|
||||||
@ -164,9 +163,6 @@ export class DiskMangerWorker {
|
|||||||
}
|
}
|
||||||
)) as SubDirectoryDTO;
|
)) as SubDirectoryDTO;
|
||||||
|
|
||||||
d.lastScanned = 0; // it was not a fully scanned
|
|
||||||
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) {
|
||||||
@ -239,6 +235,16 @@ export class DiskMangerWorker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
directory.mediaCount = directory.media.length;
|
directory.mediaCount = directory.media.length;
|
||||||
|
if (!directory.isPartial) {
|
||||||
|
directory.youngestMedia = Number.MAX_SAFE_INTEGER;
|
||||||
|
directory.oldestMedia = Number.MIN_SAFE_INTEGER;
|
||||||
|
|
||||||
|
directory.media.forEach((m) => {
|
||||||
|
directory.youngestMedia = Math.min(m.metadata.creationDate, directory.youngestMedia);
|
||||||
|
directory.oldestMedia = Math.max(m.metadata.creationDate, directory.oldestMedia);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return directory;
|
return directory;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/**
|
/**
|
||||||
* This version indicates that the sql/entities/*Entity.ts files got changed and the db needs to be recreated
|
* This version indicates that the sql/entities/*Entity.ts files got changed and the db needs to be recreated
|
||||||
*/
|
*/
|
||||||
export const DataStructureVersion = 32;
|
export const DataStructureVersion = 33;
|
||||||
|
@ -16,11 +16,12 @@ export interface DirectoryBaseDTO<S extends FileDTO = MediaDTO>
|
|||||||
name: string;
|
name: string;
|
||||||
path: string;
|
path: string;
|
||||||
lastModified: number;
|
lastModified: number;
|
||||||
lastScanned: number;
|
lastScanned?: number;
|
||||||
isPartial?: boolean;
|
isPartial?: boolean;
|
||||||
parent: DirectoryBaseDTO<S>;
|
parent: DirectoryBaseDTO<S>;
|
||||||
mediaCount: number;
|
mediaCount: number;
|
||||||
|
youngestMedia?: number;
|
||||||
|
oldestMedia?: number;
|
||||||
directories?: DirectoryBaseDTO<S>[];
|
directories?: DirectoryBaseDTO<S>[];
|
||||||
media?: S[];
|
media?: S[];
|
||||||
metaFile?: FileDTO[];
|
metaFile?: FileDTO[];
|
||||||
@ -34,10 +35,12 @@ export interface ParentDirectoryDTO<S extends FileDTO = MediaDTO>
|
|||||||
name: string;
|
name: string;
|
||||||
path: string;
|
path: string;
|
||||||
lastModified: number;
|
lastModified: number;
|
||||||
lastScanned: number;
|
lastScanned?: number;
|
||||||
isPartial?: boolean;
|
isPartial?: boolean;
|
||||||
parent: ParentDirectoryDTO<S>;
|
parent: ParentDirectoryDTO<S>;
|
||||||
mediaCount: number;
|
mediaCount: number;
|
||||||
|
youngestMedia?: number;
|
||||||
|
oldestMedia?: number;
|
||||||
directories: SubDirectoryDTO<S>[];
|
directories: SubDirectoryDTO<S>[];
|
||||||
media: S[];
|
media: S[];
|
||||||
metaFile: FileDTO[];
|
metaFile: FileDTO[];
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { DirectoryPathDTO } from './DirectoryDTO';
|
import {DirectoryPathDTO} from './DirectoryDTO';
|
||||||
|
|
||||||
export interface FileDTO {
|
export interface FileDTO {
|
||||||
id: number;
|
id: number;
|
||||||
|
@ -10,12 +10,12 @@ import {VideoEntity, VideoMetadataEntity} from '../src/backend/model/database/en
|
|||||||
import {MediaDimension, MediaDTO} from '../src/common/entities/MediaDTO';
|
import {MediaDimension, MediaDTO} from '../src/common/entities/MediaDTO';
|
||||||
import {
|
import {
|
||||||
CameraMetadata,
|
CameraMetadata,
|
||||||
|
CoverPhotoDTO,
|
||||||
FaceRegion,
|
FaceRegion,
|
||||||
GPSMetadata,
|
GPSMetadata,
|
||||||
PhotoDTO,
|
PhotoDTO,
|
||||||
PhotoMetadata,
|
PhotoMetadata,
|
||||||
PositionMetaData,
|
PositionMetaData
|
||||||
CoverPhotoDTO
|
|
||||||
} from '../src/common/entities/PhotoDTO';
|
} from '../src/common/entities/PhotoDTO';
|
||||||
import {DirectoryBaseDTO, DirectoryPathDTO} from '../src/common/entities/DirectoryDTO';
|
import {DirectoryBaseDTO, DirectoryPathDTO} from '../src/common/entities/DirectoryDTO';
|
||||||
import {FileDTO} from '../src/common/entities/FileDTO';
|
import {FileDTO} from '../src/common/entities/FileDTO';
|
||||||
@ -31,6 +31,8 @@ export class TestHelper {
|
|||||||
dir.name = name;
|
dir.name = name;
|
||||||
dir.path = DiskMangerWorker.pathFromParent({path: '', name: '.'});
|
dir.path = DiskMangerWorker.pathFromParent({path: '', name: '.'});
|
||||||
dir.mediaCount = 0;
|
dir.mediaCount = 0;
|
||||||
|
dir.youngestMedia = 10;
|
||||||
|
dir.oldestMedia = 1000;
|
||||||
dir.directories = [];
|
dir.directories = [];
|
||||||
dir.metaFile = [];
|
dir.metaFile = [];
|
||||||
dir.media = [];
|
dir.media = [];
|
||||||
@ -272,6 +274,8 @@ export class TestHelper {
|
|||||||
name: DiskMangerWorker.dirName(forceStr || Math.random().toString(36).substring(7)),
|
name: DiskMangerWorker.dirName(forceStr || Math.random().toString(36).substring(7)),
|
||||||
path: DiskMangerWorker.pathFromParent({path: '', name: '.'}),
|
path: DiskMangerWorker.pathFromParent({path: '', name: '.'}),
|
||||||
mediaCount: 0,
|
mediaCount: 0,
|
||||||
|
youngestMedia: 10,
|
||||||
|
oldestMedia: 1000,
|
||||||
directories: [],
|
directories: [],
|
||||||
metaFile: [],
|
metaFile: [],
|
||||||
cover: null,
|
cover: null,
|
||||||
|
@ -147,6 +147,8 @@ describe('CoverManager', (sqlHelper: DBTestHelper) => {
|
|||||||
delete (ret.directory as DirectoryBaseDTO).lastScanned;
|
delete (ret.directory as DirectoryBaseDTO).lastScanned;
|
||||||
delete (ret.directory as DirectoryBaseDTO).lastModified;
|
delete (ret.directory as DirectoryBaseDTO).lastModified;
|
||||||
delete (ret.directory as DirectoryBaseDTO).mediaCount;
|
delete (ret.directory as DirectoryBaseDTO).mediaCount;
|
||||||
|
delete (ret.directory as DirectoryBaseDTO).youngestMedia;
|
||||||
|
delete (ret.directory as DirectoryBaseDTO).oldestMedia;
|
||||||
delete (ret as PhotoDTO).metadata;
|
delete (ret as PhotoDTO).metadata;
|
||||||
tmpDir.directories = tmpD;
|
tmpDir.directories = tmpD;
|
||||||
tmpDir.media = tmpM;
|
tmpDir.media = tmpM;
|
||||||
|
@ -229,6 +229,8 @@ describe('SearchManager', (sqlHelper: DBTestHelper) => {
|
|||||||
delete (ret.directory as DirectoryBaseDTO).lastScanned;
|
delete (ret.directory as DirectoryBaseDTO).lastScanned;
|
||||||
delete (ret.directory as DirectoryBaseDTO).lastModified;
|
delete (ret.directory as DirectoryBaseDTO).lastModified;
|
||||||
delete (ret.directory as DirectoryBaseDTO).mediaCount;
|
delete (ret.directory as DirectoryBaseDTO).mediaCount;
|
||||||
|
delete (ret.directory as DirectoryBaseDTO).youngestMedia;
|
||||||
|
delete (ret.directory as DirectoryBaseDTO).oldestMedia;
|
||||||
if ((ret as PhotoDTO).metadata &&
|
if ((ret as PhotoDTO).metadata &&
|
||||||
((ret as PhotoDTO).metadata as PhotoMetadata).faces && !((ret as PhotoDTO).metadata as PhotoMetadata).faces.length) {
|
((ret as PhotoDTO).metadata as PhotoMetadata).faces && !((ret as PhotoDTO).metadata as PhotoMetadata).faces.length) {
|
||||||
delete ((ret as PhotoDTO).metadata as PhotoMetadata).faces;
|
delete ((ret as PhotoDTO).metadata as PhotoMetadata).faces;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user