diff --git a/backend/middlewares/AdminMWs.ts b/backend/middlewares/AdminMWs.ts index 11e1ee78..8dc6c46a 100644 --- a/backend/middlewares/AdminMWs.ts +++ b/backend/middlewares/AdminMWs.ts @@ -11,6 +11,7 @@ import {BasicConfigDTO} from '../../common/entities/settings/BasicConfigDTO'; import {OtherConfigDTO} from '../../common/entities/settings/OtherConfigDTO'; import {ProjectPath} from '../ProjectPath'; import {PrivateConfigClass} from '../../common/config/private/PrivateConfigClass'; +import {IndexingDTO} from '../../common/entities/settings/IndexingDTO'; const LOG_TAG = '[AdminMWs]'; @@ -317,7 +318,8 @@ export class AdminMWs { public static startIndexing(req: Request, res: Response, next: NextFunction) { try { - ObjectManagerRepository.getInstance().IndexingManager.startIndexing(); + const createThumbnails: boolean = (req.body).createThumbnails || false; + ObjectManagerRepository.getInstance().IndexingManager.startIndexing(createThumbnails); req.resultPipe = 'ok'; return next(); } catch (err) { @@ -325,6 +327,7 @@ export class AdminMWs { } } + public static getIndexingProgress(req: Request, res: Response, next: NextFunction) { try { req.resultPipe = ObjectManagerRepository.getInstance().IndexingManager.getProgress(); diff --git a/backend/middlewares/thumbnail/ThumbnailGeneratorMWs.ts b/backend/middlewares/thumbnail/ThumbnailGeneratorMWs.ts index fc7443d1..98feee01 100644 --- a/backend/middlewares/thumbnail/ThumbnailGeneratorMWs.ts +++ b/backend/middlewares/thumbnail/ThumbnailGeneratorMWs.ts @@ -179,7 +179,7 @@ export class ThumbnailGeneratorMWs { } } - private static generateThumbnailName(mediaPath: string, size: number): string { + public static generateThumbnailName(mediaPath: string, size: number): string { return crypto.createHash('md5').update(mediaPath).digest('hex') + '_' + size + '.jpg'; } } diff --git a/backend/model/interfaces/IIndexingManager.ts b/backend/model/interfaces/IIndexingManager.ts index d9ee5c9d..c741e9a5 100644 --- a/backend/model/interfaces/IIndexingManager.ts +++ b/backend/model/interfaces/IIndexingManager.ts @@ -1,7 +1,7 @@ import {IndexingProgressDTO} from '../../../common/entities/settings/IndexingProgressDTO'; export interface IIndexingManager { - startIndexing(): void; + startIndexing(createThumbnails?: boolean): void; getProgress(): IndexingProgressDTO; diff --git a/backend/model/sql/IndexingManager.ts b/backend/model/sql/IndexingManager.ts index 2f306c43..e335db6a 100644 --- a/backend/model/sql/IndexingManager.ts +++ b/backend/model/sql/IndexingManager.ts @@ -6,6 +6,11 @@ import * as path from 'path'; import {SQLConnection} from './SQLConnection'; import {DirectoryEntity} from './enitites/DirectoryEntity'; import {Logger} from '../../Logger'; +import {RendererInput, ThumbnailSourceType, ThumbnailWorker} from '../threading/ThumbnailWorker'; +import {Config} from '../../../common/config/private/Config'; +import {MediaDTO} from '../../../common/entities/MediaDTO'; +import {ProjectPath} from '../../ProjectPath'; +import {ThumbnailGeneratorMWs} from '../../middlewares/thumbnail/ThumbnailGeneratorMWs'; const LOG_TAG = '[IndexingManager]'; @@ -13,7 +18,7 @@ export class IndexingManager implements IIndexingManager { directoriesToIndex: string[] = []; indexingProgress = null; enabled = false; - private indexNewDirectory = async () => { + private indexNewDirectory = async (createThumbnails: boolean = false) => { if (this.directoriesToIndex.length === 0) { this.indexingProgress = null; if (global.gc) { @@ -32,10 +37,29 @@ export class IndexingManager implements IIndexingManager { for (let i = 0; i < scanned.directories.length; i++) { this.directoriesToIndex.push(path.join(scanned.directories[i].path, scanned.directories[i].name)); } - process.nextTick(this.indexNewDirectory); + if (createThumbnails) { + for (let i = 0; i < scanned.media.length; i++) { + const media = scanned.media[i]; + const mPath = path.join(ProjectPath.ImageFolder, media.directory.path, media.directory.name, media.name); + const thPath = path.join(ProjectPath.ThumbnailFolder, + ThumbnailGeneratorMWs.generateThumbnailName(mPath, Config.Client.Thumbnail.thumbnailSizes[0])); + await ThumbnailWorker.render({ + type: MediaDTO.isVideo(media) ? ThumbnailSourceType.Video : ThumbnailSourceType.Image, + mediaPath: mPath, + size: Config.Client.Thumbnail.thumbnailSizes[0], + thPath: thPath, + makeSquare: false, + qualityPriority: Config.Server.thumbnail.qualityPriority + }, Config.Server.thumbnail.processingLibrary); + } + + } + process.nextTick(() => { + this.indexNewDirectory(createThumbnails); + }); }; - startIndexing(): void { + startIndexing(createThumbnails: boolean = false): void { if (this.directoriesToIndex.length === 0 && this.enabled === false) { Logger.info(LOG_TAG, 'Starting indexing'); this.indexingProgress = { @@ -45,7 +69,7 @@ export class IndexingManager implements IIndexingManager { }; this.directoriesToIndex.push('/'); this.enabled = true; - this.indexNewDirectory(); + this.indexNewDirectory(createThumbnails); } else { Logger.info(LOG_TAG, 'Already indexing..'); } diff --git a/backend/routes/AdminRouter.ts b/backend/routes/AdminRouter.ts index 44cccf20..a6359990 100644 --- a/backend/routes/AdminRouter.ts +++ b/backend/routes/AdminRouter.ts @@ -18,7 +18,7 @@ export class AdminRouter { AdminMWs.getIndexingProgress, RenderingMWs.renderResult ); - app.put('/api/admin/indexes/job', + app.post('/api/admin/indexes/job', AuthenticationMWs.authenticate, AuthenticationMWs.authorise(UserRoles.Admin), AdminMWs.startIndexing, diff --git a/common/entities/settings/IndexingDTO.ts b/common/entities/settings/IndexingDTO.ts new file mode 100644 index 00000000..83af2bd1 --- /dev/null +++ b/common/entities/settings/IndexingDTO.ts @@ -0,0 +1,3 @@ +export interface IndexingDTO { + createThumbnails: boolean; +} diff --git a/frontend/app/settings/indexing/indexing.settings.component.html b/frontend/app/settings/indexing/indexing.settings.component.html index a169dd6c..e6641df8 100644 --- a/frontend/app/settings/indexing/indexing.settings.component.html +++ b/frontend/app/settings/indexing/indexing.settings.component.html @@ -88,17 +88,22 @@ + title="Indexes the folders" + i18n-title + (click)="index(false)" i18n>Index + + (click)="cancelIndexing()" i18n>Cancel + (click)="resetDatabase()" i18n>Reset Indexes diff --git a/frontend/app/settings/indexing/indexing.settings.component.ts b/frontend/app/settings/indexing/indexing.settings.component.ts index 447c2f48..af7b3d6b 100644 --- a/frontend/app/settings/indexing/indexing.settings.component.ts +++ b/frontend/app/settings/indexing/indexing.settings.component.ts @@ -96,11 +96,11 @@ export class IndexingSettingsComponent extends SettingsComponent { @@ -27,8 +28,8 @@ export class IndexingSettingsService extends AbstractSettingsService{createThumbnails: createThumbnails}); } public cancel() { diff --git a/frontend/translate/messages.en.xlf b/frontend/translate/messages.en.xlf index 2a2d0f15..5b0fdba6 100644 --- a/frontend/translate/messages.en.xlf +++ b/frontend/translate/messages.en.xlf @@ -1304,30 +1304,51 @@ Note: search only works among the indexed directories - - Index - + + Index + + app/settings/indexing/indexing.settings.component.html + 93 + + Index + + + Indexes the folders app/settings/indexing/indexing.settings.component.html 91 - Index + Indexes the folders - - Cancel - + + Index with Thumbnails app/settings/indexing/indexing.settings.component.html - 96 + 99 + + Index with Thumbnails + + + Indexes the folders and also creates the thumbnails + + app/settings/indexing/indexing.settings.component.html + 95 + + Indexes the folders and also creates the thumbnails + + + Cancel + + app/settings/indexing/indexing.settings.component.html + 103 Cancel - - Reset Indexes - + + Reset Indexes app/settings/indexing/indexing.settings.component.html - 100 + 106 Reset Indexes diff --git a/frontend/translate/messages.hu.xlf b/frontend/translate/messages.hu.xlf index b9964082..8d721058 100644 --- a/frontend/translate/messages.hu.xlf +++ b/frontend/translate/messages.hu.xlf @@ -1304,30 +1304,51 @@ Megjegyzés: csak az indexelt könyvtárak között működik a keresés - - Index - + + Index + + app/settings/indexing/indexing.settings.component.html + 93 + + Index + + + Indexes the folders app/settings/indexing/indexing.settings.component.html 91 - Index + Indexeli a mappákat - - Cancel - + + Index with Thumbnails app/settings/indexing/indexing.settings.component.html - 96 + 99 + + Index thumbnail-el + + + Indexes the folders and also creates the thumbnails + + app/settings/indexing/indexing.settings.component.html + 95 + + Indexeli a mappákat és legenerálja a thumbnaileket is + + + Cancel + + app/settings/indexing/indexing.settings.component.html + 103 Mégse - - Reset Indexes - + + Reset Indexes app/settings/indexing/indexing.settings.component.html - 100 + 106 Indexek visszaállítása