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

improving performance: adding index to DB, fixing indexing bug

This commit is contained in:
Patrik J. Braun 2019-01-06 23:15:52 +01:00
parent 56cdc834ed
commit 04b032ff2a
21 changed files with 194 additions and 83 deletions

View File

@ -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) {

View File

@ -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);
}

View File

@ -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;

View File

@ -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[];

View File

@ -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;
}

View File

@ -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;

View File

@ -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()});

View File

@ -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';

View File

@ -1 +1 @@
export const DataStructureVersion = 5;
export const DataStructureVersion = 7;

View File

@ -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;

View File

@ -10,7 +10,8 @@ export interface DirectoryDTO {
lastScanned: number;
isPartial?: boolean;
parent: DirectoryDTO;
directories: Array<DirectoryDTO>;
mediaCount: number;
directories: DirectoryDTO[];
media: MediaDTO[];
metaFile: FileDTO[];
}

View File

@ -2,4 +2,8 @@ export interface IndexingProgressDTO {
indexed: number;
left: number;
current: string;
time: {
start: number,
current: number
};
}

View File

@ -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,8 +95,9 @@ 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'])

View File

@ -6,3 +6,7 @@
.statics span.oi {
margin-right: 3px;
}
.progress-details{
font-weight: bold;
}

View File

@ -70,7 +70,9 @@
<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"

View File

@ -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 = '';

View File

@ -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,7 +1036,7 @@
<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>
@ -1044,7 +1044,7 @@
<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>
@ -1052,7 +1052,7 @@
<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>
@ -1060,7 +1060,7 @@
<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>
@ -1068,7 +1068,7 @@
<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>
@ -1076,7 +1076,7 @@
<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,7 +1086,7 @@
</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>
@ -1094,7 +1094,7 @@
<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,12 +1393,36 @@
</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>
@ -1406,7 +1430,7 @@
<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,7 +1439,7 @@
</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>
@ -1423,7 +1447,7 @@
<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,7 +1475,7 @@
</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>
@ -1459,7 +1483,7 @@
<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>
@ -1467,7 +1491,7 @@
<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>
@ -1475,7 +1499,7 @@
<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>
@ -1483,7 +1507,7 @@
<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>

View File

@ -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,7 +1036,7 @@
<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>
@ -1044,7 +1044,7 @@
<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>
@ -1052,7 +1052,7 @@
<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>
@ -1060,7 +1060,7 @@
<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>
@ -1068,7 +1068,7 @@
<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>
@ -1076,7 +1076,7 @@
<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,7 +1086,7 @@
</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>
@ -1094,7 +1094,7 @@
<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,12 +1393,36 @@
</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>
@ -1406,7 +1430,7 @@
<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,7 +1439,7 @@
</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>
@ -1423,7 +1447,7 @@
<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,7 +1475,7 @@
</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>
@ -1459,7 +1483,7 @@
<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>
@ -1467,7 +1491,7 @@
<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>
@ -1475,7 +1499,7 @@
<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>
@ -1483,7 +1507,7 @@
<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>

View File

@ -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;

View File

@ -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: [],