Skip to content

Commit

Permalink
improving performance: adding index to DB, fixing indexing bug
Browse files Browse the repository at this point in the history
bpatrik committed Jan 6, 2019
1 parent 56cdc83 commit 04b032f
Showing 21 changed files with 194 additions and 83 deletions.
3 changes: 2 additions & 1 deletion backend/model/memory/GalleryManager.ts
Original file line number Diff line number Diff line change
@@ -7,14 +7,15 @@ 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 {

public listDirectory(relativeDirectoryName: string, knownLastModified?: number, knownLastScanned?: number): Promise<DirectoryDTO> {
// 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) {
15 changes: 12 additions & 3 deletions backend/model/sql/GalleryManager.ts
Original file line number Diff line number Diff line change
@@ -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<DirectoryDTO> {

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 {
(<DirectoryEntity>scannedDirectory).lastScanned = scannedDirectory.lastScanned;
currentDir = await directoryRepository.save(<DirectoryEntity>scannedDirectory);
}

11 changes: 8 additions & 3 deletions backend/model/sql/IndexingManager.ts
Original file line number Diff line number Diff line change
@@ -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 = <IndexingProgressDTO>{
this.indexingProgress = {
indexed: 0,
left: 0,
current: ''
current: '',
time: {
start: Date.now(),
current: Date.now()
}
};
this.directoriesToIndex.push('/');
this.enabled = true;
2 changes: 1 addition & 1 deletion backend/model/sql/SQLConnection.ts
Original file line number Diff line number Diff line change
@@ -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);
}
10 changes: 8 additions & 2 deletions backend/model/sql/enitites/DirectoryEntity.ts
Original file line number Diff line number Diff line change
@@ -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[];

4 changes: 3 additions & 1 deletion backend/model/sql/enitites/FileEntity.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
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';


@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;
}
6 changes: 3 additions & 3 deletions backend/model/sql/enitites/MediaEntity.ts
Original file line number Diff line number Diff line change
@@ -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;

15 changes: 14 additions & 1 deletion backend/model/threading/DiskMangerWorker.ts
Original file line number Diff line number Diff line change
@@ -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<DirectoryDTO> {
return new Promise<DirectoryDTO>((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()});
2 changes: 1 addition & 1 deletion backend/routes/GalleryRouter.ts
Original file line number Diff line number Diff line change
@@ -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';
2 changes: 1 addition & 1 deletion common/DataStructureVersion.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export const DataStructureVersion = 5;
export const DataStructureVersion = 7;
2 changes: 1 addition & 1 deletion common/config/private/PrivateConfigClass.ts
Original file line number Diff line number Diff line change
@@ -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;
3 changes: 2 additions & 1 deletion common/entities/DirectoryDTO.ts
Original file line number Diff line number Diff line change
@@ -10,7 +10,8 @@ export interface DirectoryDTO {
lastScanned: number;
isPartial?: boolean;
parent: DirectoryDTO;
directories: Array<DirectoryDTO>;
mediaCount: number;
directories: DirectoryDTO[];
media: MediaDTO[];
metaFile: FileDTO[];
}
4 changes: 4 additions & 0 deletions common/entities/settings/IndexingProgressDTO.ts
Original file line number Diff line number Diff line change
@@ -2,4 +2,8 @@ export interface IndexingProgressDTO {
indexed: number;
left: number;
current: string;
time: {
start: number,
current: number
};
}
35 changes: 19 additions & 16 deletions frontend/app/gallery/navigator/navigator.gallery.component.ts
Original file line number Diff line number Diff line change
@@ -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 ? <any>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 ? <any>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 {
Original file line number Diff line number Diff line change
@@ -6,3 +6,7 @@
.statics span.oi {
margin-right: 3px;
}

.progress-details{
font-weight: bold;
}
Original file line number Diff line number Diff line change
@@ -70,7 +70,9 @@ <h5 class="card-header" i18n>


<div *ngIf="_settingsService.progress.value != null">
indexing: {{_settingsService.progress.value.current}}
<span class="progress-details" i18n>indexing</span>: {{_settingsService.progress.value.current}} <br/>
<span class="progress-details" i18n>elapsed</span>: {{TimeElapsed | duration}}<br/>
<span class="progress-details" i18n>left</span>: {{TimeLeft | duration}}
<div class="progress">
<div class="progress-bar progress-bar-success"
role="progressbar"
9 changes: 9 additions & 0 deletions frontend/app/settings/indexing/indexing.settings.component.ts
Original file line number Diff line number Diff line change
@@ -119,6 +119,15 @@ export class IndexingSettingsComponent extends SettingsComponent<IndexingConfig,
return false;
}

get TimeLeft() {
const prg = this._settingsService.progress.value;
return (prg.time.current - prg.time.start) / prg.indexed * prg.left;
}
get TimeElapsed() {
const prg = this._settingsService.progress.value;
return (prg.time.current - prg.time.start);
}

async cancelIndexing() {
this.inProgress = true;
this.error = '';
70 changes: 47 additions & 23 deletions frontend/translate/messages.en.xlf
Original file line number Diff line number Diff line change
@@ -685,7 +685,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/other/other.settings.component.html</context>
@@ -726,7 +726,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/other/other.settings.component.html</context>
@@ -1036,47 +1036,47 @@
<source>Server will accept connections from this IPv6 or IPv4 address.</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">30</context>
<context context-type="linenumber">27</context>
</context-group>
<target>Server will accept connections from this IPv6 or IPv4 address.</target>
</trans-unit>
<trans-unit id="cb2741a46e3560f6bc6dfd99d385e86b08b26d72" datatype="html">
<source>Port</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">32</context>
</context-group>
<target>Port</target>
</trans-unit>
<trans-unit id="0559356d4e98ee90a10ff16250a2bf139eac649b" datatype="html">
<source>Port number. Port 80 is usually what you need.</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">44</context>
<context context-type="linenumber">41</context>
</context-group>
<target>Port number. Port 80 is usually what you need.</target>
</trans-unit>
<trans-unit id="50c6dfe7491fc0710eafbc2781138fc213ee2168" datatype="html">
<source>Images folder</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">49</context>
<context context-type="linenumber">46</context>
</context-group>
<target>Images folder</target>
</trans-unit>
<trans-unit id="b4b17c583a52ad8b6b15882c46d04ddbd7335816" datatype="html">
<source>Images are loaded from this folder (read permission required)</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">52</context>
</context-group>
<target>Images are loaded from this folder (read permission required)</target>
</trans-unit>
<trans-unit id="682679bea54c7cdc8fad228e65f4e35d8cf62275" datatype="html">
<source>Page public url</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">57</context>
</context-group>
<target>Page public url</target>
</trans-unit>
@@ -1086,15 +1086,15 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">64</context>
</context-group>
<target>If you access the page form local network its good to know the public url for creating sharing link</target>
</trans-unit>
<trans-unit id="52e8e9fdcd08e89225892a7657140dbf41020b76" datatype="html">
<source>Url Base</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">71</context>
</context-group>
<target>Url Base</target>
</trans-unit>
@@ -1105,7 +1105,7 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">78</context>
</context-group>
<target>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.</target>
</trans-unit>
@@ -1115,7 +1115,7 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">85</context>
</context-group>
<target>The public url and the url base are not matching. Some of the functionality might not work.</target>
</trans-unit>
@@ -1393,20 +1393,44 @@
</context-group>
<target>Note: search only works among the indexed directories</target>
</trans-unit>
<trans-unit id="1ac5dc3858808c90bb5e7cbd0c3e5e4b342160f3" datatype="html">
<source>indexing</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">73</context>
</context-group>
<target>indexing</target>
</trans-unit>
<trans-unit id="adab6f78490c699b2fdf22f611d3dc8662a178a5" datatype="html">
<source>elapsed</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">74</context>
</context-group>
<target>elapsed</target>
</trans-unit>
<trans-unit id="478c0bf6552f7226e27bb5b57b8209a040ded2c6" datatype="html">
<source>left</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">75</context>
</context-group>
<target>left</target>
</trans-unit>
<trans-unit id="32cc8ef8dc6f4f239b7f637ac8adaecc55b8e1d8" datatype="html">
<source>Index
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">96</context>
</context-group>
<target>Index</target>
</trans-unit>
<trans-unit id="b0a0813328867a956835e6fd09e614c2ad1cbc9d" datatype="html">
<source>Indexes the folders</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
<target>Indexes the folders</target>
</trans-unit>
@@ -1415,15 +1439,15 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">103</context>
</context-group>
<target>Index with Thumbnails</target>
</trans-unit>
<trans-unit id="b7e4e839063c258440e50826493ef7ee3c8c2be3" datatype="html">
<source>Indexes the folders and also creates the thumbnails</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">99</context>
</context-group>
<target>Indexes the folders and also creates the thumbnails</target>
</trans-unit>
@@ -1432,7 +1456,7 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">108</context>
</context-group>
<target>Cancel</target>
</trans-unit>
@@ -1441,7 +1465,7 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">112</context>
</context-group>
<target>Reset Indexes</target>
</trans-unit>
@@ -1451,39 +1475,39 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">117</context>
</context-group>
<target>Statistic:</target>
</trans-unit>
<trans-unit id="3fde556358b58d910adc30abaaff2433f0bb5f6c" datatype="html">
<source>Folders</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">119</context>
<context context-type="linenumber">121</context>
</context-group>
<target>Folders</target>
</trans-unit>
<trans-unit id="f84ece8c3bbbf088cb70cf95792ae14dfe51bf96" datatype="html">
<source>Photos</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">123</context>
<context context-type="linenumber">125</context>
</context-group>
<target>Photos</target>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238" datatype="html">
<source>Videos</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
<target>Videos</target>
</trans-unit>
<trans-unit id="7faaaa08f56427999f3be41df1093ce4089bbd75" datatype="html">
<source>Size</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">132</context>
<context context-type="linenumber">134</context>
</context-group>
<target>Size</target>
</trans-unit>
72 changes: 48 additions & 24 deletions frontend/translate/messages.hu.xlf
Original file line number Diff line number Diff line change
@@ -685,7 +685,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">91</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/other/other.settings.component.html</context>
@@ -726,7 +726,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">94</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/other/other.settings.component.html</context>
@@ -1036,47 +1036,47 @@
<source>Server will accept connections from this IPv6 or IPv4 address.</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">30</context>
<context context-type="linenumber">27</context>
</context-group>
<target>A szerver csak erről az (IPv6 vagy az IPv4) címből származó kapcsolatokat fog fogadni.</target>
</trans-unit>
<trans-unit id="cb2741a46e3560f6bc6dfd99d385e86b08b26d72" datatype="html">
<source>Port</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">32</context>
</context-group>
<target>Port</target>
</trans-unit>
<trans-unit id="0559356d4e98ee90a10ff16250a2bf139eac649b" datatype="html">
<source>Port number. Port 80 is usually what you need.</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">44</context>
<context context-type="linenumber">41</context>
</context-group>
<target>Portszám. A 80-as port általában az, amire szükséged van.</target>
</trans-unit>
<trans-unit id="50c6dfe7491fc0710eafbc2781138fc213ee2168" datatype="html">
<source>Images folder</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">49</context>
<context context-type="linenumber">46</context>
</context-group>
<target>Képek mappa</target>
</trans-unit>
<trans-unit id="b4b17c583a52ad8b6b15882c46d04ddbd7335816" datatype="html">
<source>Images are loaded from this folder (read permission required)</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">52</context>
</context-group>
<target>A képek ebből a mappából töltődnek be (olvasási engedély szükséges a mappára)</target>
</trans-unit>
<trans-unit id="682679bea54c7cdc8fad228e65f4e35d8cf62275" datatype="html">
<source>Page public url</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">57</context>
</context-group>
<target>Oldal nyilvános url-je</target>
</trans-unit>
@@ -1086,15 +1086,15 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">64</context>
</context-group>
<target>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</target>
</trans-unit>
<trans-unit id="52e8e9fdcd08e89225892a7657140dbf41020b76" datatype="html">
<source>Url Base</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">74</context>
<context context-type="linenumber">71</context>
</context-group>
<target>Al cím</target>
</trans-unit>
@@ -1105,7 +1105,7 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">81</context>
<context context-type="linenumber">78</context>
</context-group>
<target>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.</target>
</trans-unit>
@@ -1115,7 +1115,7 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/basic/basic.settings.component.html</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">85</context>
</context-group>
<target>A nyilvános url és az al url nem eggyeznek meg. Néhány funkció lehet hogy nem fog működni.</target>
</trans-unit>
@@ -1393,20 +1393,44 @@
</context-group>
<target>Megjegyzés: csak az indexelt könyvtárak között működik a keresés</target>
</trans-unit>
<trans-unit id="1ac5dc3858808c90bb5e7cbd0c3e5e4b342160f3" datatype="html">
<source>indexing</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">73</context>
</context-group>
<target>indexelés</target>
</trans-unit>
<trans-unit id="adab6f78490c699b2fdf22f611d3dc8662a178a5" datatype="html">
<source>elapsed</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">74</context>
</context-group>
<target>eltelt</target>
</trans-unit>
<trans-unit id="478c0bf6552f7226e27bb5b57b8209a040ded2c6" datatype="html">
<source>left</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">75</context>
</context-group>
<target>hátra</target>
</trans-unit>
<trans-unit id="32cc8ef8dc6f4f239b7f637ac8adaecc55b8e1d8" datatype="html">
<source>Index
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">96</context>
</context-group>
<target>Index</target>
</trans-unit>
<trans-unit id="b0a0813328867a956835e6fd09e614c2ad1cbc9d" datatype="html">
<source>Indexes the folders</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
<target>Indexeli a mappákat</target>
</trans-unit>
@@ -1415,15 +1439,15 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">103</context>
</context-group>
<target>Index thumbnail-el</target>
</trans-unit>
<trans-unit id="b7e4e839063c258440e50826493ef7ee3c8c2be3" datatype="html">
<source>Indexes the folders and also creates the thumbnails</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">99</context>
</context-group>
<target>Indexeli a mappákat és legenerálja a thumbnaileket is</target>
</trans-unit>
@@ -1432,7 +1456,7 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">108</context>
</context-group>
<target>Mégse</target>
</trans-unit>
@@ -1441,7 +1465,7 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">112</context>
</context-group>
<target>Indexek visszaállítása</target>
</trans-unit>
@@ -1451,39 +1475,39 @@
</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">117</context>
</context-group>
<target>Statisztika:</target>
</trans-unit>
<trans-unit id="3fde556358b58d910adc30abaaff2433f0bb5f6c" datatype="html">
<source>Folders</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">119</context>
<context context-type="linenumber">121</context>
</context-group>
<target>Mappák</target>
</trans-unit>
<trans-unit id="f84ece8c3bbbf088cb70cf95792ae14dfe51bf96" datatype="html">
<source>Photos</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">123</context>
<context context-type="linenumber">125</context>
</context-group>
<target>Fotók</target>
</trans-unit>
<trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238" datatype="html">
<source>Videos</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">129</context>
</context-group>
<target>Videók</target>
</trans-unit>
<trans-unit id="7faaaa08f56427999f3be41df1093ce4089bbd75" datatype="html">
<source>Size</source>
<context-group purpose="location">
<context context-type="sourcefile">app/settings/indexing/indexing.settings.component.html</context>
<context context-type="linenumber">132</context>
<context context-type="linenumber">134</context>
</context-group>
<target>Méret</target>
</trans-unit>
@@ -1513,7 +1537,7 @@
<context context-type="sourcefile">frontend/app/gallery/navigator/navigator.gallery.component.ts</context>
<context context-type="linenumber">1</context>
</context-group>
<target>képek</target>
<target>Képek</target>
</trans-unit>
<trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952" datatype="html">
<source>Yes</source>
1 change: 1 addition & 0 deletions test/backend/integration/model/sql/typeorm.ts
Original file line number Diff line number Diff line change
@@ -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;
3 changes: 3 additions & 0 deletions test/backend/unit/model/sql/TestHelper.ts
Original file line number Diff line number Diff line change
@@ -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: [],

0 comments on commit 04b032f

Please sign in to comment.