1
0
mirror of https://github.com/bpatrik/pigallery2.git synced 2025-01-10 04:07:35 +02:00

Adding cover photo change explanation #679

This commit is contained in:
Patrik J. Braun 2023-08-25 21:32:45 +02:00
parent 3c9c7e01a3
commit 839f399908
2 changed files with 276 additions and 274 deletions

View File

@ -83,14 +83,14 @@ export enum FFmpegPresets {
export type videoCodecType = 'libvpx-vp9' | 'libx264' | 'libvpx' | 'libx265'; export type videoCodecType = 'libvpx-vp9' | 'libx264' | 'libvpx' | 'libx265';
export type videoResolutionType = export type videoResolutionType =
| 240 | 240
| 360 | 360
| 480 | 480
| 720 | 720
| 1080 | 1080
| 1440 | 1440
| 2160 | 2160
| 4320; | 4320;
export type videoFormatType = 'mp4' | 'webm'; export type videoFormatType = 'mp4' | 'webm';
@SubConfigClass({softReadonly: true}) @SubConfigClass({softReadonly: true})
@ -98,51 +98,51 @@ export class MySQLConfig {
@ConfigProperty({ @ConfigProperty({
envAlias: 'MYSQL_HOST', envAlias: 'MYSQL_HOST',
tags: tags:
{ {
name: $localize`Host`, name: $localize`Host`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.advanced priority: ConfigPriority.advanced
}, },
}) })
host: string = 'localhost'; host: string = 'localhost';
@ConfigProperty({ @ConfigProperty({
envAlias: 'MYSQL_PORT', min: 0, max: 65535, envAlias: 'MYSQL_PORT', min: 0, max: 65535,
tags: tags:
{ {
name: $localize`Port`, name: $localize`Port`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.advanced priority: ConfigPriority.advanced
}, },
}) })
port: number = 3306; port: number = 3306;
@ConfigProperty({ @ConfigProperty({
envAlias: 'MYSQL_DATABASE', envAlias: 'MYSQL_DATABASE',
tags: tags:
{ {
name: $localize`Database`, name: $localize`Database`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.advanced priority: ConfigPriority.advanced
}, },
}) })
database: string = 'pigallery2'; database: string = 'pigallery2';
@ConfigProperty({ @ConfigProperty({
envAlias: 'MYSQL_USERNAME', envAlias: 'MYSQL_USERNAME',
tags: tags:
{ {
name: $localize`Username`, name: $localize`Username`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.advanced priority: ConfigPriority.advanced
}, },
}) })
username: string = ''; username: string = '';
@ConfigProperty({ @ConfigProperty({
envAlias: 'MYSQL_PASSWORD', type: 'password', envAlias: 'MYSQL_PASSWORD', type: 'password',
tags: tags:
{ {
name: $localize`Password`, name: $localize`Password`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.advanced priority: ConfigPriority.advanced
} }
}) })
password: string = ''; password: string = '';
} }
@ -151,11 +151,11 @@ export class MySQLConfig {
export class SQLiteConfig { export class SQLiteConfig {
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Sqlite db filename`, name: $localize`Sqlite db filename`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`Sqlite will save the db with this filename.`, description: $localize`Sqlite will save the db with this filename.`,
}) })
DBFileName: string = 'sqlite.db'; DBFileName: string = 'sqlite.db';
@ -165,51 +165,51 @@ export class SQLiteConfig {
export class UserConfig { export class UserConfig {
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Name`, name: $localize`Name`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
} }
}) })
name: string; name: string;
@ConfigProperty({ @ConfigProperty({
type: UserRoles, type: UserRoles,
tags: tags:
{ {
name: $localize`Role`, name: $localize`Role`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
}) })
role: UserRoles = UserRoles.User; role: UserRoles = UserRoles.User;
@ConfigProperty<string, ServerConfig, TAGS>({ @ConfigProperty<string, ServerConfig, TAGS>({
type: 'string', type: 'string',
tags: tags:
{ {
name: $localize`Password`, name: $localize`Password`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
relevant: (c: UserConfig) => !c.encrypted relevant: (c: UserConfig) => !c.encrypted
}, },
description: $localize`Unencrypted, temporary password. App will encrypt it and delete this.` description: $localize`Unencrypted, temporary password. App will encrypt it and delete this.`
}) })
password: string; password: string;
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Encrypted password`, name: $localize`Encrypted password`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
secret: true secret: true
}, },
}) })
encryptedPassword: string | undefined; encryptedPassword: string | undefined;
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
relevant: () => false // never render this on UI. Only used to indicate that encryption is done. relevant: () => false // never render this on UI. Only used to indicate that encryption is done.
} as TAGS, } as TAGS,
}) })
encrypted: boolean; encrypted: boolean;
@ -231,44 +231,44 @@ export class ServerDataBaseConfig {
@ConfigProperty<DatabaseType, ServerConfig>({ @ConfigProperty<DatabaseType, ServerConfig>({
type: DatabaseType, type: DatabaseType,
tags: tags:
{ {
name: $localize`Type`, name: $localize`Type`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
uiResetNeeded: {db: true}, uiResetNeeded: {db: true},
githubIssue: 573 githubIssue: 573
} as TAGS, } as TAGS,
description: $localize`SQLite is recommended.` description: $localize`SQLite is recommended.`
}) })
type: DatabaseType = DatabaseType.sqlite; type: DatabaseType = DatabaseType.sqlite;
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Database folder`, name: $localize`Database folder`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.advanced priority: ConfigPriority.advanced
}, },
description: $localize`All file-based data will be stored here (sqlite database, job history data).`, description: $localize`All file-based data will be stored here (sqlite database, job history data).`,
}) })
dbFolder: string = 'db'; dbFolder: string = 'db';
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`SQLite`, name: $localize`SQLite`,
uiResetNeeded: {db: true}, uiResetNeeded: {db: true},
relevant: (c: any) => c.type === DatabaseType.sqlite, relevant: (c: any) => c.type === DatabaseType.sqlite,
} }
}) })
sqlite?: SQLiteConfig = new SQLiteConfig(); sqlite?: SQLiteConfig = new SQLiteConfig();
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`MySQL`, name: $localize`MySQL`,
uiResetNeeded: {db: true}, uiResetNeeded: {db: true},
relevant: (c: any) => c.type === DatabaseType.mysql, relevant: (c: any) => c.type === DatabaseType.mysql,
} }
}) })
mysql?: MySQLConfig = new MySQLConfig(); mysql?: MySQLConfig = new MySQLConfig();
@ -281,13 +281,13 @@ export class ServerUserConfig extends ClientUserConfig {
@ConfigProperty({ @ConfigProperty({
arrayType: UserConfig, arrayType: UserConfig,
tags: tags:
{ {
name: $localize`Enforced users`, name: $localize`Enforced users`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
uiOptional: true, uiOptional: true,
githubIssue: 575 githubIssue: 575
} as TAGS, } as TAGS,
description: $localize`Creates these users in the DB during startup if they do not exist. If a user with this name exist, it won't be overwritten, even if the role is different.`, description: $localize`Creates these users in the DB during startup if they do not exist. If a user with this name exist, it won't be overwritten, even if the role is different.`,
}) })
enforcedUsers: UserConfig[] = []; enforcedUsers: UserConfig[] = [];
@ -298,40 +298,40 @@ export class ServerUserConfig extends ClientUserConfig {
export class ServerThumbnailConfig extends ClientThumbnailConfig { export class ServerThumbnailConfig extends ClientThumbnailConfig {
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Enforced users`, name: $localize`Enforced users`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`if true, 'lanczos3' will used to scale photos, otherwise faster but lower quality 'nearest'.` description: $localize`if true, 'lanczos3' will used to scale photos, otherwise faster but lower quality 'nearest'.`
}) })
useLanczos3: boolean = true; useLanczos3: boolean = true;
@ConfigProperty({ @ConfigProperty({
max: 100, min: 1, type: 'unsignedInt', max: 100, min: 1, type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Converted photo and thumbnail quality`, name: $localize`Converted photo and thumbnail quality`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`Between 0-100.` description: $localize`Between 0-100.`
}) })
quality = 80; quality = 80;
@ConfigProperty({ @ConfigProperty({
type: 'boolean', type: 'boolean',
tags: tags:
{ {
name: $localize`Use chroma subsampling`, name: $localize`Use chroma subsampling`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`Use high quality chroma subsampling in webp. See: https://sharp.pixelplumbing.com/api-output#webp.` description: $localize`Use high quality chroma subsampling in webp. See: https://sharp.pixelplumbing.com/api-output#webp.`
}) })
smartSubsample = true; smartSubsample = true;
@ConfigProperty({ @ConfigProperty({
type: 'ratio', type: 'ratio',
tags: tags:
{ {
name: $localize`Person face margin`, name: $localize`Person face margin`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`Person face size ratio on the face thumbnail.` description: $localize`Person face size ratio on the face thumbnail.`
}) })
personFaceMargin: number = 0.6; // in ration [0-1] personFaceMargin: number = 0.6; // in ration [0-1]
@ -341,47 +341,47 @@ export class ServerThumbnailConfig extends ClientThumbnailConfig {
export class ServerGPXCompressingConfig extends ClientGPXCompressingConfig { export class ServerGPXCompressingConfig extends ClientGPXCompressingConfig {
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`OnTheFly *.gpx compression`, name: $localize`OnTheFly *.gpx compression`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
uiDisabled: (sc: ServerGPXCompressingConfig, c: ServerConfig) => !c.Map.enabled || !sc.enabled || !c.MetaFile.gpx uiDisabled: (sc: ServerGPXCompressingConfig, c: ServerConfig) => !c.Map.enabled || !sc.enabled || !c.MetaFile.gpx
}, },
description: $localize`Enables on the fly *.gpx compression.`, description: $localize`Enables on the fly *.gpx compression.`,
}) })
onTheFly: boolean = true; onTheFly: boolean = true;
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Min distance`, name: $localize`Min distance`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
unit: 'm', unit: 'm',
uiDisabled: (sc: ServerGPXCompressingConfig, c: ServerConfig) => !c.Map.enabled || !sc.enabled || !c.MetaFile.gpx uiDisabled: (sc: ServerGPXCompressingConfig, c: ServerConfig) => !c.Map.enabled || !sc.enabled || !c.MetaFile.gpx
} as TAGS, } as TAGS,
description: $localize`Filters out entry that are closer than this to each other in meters.` description: $localize`Filters out entry that are closer than this to each other in meters.`
}) })
minDistance: number = 5; minDistance: number = 5;
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Max middle point deviance`, name: $localize`Max middle point deviance`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
unit: 'm', unit: 'm',
uiDisabled: (sc: ServerGPXCompressingConfig, c: ServerConfig) => !c.Map.enabled || !sc.enabled || !c.MetaFile.gpx uiDisabled: (sc: ServerGPXCompressingConfig, c: ServerConfig) => !c.Map.enabled || !sc.enabled || !c.MetaFile.gpx
} as TAGS, } as TAGS,
description: $localize`Filters out entry that would fall on the line if we would just connect the previous and the next points. This setting sets the sensitivity for that (higher number, more points are filtered).` description: $localize`Filters out entry that would fall on the line if we would just connect the previous and the next points. This setting sets the sensitivity for that (higher number, more points are filtered).`
}) })
maxMiddleDeviance: number = 5; maxMiddleDeviance: number = 5;
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Min time delta`, name: $localize`Min time delta`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
unit: 'ms', unit: 'ms',
uiDisabled: (sc: ServerGPXCompressingConfig, c: ServerConfig) => !c.Map.enabled || !sc.enabled || !c.MetaFile.gpx uiDisabled: (sc: ServerGPXCompressingConfig, c: ServerConfig) => !c.Map.enabled || !sc.enabled || !c.MetaFile.gpx
} as TAGS, } as TAGS,
description: $localize`Filters out entry that are closer than this in time in milliseconds.` description: $localize`Filters out entry that are closer than this in time in milliseconds.`
}) })
minTimeDistance: number = 5000; minTimeDistance: number = 5000;
@ -391,17 +391,17 @@ export class ServerGPXCompressingConfig extends ClientGPXCompressingConfig {
export class ServerMetaFileConfig extends ClientMetaFileConfig { export class ServerMetaFileConfig extends ClientMetaFileConfig {
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`GPX compression`, name: $localize`GPX compression`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
uiJob: [{ uiJob: [{
job: DefaultsJobs[DefaultsJobs['GPX Compression']], job: DefaultsJobs[DefaultsJobs['GPX Compression']],
relevant: (c) => c.MetaFile.GPXCompressing.enabled relevant: (c) => c.MetaFile.GPXCompressing.enabled
}, { }, {
job: DefaultsJobs[DefaultsJobs['Delete Compressed GPX']], job: DefaultsJobs[DefaultsJobs['Delete Compressed GPX']],
relevant: (c) => c.MetaFile.GPXCompressing.enabled relevant: (c) => c.MetaFile.GPXCompressing.enabled
}] }]
} as TAGS } as TAGS
}) })
GPXCompressing: ServerGPXCompressingConfig = new ServerGPXCompressingConfig(); GPXCompressing: ServerGPXCompressingConfig = new ServerGPXCompressingConfig();
} }
@ -412,11 +412,11 @@ export class ServerSharingConfig extends ClientSharingConfig {
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Update timeout`, name: $localize`Update timeout`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
unit: 'ms' unit: 'ms'
} as TAGS, } as TAGS,
description: $localize`After creating a sharing link, it can be updated for this long.` description: $localize`After creating a sharing link, it can be updated for this long.`
}) })
updateTimeout: number = 1000 * 60 * 5; updateTimeout: number = 1000 * 60 * 5;
@ -427,47 +427,47 @@ export class ServerIndexingConfig {
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Index cache timeout`, name: $localize`Index cache timeout`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
unit: 'ms' unit: 'ms'
} as TAGS, } as TAGS,
description: $localize`If there was no indexing in this time, it reindexes. (skipped if indexes are in DB and sensitivity is low).` description: $localize`If there was no indexing in this time, it reindexes. (skipped if indexes are in DB and sensitivity is low).`
}) })
cachedFolderTimeout: number = 1000 * 60 * 60; // Do not rescans the folder if seems ok cachedFolderTimeout: number = 1000 * 60 * 60; // Do not rescans the folder if seems ok
@ConfigProperty({ @ConfigProperty({
type: ReIndexingSensitivity, type: ReIndexingSensitivity,
tags: tags:
{ {
name: $localize`Folder reindexing sensitivity`, name: $localize`Folder reindexing sensitivity`,
priority: ConfigPriority.advanced priority: ConfigPriority.advanced
}, },
description: $localize`Set the reindexing sensitivity. High value check the folders for change more often.` description: $localize`Set the reindexing sensitivity. High value check the folders for change more often.`
}) })
reIndexingSensitivity: ReIndexingSensitivity = ReIndexingSensitivity.low; reIndexingSensitivity: ReIndexingSensitivity = ReIndexingSensitivity.low;
@ConfigProperty({ @ConfigProperty({
arrayType: 'string', arrayType: 'string',
tags: tags:
{ {
name: $localize`Exclude Folder List`, name: $localize`Exclude Folder List`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
uiResetNeeded: {server: true, db: true}, uiResetNeeded: {server: true, db: true},
uiOptional: true, uiOptional: true,
uiAllowSpaces: true uiAllowSpaces: true
} as TAGS, } as TAGS,
description: $localize`Folders to exclude from indexing. If an entry starts with '/' it is treated as an absolute path. If it doesn't start with '/' but contains a '/', the path is relative to the image directory. If it doesn't contain a '/', any folder with this name will be excluded.`, description: $localize`Folders to exclude from indexing. If an entry starts with '/' it is treated as an absolute path. If it doesn't start with '/' but contains a '/', the path is relative to the image directory. If it doesn't contain a '/', any folder with this name will be excluded.`,
}) })
excludeFolderList: string[] = ['.Trash-1000', '.dtrash', '$RECYCLE.BIN']; excludeFolderList: string[] = ['.Trash-1000', '.dtrash', '$RECYCLE.BIN'];
@ConfigProperty({ @ConfigProperty({
arrayType: 'string', arrayType: 'string',
tags: tags:
{ {
name: $localize`Exclude File List`, name: $localize`Exclude File List`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
uiResetNeeded: {server: true, db: true}, uiResetNeeded: {server: true, db: true},
uiOptional: true, uiOptional: true,
hint: $localize`.ignore;.pg2ignore` hint: $localize`.ignore;.pg2ignore`
} as TAGS, } as TAGS,
description: $localize`Files that mark a folder to be excluded from indexing. Any folder that contains a file with this name will be excluded from indexing.`, description: $localize`Files that mark a folder to be excluded from indexing. Any folder that contains a file with this name will be excluded from indexing.`,
}) })
excludeFileList: string[] = []; excludeFileList: string[] = [];
@ -477,21 +477,21 @@ export class ServerIndexingConfig {
export class ServerThreadingConfig { export class ServerThreadingConfig {
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Threading`, name: $localize`Threading`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
} as TAGS, } as TAGS,
description: $localize`[Deprecated, will be removed in the next release] Runs directory scanning and thumbnail generation in a different thread.` description: $localize`[Deprecated, will be removed in the next release] Runs directory scanning and thumbnail generation in a different thread.`
}) })
enabled: boolean = false; enabled: boolean = false;
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Thumbnail threads`, name: $localize`Thumbnail threads`,
uiResetNeeded: {server: true}, uiResetNeeded: {server: true},
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`Number of threads that are used to generate thumbnails. If 0, number of 'CPU cores -1' threads will be used.`, description: $localize`Number of threads that are used to generate thumbnails. If 0, number of 'CPU cores -1' threads will be used.`,
}) })
thumbnailThreads: number = 0; // if zero-> CPU count -1 thumbnailThreads: number = 0; // if zero-> CPU count -1
@ -502,10 +502,10 @@ export class ServerDuplicatesConfig {
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Max duplicates`, name: $localize`Max duplicates`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`Maximum number of duplicates to list.` description: $localize`Maximum number of duplicates to list.`
}) })
listingLimit: number = 1000; listingLimit: number = 1000;
@ -606,21 +606,21 @@ export class JobScheduleConfig implements JobScheduleDTO {
}, },
}) })
trigger: trigger:
| AfterJobTriggerConfig
| NeverJobTriggerConfig
| PeriodicJobTriggerConfig
| ScheduledJobTriggerConfig;
constructor(
name: string,
jobName: string,
trigger:
| AfterJobTriggerConfig | AfterJobTriggerConfig
| NeverJobTriggerConfig | NeverJobTriggerConfig
| PeriodicJobTriggerConfig | PeriodicJobTriggerConfig
| ScheduledJobTriggerConfig; | ScheduledJobTriggerConfig,
config: any = {},
constructor( allowParallelRun: boolean = false
name: string,
jobName: string,
trigger:
| AfterJobTriggerConfig
| NeverJobTriggerConfig
| PeriodicJobTriggerConfig
| ScheduledJobTriggerConfig,
config: any = {},
allowParallelRun: boolean = false
) { ) {
this.name = name; this.name = name;
this.jobName = jobName; this.jobName = jobName;
@ -635,20 +635,20 @@ export class ServerJobConfig {
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Max saved progress`, name: $localize`Max saved progress`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`Job history size.` description: $localize`Job history size.`
}) })
maxSavedProgress: number = 20; maxSavedProgress: number = 20;
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Processing batch size`, name: $localize`Processing batch size`,
priority: ConfigPriority.underTheHood priority: ConfigPriority.underTheHood
}, },
description: $localize`Jobs load this many photos or videos form the DB for processing at once.` description: $localize`Jobs load this many photos or videos form the DB for processing at once.`
}) })
mediaProcessingBatchSize: number = 1000; mediaProcessingBatchSize: number = 1000;
@ -661,46 +661,46 @@ export class ServerJobConfig {
}) })
scheduled: JobScheduleConfig[] = [ scheduled: JobScheduleConfig[] = [
new JobScheduleConfig( new JobScheduleConfig(
DefaultsJobs[DefaultsJobs.Indexing], DefaultsJobs[DefaultsJobs.Indexing],
DefaultsJobs[DefaultsJobs.Indexing], DefaultsJobs[DefaultsJobs.Indexing],
new NeverJobTriggerConfig(), new NeverJobTriggerConfig(),
{indexChangesOnly: true} // set config explicitly, so it is not undefined on the UI {indexChangesOnly: true} // set config explicitly, so it is not undefined on the UI
), ),
new JobScheduleConfig( new JobScheduleConfig(
DefaultsJobs[DefaultsJobs['Album Cover Filling']], DefaultsJobs[DefaultsJobs['Album Cover Filling']],
DefaultsJobs[DefaultsJobs['Album Cover Filling']], DefaultsJobs[DefaultsJobs['Album Cover Filling']],
new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Indexing']]), new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Indexing']]),
{} {}
), ),
new JobScheduleConfig( new JobScheduleConfig(
DefaultsJobs[DefaultsJobs['Thumbnail Generation']], DefaultsJobs[DefaultsJobs['Thumbnail Generation']],
DefaultsJobs[DefaultsJobs['Thumbnail Generation']], DefaultsJobs[DefaultsJobs['Thumbnail Generation']],
new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Album Cover Filling']]), new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Album Cover Filling']]),
{sizes: [240], indexedOnly: true} {sizes: [240], indexedOnly: true}
), ),
new JobScheduleConfig( new JobScheduleConfig(
DefaultsJobs[DefaultsJobs['Photo Converting']], DefaultsJobs[DefaultsJobs['Photo Converting']],
DefaultsJobs[DefaultsJobs['Photo Converting']], DefaultsJobs[DefaultsJobs['Photo Converting']],
new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Thumbnail Generation']]), new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Thumbnail Generation']]),
{indexedOnly: true} {indexedOnly: true}
), ),
new JobScheduleConfig( new JobScheduleConfig(
DefaultsJobs[DefaultsJobs['Video Converting']], DefaultsJobs[DefaultsJobs['Video Converting']],
DefaultsJobs[DefaultsJobs['Video Converting']], DefaultsJobs[DefaultsJobs['Video Converting']],
new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Photo Converting']]), new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Photo Converting']]),
{indexedOnly: true} {indexedOnly: true}
), ),
new JobScheduleConfig( new JobScheduleConfig(
DefaultsJobs[DefaultsJobs['GPX Compression']], DefaultsJobs[DefaultsJobs['GPX Compression']],
DefaultsJobs[DefaultsJobs['GPX Compression']], DefaultsJobs[DefaultsJobs['GPX Compression']],
new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Video Converting']]), new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['Video Converting']]),
{indexedOnly: true} {indexedOnly: true}
), ),
new JobScheduleConfig( new JobScheduleConfig(
DefaultsJobs[DefaultsJobs['Temp Folder Cleaning']], DefaultsJobs[DefaultsJobs['Temp Folder Cleaning']],
DefaultsJobs[DefaultsJobs['Temp Folder Cleaning']], DefaultsJobs[DefaultsJobs['Temp Folder Cleaning']],
new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['GPX Compression']]), new AfterJobTriggerConfig(DefaultsJobs[DefaultsJobs['GPX Compression']]),
{indexedOnly: true} {indexedOnly: true}
), ),
]; ];
} }
@ -710,73 +710,73 @@ export class VideoTranscodingConfig {
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Bit rate`, name: $localize`Bit rate`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
unit: 'bps' unit: 'bps'
}, },
description: $localize`Target bit rate of the output video will be scaled down this this. This should be less than the upload rate of your home server.` description: $localize`Target bit rate of the output video will be scaled down this this. This should be less than the upload rate of your home server.`
}) })
bitRate: number = 5 * 1024 * 1024; bitRate: number = 5 * 1024 * 1024;
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', type: 'unsignedInt',
tags: tags:
{ {
name: $localize`Resolution`, name: $localize`Resolution`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
uiOptions: [720, 1080, 1440, 2160, 4320], uiOptions: [720, 1080, 1440, 2160, 4320],
unit: 'px' unit: 'px'
}, },
description: $localize`The height of the output video will be scaled down to this, while keeping the aspect ratio.` description: $localize`The height of the output video will be scaled down to this, while keeping the aspect ratio.`
}) })
resolution: videoResolutionType = 720; resolution: videoResolutionType = 720;
@ConfigProperty({ @ConfigProperty({
type: 'positiveFloat', type: 'positiveFloat',
tags: tags:
{ {
name: $localize`FPS`, name: $localize`FPS`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
uiOptions: [24, 25, 30, 48, 50, 60] uiOptions: [24, 25, 30, 48, 50, 60]
}, },
description: $localize`Target frame per second (fps) of the output video will be scaled down this this.` description: $localize`Target frame per second (fps) of the output video will be scaled down this this.`
}) })
fps: number = 25; fps: number = 25;
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Format`, name: $localize`Format`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
uiOptions: ['mp4', 'webm'] uiOptions: ['mp4', 'webm']
} }
}) })
format: videoFormatType = 'mp4'; format: videoFormatType = 'mp4';
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`MP4 codec`, name: $localize`MP4 codec`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
uiOptions: ['libx264', 'libx265'], uiOptions: ['libx264', 'libx265'],
relevant: (c: any) => c.format === 'mp4' relevant: (c: any) => c.format === 'mp4'
} }
}) })
mp4Codec: videoCodecType = 'libx264'; mp4Codec: videoCodecType = 'libx264';
@ConfigProperty({ @ConfigProperty({
tags: tags:
{ {
name: $localize`Webm Codec`, name: $localize`Webm Codec`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
uiOptions: ['libvpx', 'libvpx-vp9'], uiOptions: ['libvpx', 'libvpx-vp9'],
relevant: (c: any) => c.format === 'webm' relevant: (c: any) => c.format === 'webm'
} }
}) })
webmCodec: videoCodecType = 'libvpx'; webmCodec: videoCodecType = 'libvpx';
@ConfigProperty({ @ConfigProperty({
type: 'unsignedInt', max: 51, type: 'unsignedInt', max: 51,
tags: tags:
{ {
name: $localize`CRF`, name: $localize`CRF`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
}, },
description: $localize`The range of the Constant Rate Factor (CRF) scale is 0–51, where 0 is lossless, 23 is the default, and 51 is worst quality possible.`, description: $localize`The range of the Constant Rate Factor (CRF) scale is 0–51, where 0 is lossless, 23 is the default, and 51 is worst quality possible.`,
}) })
@ -784,10 +784,10 @@ export class VideoTranscodingConfig {
@ConfigProperty({ @ConfigProperty({
type: FFmpegPresets, type: FFmpegPresets,
tags: tags:
{ {
name: $localize`Preset`, name: $localize`Preset`,
priority: ConfigPriority.advanced, priority: ConfigPriority.advanced,
}, },
description: $localize`A preset is a collection of options that will provide a certain encoding speed to compression ratio. A slower preset will provide better compression (compression is quality per filesize).`, description: $localize`A preset is a collection of options that will provide a certain encoding speed to compression ratio. A slower preset will provide better compression (compression is quality per filesize).`,
}) })
preset: FFmpegPresets = FFmpegPresets.medium; preset: FFmpegPresets = FFmpegPresets.medium;
@ -839,7 +839,7 @@ export class PhotoConvertingConfig extends ClientPhotoConvertingConfig {
name: $localize`On the fly converting`, name: $localize`On the fly converting`,
priority: ConfigPriority.underTheHood, priority: ConfigPriority.underTheHood,
uiDisabled: (sc: PhotoConvertingConfig) => uiDisabled: (sc: PhotoConvertingConfig) =>
!sc.enabled !sc.enabled
}, },
description: $localize`Converts photos on the fly, when they are requested.`, description: $localize`Converts photos on the fly, when they are requested.`,
@ -853,7 +853,7 @@ export class PhotoConvertingConfig extends ClientPhotoConvertingConfig {
uiOptions: [720, 1080, 1440, 2160, 4320], uiOptions: [720, 1080, 1440, 2160, 4320],
unit: 'px', unit: 'px',
uiDisabled: (sc: PhotoConvertingConfig) => uiDisabled: (sc: PhotoConvertingConfig) =>
!sc.enabled !sc.enabled
}, },
description: $localize`The shorter edge of the converted photo will be scaled down to this, while keeping the aspect ratio.`, description: $localize`The shorter edge of the converted photo will be scaled down to this, while keeping the aspect ratio.`,
}) })
@ -1122,6 +1122,7 @@ export class ServerConfig extends ClientConfig {
tags: { tags: {
name: $localize`Album cover`, name: $localize`Album cover`,
uiIcon: 'ionImageOutline', uiIcon: 'ionImageOutline',
githubIssue: 679,
uiJob: [ uiJob: [
{ {
job: DefaultsJobs[DefaultsJobs['Album Cover Filling']], job: DefaultsJobs[DefaultsJobs['Album Cover Filling']],
@ -1129,7 +1130,8 @@ export class ServerConfig extends ClientConfig {
job: DefaultsJobs[DefaultsJobs['Album Cover Reset']], job: DefaultsJobs[DefaultsJobs['Album Cover Reset']],
hideProgress: true hideProgress: true
}] }]
} as TAGS } as TAGS,
description: $localize`Specify a search query and sorting that the app can use to pick the best photo for an album and folder cover. There is no way to manually pick folder and album cover in the app. You can tag some of your photos with 'cover' and set that as search query or rate them to 5 and set sorting to descending by rating.`
}) })
AlbumCover: ServerAlbumCoverConfig = new ServerAlbumCoverConfig(); AlbumCover: ServerAlbumCoverConfig = new ServerAlbumCoverConfig();

View File

@ -60,9 +60,9 @@ export class BackendtextService {
case DefaultsJobs['Temp Folder Cleaning']: case DefaultsJobs['Temp Folder Cleaning']:
return $localize`Temp folder cleaning`; return $localize`Temp folder cleaning`;
case DefaultsJobs['Album Cover Filling']: case DefaultsJobs['Album Cover Filling']:
return $localize`Album Cover filling`; return $localize`Album cover filling`;
case DefaultsJobs['Album Cover Reset']: case DefaultsJobs['Album Cover Reset']:
return $localize`Album Cover reset`; return $localize`Album cover reset`;
case DefaultsJobs['GPX Compression']: case DefaultsJobs['GPX Compression']:
return $localize`GPX compression`; return $localize`GPX compression`;
default: default: