diff --git a/backend/model/memory/GalleryManager.ts b/backend/model/memory/GalleryManager.ts index 19ac258a..3759addd 100644 --- a/backend/model/memory/GalleryManager.ts +++ b/backend/model/memory/GalleryManager.ts @@ -7,6 +7,7 @@ import {ProjectPath} from '../../ProjectPath'; import {Config} from '../../../common/config/private/Config'; import {ReIndexingSensitivity} from '../../../common/config/private/IPrivateConfig'; import {PhotoDTO} from '../../../common/entities/PhotoDTO'; +import {DiskMangerWorker} from '../threading/DiskMangerWorker'; export class GalleryManager implements IGalleryManager { @@ -14,7 +15,7 @@ export class GalleryManager implements IGalleryManager { // If it seems that the content did not changed, do not work on it if (knownLastModified && knownLastScanned) { const stat = fs.statSync(path.join(ProjectPath.ImageFolder, relativeDirectoryName)); - const lastModified = Math.max(stat.ctime.getTime(), stat.mtime.getTime()); + const lastModified = DiskMangerWorker.calcLastModified(stat); if (Date.now() - knownLastScanned <= Config.Server.indexing.cachedFolderTimeout && lastModified === knownLastModified && Config.Server.indexing.reIndexingSensitivity < ReIndexingSensitivity.high) { diff --git a/backend/model/sql/GalleryManager.ts b/backend/model/sql/GalleryManager.ts index 7096da90..752eb13d 100644 --- a/backend/model/sql/GalleryManager.ts +++ b/backend/model/sql/GalleryManager.ts @@ -20,6 +20,10 @@ import {VideoEntity} from './enitites/VideoEntity'; import {FileEntity} from './enitites/FileEntity'; import {FileDTO} from '../../../common/entities/FileDTO'; import {NotificationManager} from '../NotifocationManager'; +import {DiskMangerWorker} from '../threading/DiskMangerWorker'; +import {Logger} from '../../Logger'; + +const LOG_TAG = '[GalleryManager]'; export class GalleryManager implements IGalleryManager, ISQLGalleryManager { @@ -79,12 +83,12 @@ export class GalleryManager implements IGalleryManager, ISQLGalleryManager { knownLastModified?: number, knownLastScanned?: number): Promise { - relativeDirectoryName = path.normalize(path.join('.' + path.sep, relativeDirectoryName)); + relativeDirectoryName = DiskMangerWorker.normalizeDirPath(relativeDirectoryName); const directoryName = path.basename(relativeDirectoryName); const directoryParent = path.join(path.dirname(relativeDirectoryName), path.sep); const connection = await SQLConnection.getConnection(); const stat = fs.statSync(path.join(ProjectPath.ImageFolder, relativeDirectoryName)); - const lastModified = Math.max(stat.ctime.getTime(), stat.mtime.getTime()); + const lastModified = DiskMangerWorker.calcLastModified(stat); const dir = await this.selectParentDir(connection, directoryName, directoryParent); @@ -104,6 +108,8 @@ export class GalleryManager implements IGalleryManager, ISQLGalleryManager { if (dir.lastModified !== lastModified) { + Logger.silly(LOG_TAG, 'Reindexing reason: lastModified mismatch: known: ' + + dir.lastModified + ', current:' + lastModified); return this.indexDirectory(relativeDirectoryName); } @@ -114,6 +120,8 @@ export class GalleryManager implements IGalleryManager, ISQLGalleryManager { Config.Server.indexing.reIndexingSensitivity >= ReIndexingSensitivity.high) { // on the fly reindexing + Logger.silly(LOG_TAG, 'lazy reindexing reason: cache timeout: lastScanned: ' + + (Date.now() - dir.lastScanned) + ', cachedFolderTimeout:' + Config.Server.indexing.cachedFolderTimeout); this.indexDirectory(relativeDirectoryName).catch((err) => { console.error(err); }); @@ -123,6 +131,7 @@ export class GalleryManager implements IGalleryManager, ISQLGalleryManager { } // never scanned (deep indexed), do it and return with it + Logger.silly(LOG_TAG, 'Reindexing reason: never scanned'); return this.indexDirectory(relativeDirectoryName); @@ -244,9 +253,9 @@ export class GalleryManager implements IGalleryManager, ISQLGalleryManager { if (!!currentDir) {// Updated parent dir (if it was in the DB previously) currentDir.lastModified = scannedDirectory.lastModified; currentDir.lastScanned = scannedDirectory.lastScanned; + currentDir.mediaCount = scannedDirectory.mediaCount; currentDir = await directoryRepository.save(currentDir); } else { - (scannedDirectory).lastScanned = scannedDirectory.lastScanned; currentDir = await directoryRepository.save(scannedDirectory); } diff --git a/backend/model/sql/IndexingManager.ts b/backend/model/sql/IndexingManager.ts index 53ab58b8..21fb483d 100644 --- a/backend/model/sql/IndexingManager.ts +++ b/backend/model/sql/IndexingManager.ts @@ -17,7 +17,7 @@ const LOG_TAG = '[IndexingManager]'; export class IndexingManager implements IIndexingManager { directoriesToIndex: string[] = []; - indexingProgress: { current: string, left: number, indexed: number } = null; + indexingProgress: IndexingProgressDTO = null; enabled = false; private indexNewDirectory = async (createThumbnails: boolean = false) => { if (this.directoriesToIndex.length === 0) { @@ -35,6 +35,7 @@ export class IndexingManager implements IIndexingManager { return; } this.indexingProgress.indexed++; + this.indexingProgress.time.current = Date.now(); for (let i = 0; i < scanned.directories.length; i++) { this.directoriesToIndex.push(path.join(scanned.directories[i].path, scanned.directories[i].name)); } @@ -71,10 +72,14 @@ export class IndexingManager implements IIndexingManager { startIndexing(createThumbnails: boolean = false): void { if (this.directoriesToIndex.length === 0 && this.enabled === false) { Logger.info(LOG_TAG, 'Starting indexing'); - this.indexingProgress = { + this.indexingProgress = { indexed: 0, left: 0, - current: '' + current: '', + time: { + start: Date.now(), + current: Date.now() + } }; this.directoriesToIndex.push('/'); this.enabled = true; diff --git a/backend/model/sql/SQLConnection.ts b/backend/model/sql/SQLConnection.ts index 004aef55..0afc79f9 100644 --- a/backend/model/sql/SQLConnection.ts +++ b/backend/model/sql/SQLConnection.ts @@ -40,7 +40,7 @@ export class SQLConnection { VersionEntity ]; options.synchronize = false; - // options.logging = 'all'; + // options.logging = 'all'; this.connection = await createConnection(options); await SQLConnection.schemeSync(this.connection); } diff --git a/backend/model/sql/enitites/DirectoryEntity.ts b/backend/model/sql/enitites/DirectoryEntity.ts index e0a8b801..e43c6338 100644 --- a/backend/model/sql/enitites/DirectoryEntity.ts +++ b/backend/model/sql/enitites/DirectoryEntity.ts @@ -1,4 +1,4 @@ -import {Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn, Unique} from 'typeorm'; +import {Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn, Unique, Index} from 'typeorm'; import {DirectoryDTO} from '../../../../common/entities/DirectoryDTO'; import {MediaEntity} from './MediaEntity'; import {FileEntity} from './FileEntity'; @@ -7,12 +7,15 @@ import {FileEntity} from './FileEntity'; @Unique(['name', 'path']) export class DirectoryEntity implements DirectoryDTO { + @Index() @PrimaryGeneratedColumn() id: number; + @Index() @Column() name: string; + @Index() @Column() path: string; @@ -30,6 +33,10 @@ export class DirectoryEntity implements DirectoryDTO { isPartial?: boolean; + @Column('smallint') + mediaCount: number; + + @Index() @ManyToOne(type => DirectoryEntity, directory => directory.directories, {onDelete: 'CASCADE'}) public parent: DirectoryEntity; @@ -39,7 +46,6 @@ export class DirectoryEntity implements DirectoryDTO { @OneToMany(type => MediaEntity, media => media.directory) public media: MediaEntity[]; - @OneToMany(type => FileEntity, file => file.directory) public metaFile: FileEntity[]; diff --git a/backend/model/sql/enitites/FileEntity.ts b/backend/model/sql/enitites/FileEntity.ts index d23ba933..0d19efd8 100644 --- a/backend/model/sql/enitites/FileEntity.ts +++ b/backend/model/sql/enitites/FileEntity.ts @@ -1,4 +1,4 @@ -import {Column, Entity, ManyToOne, PrimaryGeneratedColumn} from 'typeorm'; +import {Column, Entity, ManyToOne, PrimaryGeneratedColumn, Index} from 'typeorm'; import {DirectoryEntity} from './DirectoryEntity'; import {FileDTO} from '../../../../common/entities/FileDTO'; @@ -6,12 +6,14 @@ import {FileDTO} from '../../../../common/entities/FileDTO'; @Entity() export class FileEntity implements FileDTO { + @Index() @PrimaryGeneratedColumn() id: number; @Column('text') name: string; + @Index() @ManyToOne(type => DirectoryEntity, directory => directory.metaFile, {onDelete: 'CASCADE'}) directory: DirectoryEntity; } diff --git a/backend/model/sql/enitites/MediaEntity.ts b/backend/model/sql/enitites/MediaEntity.ts index 2ba0a9d0..2a1aa00e 100644 --- a/backend/model/sql/enitites/MediaEntity.ts +++ b/backend/model/sql/enitites/MediaEntity.ts @@ -1,10 +1,8 @@ -import {Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance, Unique} from 'typeorm'; +import {Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance, Unique, Index} from 'typeorm'; import {DirectoryEntity} from './DirectoryEntity'; import {MediaDimension, MediaDTO, MediaMetadata} from '../../../../common/entities/MediaDTO'; import {OrientationTypes} from 'ts-exif-parser'; import {CameraMetadataEntity, PositionMetaDataEntity} from './PhotoEntity'; -import {FileEntity} from './FileEntity'; - export class MediaDimensionEntity implements MediaDimension { @@ -55,12 +53,14 @@ export class MediaMetadataEntity implements MediaMetadata { @TableInheritance({column: {type: 'varchar', name: 'type'}}) export abstract class MediaEntity implements MediaDTO { + @Index() @PrimaryGeneratedColumn() id: number; @Column('text') name: string; + @Index() @ManyToOne(type => DirectoryEntity, directory => directory.media, {onDelete: 'CASCADE'}) directory: DirectoryEntity; diff --git a/backend/model/threading/DiskMangerWorker.ts b/backend/model/threading/DiskMangerWorker.ts index 94cc1f0c..22380e7a 100644 --- a/backend/model/threading/DiskMangerWorker.ts +++ b/backend/model/threading/DiskMangerWorker.ts @@ -1,4 +1,5 @@ import * as fs from 'fs'; +import {Stats} from 'fs'; import * as path from 'path'; import {DirectoryDTO} from '../../../common/entities/DirectoryDTO'; import {PhotoDTO} from '../../../common/entities/PhotoDTO'; @@ -49,8 +50,17 @@ export class DiskMangerWorker { return this.SupportedEXT.metaFile.indexOf(extension) !== -1; } + public static calcLastModified(stat: Stats) { + return Math.max(stat.ctime.getTime(), stat.mtime.getTime()); + } + + public static normalizeDirPath(dirPath: string) { + return path.normalize(path.join('.' + path.sep, dirPath)); + } + public static scanDirectory(relativeDirectoryName: string, maxPhotos: number = null, photosOnly: boolean = false): Promise { return new Promise((resolve, reject) => { + relativeDirectoryName = this.normalizeDirPath(relativeDirectoryName); const directoryName = path.basename(relativeDirectoryName); const directoryParent = path.join(path.dirname(relativeDirectoryName), path.sep); const absoluteDirectoryName = path.join(ProjectPath.ImageFolder, relativeDirectoryName); @@ -61,10 +71,11 @@ export class DiskMangerWorker { parent: null, name: directoryName, path: directoryParent, - lastModified: Math.max(stat.ctime.getTime(), stat.mtime.getTime()), + lastModified: this.calcLastModified(stat), lastScanned: Date.now(), directories: [], isPartial: false, + mediaCount: 0, media: [], metaFile: [] }; @@ -114,6 +125,8 @@ export class DiskMangerWorker { } } + directory.mediaCount = directory.media.length; + return resolve(directory); } catch (err) { return reject({error: err.toString()}); diff --git a/backend/routes/GalleryRouter.ts b/backend/routes/GalleryRouter.ts index 9e3b140f..e1149e21 100644 --- a/backend/routes/GalleryRouter.ts +++ b/backend/routes/GalleryRouter.ts @@ -1,5 +1,5 @@ import {AuthenticationMWs} from '../middlewares/user/AuthenticationMWs'; -import {Express} from 'express'; +import {Express, NextFunction, Request, Response} from 'express'; import {GalleryMWs} from '../middlewares/GalleryMWs'; import {RenderingMWs} from '../middlewares/RenderingMWs'; import {ThumbnailGeneratorMWs} from '../middlewares/thumbnail/ThumbnailGeneratorMWs'; diff --git a/common/DataStructureVersion.ts b/common/DataStructureVersion.ts index 1dff245f..9313616e 100644 --- a/common/DataStructureVersion.ts +++ b/common/DataStructureVersion.ts @@ -1 +1 @@ -export const DataStructureVersion = 5; +export const DataStructureVersion = 7; diff --git a/common/config/private/PrivateConfigClass.ts b/common/config/private/PrivateConfigClass.ts index f6f5d543..ca3e908a 100644 --- a/common/config/private/PrivateConfigClass.ts +++ b/common/config/private/PrivateConfigClass.ts @@ -44,7 +44,7 @@ export class PrivateConfigClass extends PublicConfigClass implements IPrivateCon indexing: { folderPreviewSize: 2, cachedFolderTimeout: 1000 * 60 * 60, - reIndexingSensitivity: ReIndexingSensitivity.medium + reIndexingSensitivity: ReIndexingSensitivity.low } }; private ConfigLoader: any; diff --git a/common/entities/DirectoryDTO.ts b/common/entities/DirectoryDTO.ts index 5027831a..b57f4ddb 100644 --- a/common/entities/DirectoryDTO.ts +++ b/common/entities/DirectoryDTO.ts @@ -10,7 +10,8 @@ export interface DirectoryDTO { lastScanned: number; isPartial?: boolean; parent: DirectoryDTO; - directories: Array; + mediaCount: number; + directories: DirectoryDTO[]; media: MediaDTO[]; metaFile: FileDTO[]; } diff --git a/common/entities/settings/IndexingProgressDTO.ts b/common/entities/settings/IndexingProgressDTO.ts index 5288599e..74d7fc97 100644 --- a/common/entities/settings/IndexingProgressDTO.ts +++ b/common/entities/settings/IndexingProgressDTO.ts @@ -2,4 +2,8 @@ export interface IndexingProgressDTO { indexed: number; left: number; current: string; + time: { + start: number, + current: number + }; } diff --git a/frontend/app/gallery/navigator/navigator.gallery.component.ts b/frontend/app/gallery/navigator/navigator.gallery.component.ts index e73f21e4..6fec6cb0 100644 --- a/frontend/app/gallery/navigator/navigator.gallery.component.ts +++ b/frontend/app/gallery/navigator/navigator.gallery.component.ts @@ -28,6 +28,7 @@ export class GalleryNavigatorComponent implements OnChanges { sortingMethodsType: { key: number; value: string }[] = []; config = Config; DefaultSorting = Config.Client.Other.defaultPhotoSortingMethod; + private readonly RootFolderName: string; readonly SearchTypes = SearchTypes; @@ -37,6 +38,7 @@ export class GalleryNavigatorComponent implements OnChanges { private router: Router, private i18n: I18n) { this.sortingMethodsType = Utils.enumToArray(SortingMethods); + this.RootFolderName = this.i18n('Images'); } @@ -67,9 +69,9 @@ export class GalleryNavigatorComponent implements OnChanges { // create root link if (dirs.length === 0) { - arr.push({name: this.i18n('Images'), route: null}); + arr.push({name: this.RootFolderName, route: null}); } else { - arr.push({name: this.i18n('Images'), route: UserDTO.isPathAvailable('/', user.permissions) ? '/' : null}); + arr.push({name: this.RootFolderName, route: UserDTO.isPathAvailable('/', user.permissions) ? '/' : null}); } // create rest navigation @@ -93,22 +95,23 @@ export class GalleryNavigatorComponent implements OnChanges { } get ItemCount(): number { - return (this.directory || this.searchResult).media.length; + return this.directory ? this.directory.mediaCount : this.searchResult.media.length; } -/* - @HostListener('window:keydown', ['$event']) - onKeyPress(e: KeyboardEvent) { - if (this.routes.length < 2) { - return; - } - const event: KeyboardEvent = window.event ? window.event : e; - if (event.altKey === true && event.key === 'ArrowUp') { - const path = this.routes[this.routes.length - 2]; - this.router.navigate(['/gallery', path.route], - {queryParams: this.queryService.getParams()}).catch(console.error); - } - }*/ + /* + + @HostListener('window:keydown', ['$event']) + onKeyPress(e: KeyboardEvent) { + if (this.routes.length < 2) { + return; + } + const event: KeyboardEvent = window.event ? window.event : e; + if (event.altKey === true && event.key === 'ArrowUp') { + const path = this.routes[this.routes.length - 2]; + this.router.navigate(['/gallery', path.route], + {queryParams: this.queryService.getParams()}).catch(console.error); + } + }*/ } interface NavigatorPath { diff --git a/frontend/app/settings/indexing/indexing.settings.component.css b/frontend/app/settings/indexing/indexing.settings.component.css index 60738502..19c3a806 100644 --- a/frontend/app/settings/indexing/indexing.settings.component.css +++ b/frontend/app/settings/indexing/indexing.settings.component.css @@ -6,3 +6,7 @@ .statics span.oi { margin-right: 3px; } + +.progress-details{ + font-weight: bold; +} diff --git a/frontend/app/settings/indexing/indexing.settings.component.html b/frontend/app/settings/indexing/indexing.settings.component.html index 5de8dd4a..a9f727f9 100644 --- a/frontend/app/settings/indexing/indexing.settings.component.html +++ b/frontend/app/settings/indexing/indexing.settings.component.html @@ -70,7 +70,9 @@
- indexing: {{_settingsService.progress.value.current}} + indexing: {{_settingsService.progress.value.current}}
+ elapsed: {{TimeElapsed | duration}}
+ left: {{TimeLeft | duration}}
app/settings/basic/basic.settings.component.html - 94 + 91 app/settings/other/other.settings.component.html @@ -726,7 +726,7 @@ app/settings/basic/basic.settings.component.html - 97 + 94 app/settings/other/other.settings.component.html @@ -1036,7 +1036,7 @@ Server will accept connections from this IPv6 or IPv4 address. app/settings/basic/basic.settings.component.html - 30 + 27 Server will accept connections from this IPv6 or IPv4 address. @@ -1044,7 +1044,7 @@ Port app/settings/basic/basic.settings.component.html - 35 + 32 Port @@ -1052,7 +1052,7 @@ Port number. Port 80 is usually what you need. app/settings/basic/basic.settings.component.html - 44 + 41 Port number. Port 80 is usually what you need. @@ -1060,7 +1060,7 @@ Images folder app/settings/basic/basic.settings.component.html - 49 + 46 Images folder @@ -1068,7 +1068,7 @@ Images are loaded from this folder (read permission required) app/settings/basic/basic.settings.component.html - 55 + 52 Images are loaded from this folder (read permission required) @@ -1076,7 +1076,7 @@ Page public url app/settings/basic/basic.settings.component.html - 60 + 57 Page public url @@ -1086,7 +1086,7 @@ app/settings/basic/basic.settings.component.html - 67 + 64 If you access the page form local network its good to know the public url for creating sharing link @@ -1094,7 +1094,7 @@ Url Base app/settings/basic/basic.settings.component.html - 74 + 71 Url Base @@ -1105,7 +1105,7 @@ app/settings/basic/basic.settings.component.html - 81 + 78 If you access the gallery under a sub url (like: http://mydomain.com/myGallery), set it here. If not working you might miss the '/' from the beginning of the url. @@ -1115,7 +1115,7 @@ app/settings/basic/basic.settings.component.html - 88 + 85 The public url and the url base are not matching. Some of the functionality might not work. @@ -1393,12 +1393,36 @@ Note: search only works among the indexed directories + + indexing + + app/settings/indexing/indexing.settings.component.html + 73 + + indexing + + + elapsed + + app/settings/indexing/indexing.settings.component.html + 74 + + elapsed + + + left + + app/settings/indexing/indexing.settings.component.html + 75 + + left + Index app/settings/indexing/indexing.settings.component.html - 94 + 96 Index @@ -1406,7 +1430,7 @@ Indexes the folders app/settings/indexing/indexing.settings.component.html - 92 + 94 Indexes the folders @@ -1415,7 +1439,7 @@ app/settings/indexing/indexing.settings.component.html - 101 + 103 Index with Thumbnails @@ -1423,7 +1447,7 @@ Indexes the folders and also creates the thumbnails app/settings/indexing/indexing.settings.component.html - 97 + 99 Indexes the folders and also creates the thumbnails @@ -1432,7 +1456,7 @@ app/settings/indexing/indexing.settings.component.html - 106 + 108 Cancel @@ -1441,7 +1465,7 @@ app/settings/indexing/indexing.settings.component.html - 110 + 112 Reset Indexes @@ -1451,7 +1475,7 @@ app/settings/indexing/indexing.settings.component.html - 115 + 117 Statistic: @@ -1459,7 +1483,7 @@ Folders app/settings/indexing/indexing.settings.component.html - 119 + 121 Folders @@ -1467,7 +1491,7 @@ Photos app/settings/indexing/indexing.settings.component.html - 123 + 125 Photos @@ -1475,7 +1499,7 @@ Videos app/settings/indexing/indexing.settings.component.html - 127 + 129 Videos @@ -1483,7 +1507,7 @@ Size app/settings/indexing/indexing.settings.component.html - 132 + 134 Size diff --git a/frontend/translate/messages.hu.xlf b/frontend/translate/messages.hu.xlf index 7833f000..c6099346 100644 --- a/frontend/translate/messages.hu.xlf +++ b/frontend/translate/messages.hu.xlf @@ -685,7 +685,7 @@ app/settings/basic/basic.settings.component.html - 94 + 91 app/settings/other/other.settings.component.html @@ -726,7 +726,7 @@ app/settings/basic/basic.settings.component.html - 97 + 94 app/settings/other/other.settings.component.html @@ -1036,7 +1036,7 @@ Server will accept connections from this IPv6 or IPv4 address. app/settings/basic/basic.settings.component.html - 30 + 27 A szerver csak erről az (IPv6 vagy az IPv4) címből származó kapcsolatokat fog fogadni. @@ -1044,7 +1044,7 @@ Port app/settings/basic/basic.settings.component.html - 35 + 32 Port @@ -1052,7 +1052,7 @@ Port number. Port 80 is usually what you need. app/settings/basic/basic.settings.component.html - 44 + 41 Portszám. A 80-as port általában az, amire szükséged van. @@ -1060,7 +1060,7 @@ Images folder app/settings/basic/basic.settings.component.html - 49 + 46 Képek mappa @@ -1068,7 +1068,7 @@ Images are loaded from this folder (read permission required) app/settings/basic/basic.settings.component.html - 55 + 52 A képek ebből a mappából töltődnek be (olvasási engedély szükséges a mappára) @@ -1076,7 +1076,7 @@ Page public url app/settings/basic/basic.settings.component.html - 60 + 57 Oldal nyilvános url-je @@ -1086,7 +1086,7 @@ app/settings/basic/basic.settings.component.html - 67 + 64 Ha az oldalt a helyi hálózaton keresztül éred el, jó tudni a nyilvánosságot URL-t megosztási link létrehozásához @@ -1094,7 +1094,7 @@ Url Base app/settings/basic/basic.settings.component.html - 74 + 71 Al cím @@ -1105,7 +1105,7 @@ app/settings/basic/basic.settings.component.html - 81 + 78 Ha a galériát egy al-url alatt érheti el (például: http://mydomain.com/myGallery), állítsa be itt. Ha nem működik, akkor hiányozhat a "/" a kezdetétől url. @@ -1115,7 +1115,7 @@ app/settings/basic/basic.settings.component.html - 88 + 85 A nyilvános url és az al url nem eggyeznek meg. Néhány funkció lehet hogy nem fog működni. @@ -1393,12 +1393,36 @@ Megjegyzés: csak az indexelt könyvtárak között működik a keresés + + indexing + + app/settings/indexing/indexing.settings.component.html + 73 + + indexelés + + + elapsed + + app/settings/indexing/indexing.settings.component.html + 74 + + eltelt + + + left + + app/settings/indexing/indexing.settings.component.html + 75 + + hátra + Index app/settings/indexing/indexing.settings.component.html - 94 + 96 Index @@ -1406,7 +1430,7 @@ Indexes the folders app/settings/indexing/indexing.settings.component.html - 92 + 94 Indexeli a mappákat @@ -1415,7 +1439,7 @@ app/settings/indexing/indexing.settings.component.html - 101 + 103 Index thumbnail-el @@ -1423,7 +1447,7 @@ Indexes the folders and also creates the thumbnails app/settings/indexing/indexing.settings.component.html - 97 + 99 Indexeli a mappákat és legenerálja a thumbnaileket is @@ -1432,7 +1456,7 @@ app/settings/indexing/indexing.settings.component.html - 106 + 108 Mégse @@ -1441,7 +1465,7 @@ app/settings/indexing/indexing.settings.component.html - 110 + 112 Indexek visszaállítása @@ -1451,7 +1475,7 @@ app/settings/indexing/indexing.settings.component.html - 115 + 117 Statisztika: @@ -1459,7 +1483,7 @@ Folders app/settings/indexing/indexing.settings.component.html - 119 + 121 Mappák @@ -1467,7 +1491,7 @@ Photos app/settings/indexing/indexing.settings.component.html - 123 + 125 Fotók @@ -1475,7 +1499,7 @@ Videos app/settings/indexing/indexing.settings.component.html - 127 + 129 Videók @@ -1483,7 +1507,7 @@ Size app/settings/indexing/indexing.settings.component.html - 132 + 134 Méret @@ -1513,7 +1537,7 @@ frontend/app/gallery/navigator/navigator.gallery.component.ts 1 - képek + Képek Yes diff --git a/test/backend/integration/model/sql/typeorm.ts b/test/backend/integration/model/sql/typeorm.ts index f3f3d763..679fb1bd 100644 --- a/test/backend/integration/model/sql/typeorm.ts +++ b/test/backend/integration/model/sql/typeorm.ts @@ -63,6 +63,7 @@ describe('Typeorm integration', () => { d.lastModified = Date.now(); d.lastScanned = null; d.parent = null; + d.mediaCount = 0; d.media = []; d.directories = []; return d; diff --git a/test/backend/unit/model/sql/TestHelper.ts b/test/backend/unit/model/sql/TestHelper.ts index c36f68ce..623e3fc1 100644 --- a/test/backend/unit/model/sql/TestHelper.ts +++ b/test/backend/unit/model/sql/TestHelper.ts @@ -22,6 +22,7 @@ export class TestHelper { const dir = new DirectoryEntity(); dir.name = 'wars dir'; dir.path = '.'; + dir.mediaCount = 0; dir.lastModified = Date.now(); dir.lastScanned = null; @@ -68,6 +69,7 @@ export class TestHelper { d.name = 'test media.jpg'; d.directory = dir; d.metadata = m; + dir.mediaCount++; return d; } @@ -129,6 +131,7 @@ export class TestHelper { id: null, name: forceStr || Math.random().toString(36).substring(7), path: '.', + mediaCount: 0, directories: [], metaFile: [], media: [],