chore(web): update job dashboard (#5745)

* rename clip encoding to smart search

* update job subtitles

* update api

* update smart search job title and subtitle

* fix `getJobName`

* change smart search icon

* formatting

* wording

* update reference to clip

* formatting

* update reference to Encode CLIP
This commit is contained in:
Mert 2023-12-16 11:50:46 -05:00 committed by GitHub
parent a2deba4734
commit cb1201e690
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 99 additions and 98 deletions

View File

@ -355,12 +355,6 @@ export interface AllJobStatusResponseDto {
* @memberof AllJobStatusResponseDto * @memberof AllJobStatusResponseDto
*/ */
'backgroundTask': JobStatusDto; 'backgroundTask': JobStatusDto;
/**
*
* @type {JobStatusDto}
* @memberof AllJobStatusResponseDto
*/
'clipEncoding': JobStatusDto;
/** /**
* *
* @type {JobStatusDto} * @type {JobStatusDto}
@ -403,6 +397,12 @@ export interface AllJobStatusResponseDto {
* @memberof AllJobStatusResponseDto * @memberof AllJobStatusResponseDto
*/ */
'sidecar': JobStatusDto; 'sidecar': JobStatusDto;
/**
*
* @type {JobStatusDto}
* @memberof AllJobStatusResponseDto
*/
'smartSearch': JobStatusDto;
/** /**
* *
* @type {JobStatusDto} * @type {JobStatusDto}
@ -2017,7 +2017,7 @@ export const JobName = {
VideoConversion: 'videoConversion', VideoConversion: 'videoConversion',
ObjectTagging: 'objectTagging', ObjectTagging: 'objectTagging',
RecognizeFaces: 'recognizeFaces', RecognizeFaces: 'recognizeFaces',
ClipEncoding: 'clipEncoding', SmartSearch: 'smartSearch',
BackgroundTask: 'backgroundTask', BackgroundTask: 'backgroundTask',
StorageTemplateMigration: 'storageTemplateMigration', StorageTemplateMigration: 'storageTemplateMigration',
Migration: 'migration', Migration: 'migration',
@ -3785,12 +3785,6 @@ export interface SystemConfigJobDto {
* @memberof SystemConfigJobDto * @memberof SystemConfigJobDto
*/ */
'backgroundTask': JobSettingsDto; 'backgroundTask': JobSettingsDto;
/**
*
* @type {JobSettingsDto}
* @memberof SystemConfigJobDto
*/
'clipEncoding': JobSettingsDto;
/** /**
* *
* @type {JobSettingsDto} * @type {JobSettingsDto}
@ -3833,6 +3827,12 @@ export interface SystemConfigJobDto {
* @memberof SystemConfigJobDto * @memberof SystemConfigJobDto
*/ */
'sidecar': JobSettingsDto; 'sidecar': JobSettingsDto;
/**
*
* @type {JobSettingsDto}
* @memberof SystemConfigJobDto
*/
'smartSearch': JobSettingsDto;
/** /**
* *
* @type {JobSettingsDto} * @type {JobSettingsDto}

View File

@ -26,7 +26,7 @@ Immich optionally uses machine learning for several features. However, it can be
### How can I lower Immich's CPU usage? ### How can I lower Immich's CPU usage?
The initial backup is the most intensive due to the number of jobs running. The most CPU-intensive ones are transcoding and machine learning jobs (Tag Images, Encode CLIP, Recognize Faces), and to a lesser extent thumbnail generation. Here are some ways to lower their CPU usage: The initial backup is the most intensive due to the number of jobs running. The most CPU-intensive ones are transcoding and machine learning jobs (Tag Images, Smart Search, Recognize Faces), and to a lesser extent thumbnail generation. Here are some ways to lower their CPU usage:
- Lower the job concurrency for these jobs to 1. - Lower the job concurrency for these jobs to 1.
- Under Settings > Transcoding Settings > Threads, set the number of threads to a low number like 1 or 2. - Under Settings > Transcoding Settings > Threads, set the number of threads to a low number like 1 or 2.

View File

@ -9,7 +9,6 @@ import 'package:openapi/api.dart';
Name | Type | Description | Notes Name | Type | Description | Notes
------------ | ------------- | ------------- | ------------- ------------ | ------------- | ------------- | -------------
**backgroundTask** | [**JobStatusDto**](JobStatusDto.md) | | **backgroundTask** | [**JobStatusDto**](JobStatusDto.md) | |
**clipEncoding** | [**JobStatusDto**](JobStatusDto.md) | |
**library_** | [**JobStatusDto**](JobStatusDto.md) | | **library_** | [**JobStatusDto**](JobStatusDto.md) | |
**metadataExtraction** | [**JobStatusDto**](JobStatusDto.md) | | **metadataExtraction** | [**JobStatusDto**](JobStatusDto.md) | |
**migration** | [**JobStatusDto**](JobStatusDto.md) | | **migration** | [**JobStatusDto**](JobStatusDto.md) | |
@ -17,6 +16,7 @@ Name | Type | Description | Notes
**recognizeFaces** | [**JobStatusDto**](JobStatusDto.md) | | **recognizeFaces** | [**JobStatusDto**](JobStatusDto.md) | |
**search** | [**JobStatusDto**](JobStatusDto.md) | | **search** | [**JobStatusDto**](JobStatusDto.md) | |
**sidecar** | [**JobStatusDto**](JobStatusDto.md) | | **sidecar** | [**JobStatusDto**](JobStatusDto.md) | |
**smartSearch** | [**JobStatusDto**](JobStatusDto.md) | |
**storageTemplateMigration** | [**JobStatusDto**](JobStatusDto.md) | | **storageTemplateMigration** | [**JobStatusDto**](JobStatusDto.md) | |
**thumbnailGeneration** | [**JobStatusDto**](JobStatusDto.md) | | **thumbnailGeneration** | [**JobStatusDto**](JobStatusDto.md) | |
**videoConversion** | [**JobStatusDto**](JobStatusDto.md) | | **videoConversion** | [**JobStatusDto**](JobStatusDto.md) | |

View File

@ -9,7 +9,6 @@ import 'package:openapi/api.dart';
Name | Type | Description | Notes Name | Type | Description | Notes
------------ | ------------- | ------------- | ------------- ------------ | ------------- | ------------- | -------------
**backgroundTask** | [**JobSettingsDto**](JobSettingsDto.md) | | **backgroundTask** | [**JobSettingsDto**](JobSettingsDto.md) | |
**clipEncoding** | [**JobSettingsDto**](JobSettingsDto.md) | |
**library_** | [**JobSettingsDto**](JobSettingsDto.md) | | **library_** | [**JobSettingsDto**](JobSettingsDto.md) | |
**metadataExtraction** | [**JobSettingsDto**](JobSettingsDto.md) | | **metadataExtraction** | [**JobSettingsDto**](JobSettingsDto.md) | |
**migration** | [**JobSettingsDto**](JobSettingsDto.md) | | **migration** | [**JobSettingsDto**](JobSettingsDto.md) | |
@ -17,6 +16,7 @@ Name | Type | Description | Notes
**recognizeFaces** | [**JobSettingsDto**](JobSettingsDto.md) | | **recognizeFaces** | [**JobSettingsDto**](JobSettingsDto.md) | |
**search** | [**JobSettingsDto**](JobSettingsDto.md) | | **search** | [**JobSettingsDto**](JobSettingsDto.md) | |
**sidecar** | [**JobSettingsDto**](JobSettingsDto.md) | | **sidecar** | [**JobSettingsDto**](JobSettingsDto.md) | |
**smartSearch** | [**JobSettingsDto**](JobSettingsDto.md) | |
**storageTemplateMigration** | [**JobSettingsDto**](JobSettingsDto.md) | | **storageTemplateMigration** | [**JobSettingsDto**](JobSettingsDto.md) | |
**thumbnailGeneration** | [**JobSettingsDto**](JobSettingsDto.md) | | **thumbnailGeneration** | [**JobSettingsDto**](JobSettingsDto.md) | |
**videoConversion** | [**JobSettingsDto**](JobSettingsDto.md) | | **videoConversion** | [**JobSettingsDto**](JobSettingsDto.md) | |

View File

@ -14,7 +14,6 @@ class AllJobStatusResponseDto {
/// Returns a new [AllJobStatusResponseDto] instance. /// Returns a new [AllJobStatusResponseDto] instance.
AllJobStatusResponseDto({ AllJobStatusResponseDto({
required this.backgroundTask, required this.backgroundTask,
required this.clipEncoding,
required this.library_, required this.library_,
required this.metadataExtraction, required this.metadataExtraction,
required this.migration, required this.migration,
@ -22,6 +21,7 @@ class AllJobStatusResponseDto {
required this.recognizeFaces, required this.recognizeFaces,
required this.search, required this.search,
required this.sidecar, required this.sidecar,
required this.smartSearch,
required this.storageTemplateMigration, required this.storageTemplateMigration,
required this.thumbnailGeneration, required this.thumbnailGeneration,
required this.videoConversion, required this.videoConversion,
@ -29,8 +29,6 @@ class AllJobStatusResponseDto {
JobStatusDto backgroundTask; JobStatusDto backgroundTask;
JobStatusDto clipEncoding;
JobStatusDto library_; JobStatusDto library_;
JobStatusDto metadataExtraction; JobStatusDto metadataExtraction;
@ -45,6 +43,8 @@ class AllJobStatusResponseDto {
JobStatusDto sidecar; JobStatusDto sidecar;
JobStatusDto smartSearch;
JobStatusDto storageTemplateMigration; JobStatusDto storageTemplateMigration;
JobStatusDto thumbnailGeneration; JobStatusDto thumbnailGeneration;
@ -54,7 +54,6 @@ class AllJobStatusResponseDto {
@override @override
bool operator ==(Object other) => identical(this, other) || other is AllJobStatusResponseDto && bool operator ==(Object other) => identical(this, other) || other is AllJobStatusResponseDto &&
other.backgroundTask == backgroundTask && other.backgroundTask == backgroundTask &&
other.clipEncoding == clipEncoding &&
other.library_ == library_ && other.library_ == library_ &&
other.metadataExtraction == metadataExtraction && other.metadataExtraction == metadataExtraction &&
other.migration == migration && other.migration == migration &&
@ -62,6 +61,7 @@ class AllJobStatusResponseDto {
other.recognizeFaces == recognizeFaces && other.recognizeFaces == recognizeFaces &&
other.search == search && other.search == search &&
other.sidecar == sidecar && other.sidecar == sidecar &&
other.smartSearch == smartSearch &&
other.storageTemplateMigration == storageTemplateMigration && other.storageTemplateMigration == storageTemplateMigration &&
other.thumbnailGeneration == thumbnailGeneration && other.thumbnailGeneration == thumbnailGeneration &&
other.videoConversion == videoConversion; other.videoConversion == videoConversion;
@ -70,7 +70,6 @@ class AllJobStatusResponseDto {
int get hashCode => int get hashCode =>
// ignore: unnecessary_parenthesis // ignore: unnecessary_parenthesis
(backgroundTask.hashCode) + (backgroundTask.hashCode) +
(clipEncoding.hashCode) +
(library_.hashCode) + (library_.hashCode) +
(metadataExtraction.hashCode) + (metadataExtraction.hashCode) +
(migration.hashCode) + (migration.hashCode) +
@ -78,17 +77,17 @@ class AllJobStatusResponseDto {
(recognizeFaces.hashCode) + (recognizeFaces.hashCode) +
(search.hashCode) + (search.hashCode) +
(sidecar.hashCode) + (sidecar.hashCode) +
(smartSearch.hashCode) +
(storageTemplateMigration.hashCode) + (storageTemplateMigration.hashCode) +
(thumbnailGeneration.hashCode) + (thumbnailGeneration.hashCode) +
(videoConversion.hashCode); (videoConversion.hashCode);
@override @override
String toString() => 'AllJobStatusResponseDto[backgroundTask=$backgroundTask, clipEncoding=$clipEncoding, library_=$library_, metadataExtraction=$metadataExtraction, migration=$migration, objectTagging=$objectTagging, recognizeFaces=$recognizeFaces, search=$search, sidecar=$sidecar, storageTemplateMigration=$storageTemplateMigration, thumbnailGeneration=$thumbnailGeneration, videoConversion=$videoConversion]'; String toString() => 'AllJobStatusResponseDto[backgroundTask=$backgroundTask, library_=$library_, metadataExtraction=$metadataExtraction, migration=$migration, objectTagging=$objectTagging, recognizeFaces=$recognizeFaces, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, storageTemplateMigration=$storageTemplateMigration, thumbnailGeneration=$thumbnailGeneration, videoConversion=$videoConversion]';
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final json = <String, dynamic>{}; final json = <String, dynamic>{};
json[r'backgroundTask'] = this.backgroundTask; json[r'backgroundTask'] = this.backgroundTask;
json[r'clipEncoding'] = this.clipEncoding;
json[r'library'] = this.library_; json[r'library'] = this.library_;
json[r'metadataExtraction'] = this.metadataExtraction; json[r'metadataExtraction'] = this.metadataExtraction;
json[r'migration'] = this.migration; json[r'migration'] = this.migration;
@ -96,6 +95,7 @@ class AllJobStatusResponseDto {
json[r'recognizeFaces'] = this.recognizeFaces; json[r'recognizeFaces'] = this.recognizeFaces;
json[r'search'] = this.search; json[r'search'] = this.search;
json[r'sidecar'] = this.sidecar; json[r'sidecar'] = this.sidecar;
json[r'smartSearch'] = this.smartSearch;
json[r'storageTemplateMigration'] = this.storageTemplateMigration; json[r'storageTemplateMigration'] = this.storageTemplateMigration;
json[r'thumbnailGeneration'] = this.thumbnailGeneration; json[r'thumbnailGeneration'] = this.thumbnailGeneration;
json[r'videoConversion'] = this.videoConversion; json[r'videoConversion'] = this.videoConversion;
@ -111,7 +111,6 @@ class AllJobStatusResponseDto {
return AllJobStatusResponseDto( return AllJobStatusResponseDto(
backgroundTask: JobStatusDto.fromJson(json[r'backgroundTask'])!, backgroundTask: JobStatusDto.fromJson(json[r'backgroundTask'])!,
clipEncoding: JobStatusDto.fromJson(json[r'clipEncoding'])!,
library_: JobStatusDto.fromJson(json[r'library'])!, library_: JobStatusDto.fromJson(json[r'library'])!,
metadataExtraction: JobStatusDto.fromJson(json[r'metadataExtraction'])!, metadataExtraction: JobStatusDto.fromJson(json[r'metadataExtraction'])!,
migration: JobStatusDto.fromJson(json[r'migration'])!, migration: JobStatusDto.fromJson(json[r'migration'])!,
@ -119,6 +118,7 @@ class AllJobStatusResponseDto {
recognizeFaces: JobStatusDto.fromJson(json[r'recognizeFaces'])!, recognizeFaces: JobStatusDto.fromJson(json[r'recognizeFaces'])!,
search: JobStatusDto.fromJson(json[r'search'])!, search: JobStatusDto.fromJson(json[r'search'])!,
sidecar: JobStatusDto.fromJson(json[r'sidecar'])!, sidecar: JobStatusDto.fromJson(json[r'sidecar'])!,
smartSearch: JobStatusDto.fromJson(json[r'smartSearch'])!,
storageTemplateMigration: JobStatusDto.fromJson(json[r'storageTemplateMigration'])!, storageTemplateMigration: JobStatusDto.fromJson(json[r'storageTemplateMigration'])!,
thumbnailGeneration: JobStatusDto.fromJson(json[r'thumbnailGeneration'])!, thumbnailGeneration: JobStatusDto.fromJson(json[r'thumbnailGeneration'])!,
videoConversion: JobStatusDto.fromJson(json[r'videoConversion'])!, videoConversion: JobStatusDto.fromJson(json[r'videoConversion'])!,
@ -170,7 +170,6 @@ class AllJobStatusResponseDto {
/// The list of required keys that must be present in a JSON. /// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{ static const requiredKeys = <String>{
'backgroundTask', 'backgroundTask',
'clipEncoding',
'library', 'library',
'metadataExtraction', 'metadataExtraction',
'migration', 'migration',
@ -178,6 +177,7 @@ class AllJobStatusResponseDto {
'recognizeFaces', 'recognizeFaces',
'search', 'search',
'sidecar', 'sidecar',
'smartSearch',
'storageTemplateMigration', 'storageTemplateMigration',
'thumbnailGeneration', 'thumbnailGeneration',
'videoConversion', 'videoConversion',

View File

@ -28,7 +28,7 @@ class JobName {
static const videoConversion = JobName._(r'videoConversion'); static const videoConversion = JobName._(r'videoConversion');
static const objectTagging = JobName._(r'objectTagging'); static const objectTagging = JobName._(r'objectTagging');
static const recognizeFaces = JobName._(r'recognizeFaces'); static const recognizeFaces = JobName._(r'recognizeFaces');
static const clipEncoding = JobName._(r'clipEncoding'); static const smartSearch = JobName._(r'smartSearch');
static const backgroundTask = JobName._(r'backgroundTask'); static const backgroundTask = JobName._(r'backgroundTask');
static const storageTemplateMigration = JobName._(r'storageTemplateMigration'); static const storageTemplateMigration = JobName._(r'storageTemplateMigration');
static const migration = JobName._(r'migration'); static const migration = JobName._(r'migration');
@ -43,7 +43,7 @@ class JobName {
videoConversion, videoConversion,
objectTagging, objectTagging,
recognizeFaces, recognizeFaces,
clipEncoding, smartSearch,
backgroundTask, backgroundTask,
storageTemplateMigration, storageTemplateMigration,
migration, migration,
@ -93,7 +93,7 @@ class JobNameTypeTransformer {
case r'videoConversion': return JobName.videoConversion; case r'videoConversion': return JobName.videoConversion;
case r'objectTagging': return JobName.objectTagging; case r'objectTagging': return JobName.objectTagging;
case r'recognizeFaces': return JobName.recognizeFaces; case r'recognizeFaces': return JobName.recognizeFaces;
case r'clipEncoding': return JobName.clipEncoding; case r'smartSearch': return JobName.smartSearch;
case r'backgroundTask': return JobName.backgroundTask; case r'backgroundTask': return JobName.backgroundTask;
case r'storageTemplateMigration': return JobName.storageTemplateMigration; case r'storageTemplateMigration': return JobName.storageTemplateMigration;
case r'migration': return JobName.migration; case r'migration': return JobName.migration;

View File

@ -14,7 +14,6 @@ class SystemConfigJobDto {
/// Returns a new [SystemConfigJobDto] instance. /// Returns a new [SystemConfigJobDto] instance.
SystemConfigJobDto({ SystemConfigJobDto({
required this.backgroundTask, required this.backgroundTask,
required this.clipEncoding,
required this.library_, required this.library_,
required this.metadataExtraction, required this.metadataExtraction,
required this.migration, required this.migration,
@ -22,6 +21,7 @@ class SystemConfigJobDto {
required this.recognizeFaces, required this.recognizeFaces,
required this.search, required this.search,
required this.sidecar, required this.sidecar,
required this.smartSearch,
required this.storageTemplateMigration, required this.storageTemplateMigration,
required this.thumbnailGeneration, required this.thumbnailGeneration,
required this.videoConversion, required this.videoConversion,
@ -29,8 +29,6 @@ class SystemConfigJobDto {
JobSettingsDto backgroundTask; JobSettingsDto backgroundTask;
JobSettingsDto clipEncoding;
JobSettingsDto library_; JobSettingsDto library_;
JobSettingsDto metadataExtraction; JobSettingsDto metadataExtraction;
@ -45,6 +43,8 @@ class SystemConfigJobDto {
JobSettingsDto sidecar; JobSettingsDto sidecar;
JobSettingsDto smartSearch;
JobSettingsDto storageTemplateMigration; JobSettingsDto storageTemplateMigration;
JobSettingsDto thumbnailGeneration; JobSettingsDto thumbnailGeneration;
@ -54,7 +54,6 @@ class SystemConfigJobDto {
@override @override
bool operator ==(Object other) => identical(this, other) || other is SystemConfigJobDto && bool operator ==(Object other) => identical(this, other) || other is SystemConfigJobDto &&
other.backgroundTask == backgroundTask && other.backgroundTask == backgroundTask &&
other.clipEncoding == clipEncoding &&
other.library_ == library_ && other.library_ == library_ &&
other.metadataExtraction == metadataExtraction && other.metadataExtraction == metadataExtraction &&
other.migration == migration && other.migration == migration &&
@ -62,6 +61,7 @@ class SystemConfigJobDto {
other.recognizeFaces == recognizeFaces && other.recognizeFaces == recognizeFaces &&
other.search == search && other.search == search &&
other.sidecar == sidecar && other.sidecar == sidecar &&
other.smartSearch == smartSearch &&
other.storageTemplateMigration == storageTemplateMigration && other.storageTemplateMigration == storageTemplateMigration &&
other.thumbnailGeneration == thumbnailGeneration && other.thumbnailGeneration == thumbnailGeneration &&
other.videoConversion == videoConversion; other.videoConversion == videoConversion;
@ -70,7 +70,6 @@ class SystemConfigJobDto {
int get hashCode => int get hashCode =>
// ignore: unnecessary_parenthesis // ignore: unnecessary_parenthesis
(backgroundTask.hashCode) + (backgroundTask.hashCode) +
(clipEncoding.hashCode) +
(library_.hashCode) + (library_.hashCode) +
(metadataExtraction.hashCode) + (metadataExtraction.hashCode) +
(migration.hashCode) + (migration.hashCode) +
@ -78,17 +77,17 @@ class SystemConfigJobDto {
(recognizeFaces.hashCode) + (recognizeFaces.hashCode) +
(search.hashCode) + (search.hashCode) +
(sidecar.hashCode) + (sidecar.hashCode) +
(smartSearch.hashCode) +
(storageTemplateMigration.hashCode) + (storageTemplateMigration.hashCode) +
(thumbnailGeneration.hashCode) + (thumbnailGeneration.hashCode) +
(videoConversion.hashCode); (videoConversion.hashCode);
@override @override
String toString() => 'SystemConfigJobDto[backgroundTask=$backgroundTask, clipEncoding=$clipEncoding, library_=$library_, metadataExtraction=$metadataExtraction, migration=$migration, objectTagging=$objectTagging, recognizeFaces=$recognizeFaces, search=$search, sidecar=$sidecar, storageTemplateMigration=$storageTemplateMigration, thumbnailGeneration=$thumbnailGeneration, videoConversion=$videoConversion]'; String toString() => 'SystemConfigJobDto[backgroundTask=$backgroundTask, library_=$library_, metadataExtraction=$metadataExtraction, migration=$migration, objectTagging=$objectTagging, recognizeFaces=$recognizeFaces, search=$search, sidecar=$sidecar, smartSearch=$smartSearch, storageTemplateMigration=$storageTemplateMigration, thumbnailGeneration=$thumbnailGeneration, videoConversion=$videoConversion]';
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final json = <String, dynamic>{}; final json = <String, dynamic>{};
json[r'backgroundTask'] = this.backgroundTask; json[r'backgroundTask'] = this.backgroundTask;
json[r'clipEncoding'] = this.clipEncoding;
json[r'library'] = this.library_; json[r'library'] = this.library_;
json[r'metadataExtraction'] = this.metadataExtraction; json[r'metadataExtraction'] = this.metadataExtraction;
json[r'migration'] = this.migration; json[r'migration'] = this.migration;
@ -96,6 +95,7 @@ class SystemConfigJobDto {
json[r'recognizeFaces'] = this.recognizeFaces; json[r'recognizeFaces'] = this.recognizeFaces;
json[r'search'] = this.search; json[r'search'] = this.search;
json[r'sidecar'] = this.sidecar; json[r'sidecar'] = this.sidecar;
json[r'smartSearch'] = this.smartSearch;
json[r'storageTemplateMigration'] = this.storageTemplateMigration; json[r'storageTemplateMigration'] = this.storageTemplateMigration;
json[r'thumbnailGeneration'] = this.thumbnailGeneration; json[r'thumbnailGeneration'] = this.thumbnailGeneration;
json[r'videoConversion'] = this.videoConversion; json[r'videoConversion'] = this.videoConversion;
@ -111,7 +111,6 @@ class SystemConfigJobDto {
return SystemConfigJobDto( return SystemConfigJobDto(
backgroundTask: JobSettingsDto.fromJson(json[r'backgroundTask'])!, backgroundTask: JobSettingsDto.fromJson(json[r'backgroundTask'])!,
clipEncoding: JobSettingsDto.fromJson(json[r'clipEncoding'])!,
library_: JobSettingsDto.fromJson(json[r'library'])!, library_: JobSettingsDto.fromJson(json[r'library'])!,
metadataExtraction: JobSettingsDto.fromJson(json[r'metadataExtraction'])!, metadataExtraction: JobSettingsDto.fromJson(json[r'metadataExtraction'])!,
migration: JobSettingsDto.fromJson(json[r'migration'])!, migration: JobSettingsDto.fromJson(json[r'migration'])!,
@ -119,6 +118,7 @@ class SystemConfigJobDto {
recognizeFaces: JobSettingsDto.fromJson(json[r'recognizeFaces'])!, recognizeFaces: JobSettingsDto.fromJson(json[r'recognizeFaces'])!,
search: JobSettingsDto.fromJson(json[r'search'])!, search: JobSettingsDto.fromJson(json[r'search'])!,
sidecar: JobSettingsDto.fromJson(json[r'sidecar'])!, sidecar: JobSettingsDto.fromJson(json[r'sidecar'])!,
smartSearch: JobSettingsDto.fromJson(json[r'smartSearch'])!,
storageTemplateMigration: JobSettingsDto.fromJson(json[r'storageTemplateMigration'])!, storageTemplateMigration: JobSettingsDto.fromJson(json[r'storageTemplateMigration'])!,
thumbnailGeneration: JobSettingsDto.fromJson(json[r'thumbnailGeneration'])!, thumbnailGeneration: JobSettingsDto.fromJson(json[r'thumbnailGeneration'])!,
videoConversion: JobSettingsDto.fromJson(json[r'videoConversion'])!, videoConversion: JobSettingsDto.fromJson(json[r'videoConversion'])!,
@ -170,7 +170,6 @@ class SystemConfigJobDto {
/// The list of required keys that must be present in a JSON. /// The list of required keys that must be present in a JSON.
static const requiredKeys = <String>{ static const requiredKeys = <String>{
'backgroundTask', 'backgroundTask',
'clipEncoding',
'library', 'library',
'metadataExtraction', 'metadataExtraction',
'migration', 'migration',
@ -178,6 +177,7 @@ class SystemConfigJobDto {
'recognizeFaces', 'recognizeFaces',
'search', 'search',
'sidecar', 'sidecar',
'smartSearch',
'storageTemplateMigration', 'storageTemplateMigration',
'thumbnailGeneration', 'thumbnailGeneration',
'videoConversion', 'videoConversion',

View File

@ -21,11 +21,6 @@ void main() {
// TODO // TODO
}); });
// JobStatusDto clipEncoding
test('to test the property `clipEncoding`', () async {
// TODO
});
// JobStatusDto library_ // JobStatusDto library_
test('to test the property `library_`', () async { test('to test the property `library_`', () async {
// TODO // TODO
@ -61,6 +56,11 @@ void main() {
// TODO // TODO
}); });
// JobStatusDto smartSearch
test('to test the property `smartSearch`', () async {
// TODO
});
// JobStatusDto storageTemplateMigration // JobStatusDto storageTemplateMigration
test('to test the property `storageTemplateMigration`', () async { test('to test the property `storageTemplateMigration`', () async {
// TODO // TODO

View File

@ -21,11 +21,6 @@ void main() {
// TODO // TODO
}); });
// JobSettingsDto clipEncoding
test('to test the property `clipEncoding`', () async {
// TODO
});
// JobSettingsDto library_ // JobSettingsDto library_
test('to test the property `library_`', () async { test('to test the property `library_`', () async {
// TODO // TODO
@ -61,6 +56,11 @@ void main() {
// TODO // TODO
}); });
// JobSettingsDto smartSearch
test('to test the property `smartSearch`', () async {
// TODO
});
// JobSettingsDto storageTemplateMigration // JobSettingsDto storageTemplateMigration
test('to test the property `storageTemplateMigration`', () async { test('to test the property `storageTemplateMigration`', () async {
// TODO // TODO

View File

@ -6470,9 +6470,6 @@
"backgroundTask": { "backgroundTask": {
"$ref": "#/components/schemas/JobStatusDto" "$ref": "#/components/schemas/JobStatusDto"
}, },
"clipEncoding": {
"$ref": "#/components/schemas/JobStatusDto"
},
"library": { "library": {
"$ref": "#/components/schemas/JobStatusDto" "$ref": "#/components/schemas/JobStatusDto"
}, },
@ -6494,6 +6491,9 @@
"sidecar": { "sidecar": {
"$ref": "#/components/schemas/JobStatusDto" "$ref": "#/components/schemas/JobStatusDto"
}, },
"smartSearch": {
"$ref": "#/components/schemas/JobStatusDto"
},
"storageTemplateMigration": { "storageTemplateMigration": {
"$ref": "#/components/schemas/JobStatusDto" "$ref": "#/components/schemas/JobStatusDto"
}, },
@ -6509,7 +6509,7 @@
"metadataExtraction", "metadataExtraction",
"videoConversion", "videoConversion",
"objectTagging", "objectTagging",
"clipEncoding", "smartSearch",
"storageTemplateMigration", "storageTemplateMigration",
"migration", "migration",
"backgroundTask", "backgroundTask",
@ -7821,7 +7821,7 @@
"videoConversion", "videoConversion",
"objectTagging", "objectTagging",
"recognizeFaces", "recognizeFaces",
"clipEncoding", "smartSearch",
"backgroundTask", "backgroundTask",
"storageTemplateMigration", "storageTemplateMigration",
"migration", "migration",
@ -9182,9 +9182,6 @@
"backgroundTask": { "backgroundTask": {
"$ref": "#/components/schemas/JobSettingsDto" "$ref": "#/components/schemas/JobSettingsDto"
}, },
"clipEncoding": {
"$ref": "#/components/schemas/JobSettingsDto"
},
"library": { "library": {
"$ref": "#/components/schemas/JobSettingsDto" "$ref": "#/components/schemas/JobSettingsDto"
}, },
@ -9206,6 +9203,9 @@
"sidecar": { "sidecar": {
"$ref": "#/components/schemas/JobSettingsDto" "$ref": "#/components/schemas/JobSettingsDto"
}, },
"smartSearch": {
"$ref": "#/components/schemas/JobSettingsDto"
},
"storageTemplateMigration": { "storageTemplateMigration": {
"$ref": "#/components/schemas/JobSettingsDto" "$ref": "#/components/schemas/JobSettingsDto"
}, },
@ -9221,7 +9221,7 @@
"metadataExtraction", "metadataExtraction",
"videoConversion", "videoConversion",
"objectTagging", "objectTagging",
"clipEncoding", "smartSearch",
"storageTemplateMigration", "storageTemplateMigration",
"migration", "migration",
"backgroundTask", "backgroundTask",

View File

@ -4,7 +4,7 @@ export enum QueueName {
VIDEO_CONVERSION = 'videoConversion', VIDEO_CONVERSION = 'videoConversion',
OBJECT_TAGGING = 'objectTagging', OBJECT_TAGGING = 'objectTagging',
RECOGNIZE_FACES = 'recognizeFaces', RECOGNIZE_FACES = 'recognizeFaces',
CLIP_ENCODING = 'clipEncoding', SMART_SEARCH = 'smartSearch',
BACKGROUND_TASK = 'backgroundTask', BACKGROUND_TASK = 'backgroundTask',
STORAGE_TEMPLATE_MIGRATION = 'storageTemplateMigration', STORAGE_TEMPLATE_MIGRATION = 'storageTemplateMigration',
MIGRATION = 'migration', MIGRATION = 'migration',
@ -135,8 +135,8 @@ export const JOBS_TO_QUEUE: Record<JobName, QueueName> = {
[JobName.RECOGNIZE_FACES]: QueueName.RECOGNIZE_FACES, [JobName.RECOGNIZE_FACES]: QueueName.RECOGNIZE_FACES,
// clip // clip
[JobName.QUEUE_ENCODE_CLIP]: QueueName.CLIP_ENCODING, [JobName.QUEUE_ENCODE_CLIP]: QueueName.SMART_SEARCH,
[JobName.ENCODE_CLIP]: QueueName.CLIP_ENCODING, [JobName.ENCODE_CLIP]: QueueName.SMART_SEARCH,
// XMP sidecars // XMP sidecars
[JobName.QUEUE_SIDECAR]: QueueName.SIDECAR, [JobName.QUEUE_SIDECAR]: QueueName.SIDECAR,

View File

@ -63,7 +63,7 @@ export class AllJobStatusResponseDto implements Record<QueueName, JobStatusDto>
[QueueName.OBJECT_TAGGING]!: JobStatusDto; [QueueName.OBJECT_TAGGING]!: JobStatusDto;
@ApiProperty({ type: JobStatusDto }) @ApiProperty({ type: JobStatusDto })
[QueueName.CLIP_ENCODING]!: JobStatusDto; [QueueName.SMART_SEARCH]!: JobStatusDto;
@ApiProperty({ type: JobStatusDto }) @ApiProperty({ type: JobStatusDto })
[QueueName.STORAGE_TEMPLATE_MIGRATION]!: JobStatusDto; [QueueName.STORAGE_TEMPLATE_MIGRATION]!: JobStatusDto;

View File

@ -97,7 +97,7 @@ describe(JobService.name, () => {
await expect(sut.getAllJobsStatus()).resolves.toEqual({ await expect(sut.getAllJobsStatus()).resolves.toEqual({
[QueueName.BACKGROUND_TASK]: expectedJobStatus, [QueueName.BACKGROUND_TASK]: expectedJobStatus,
[QueueName.CLIP_ENCODING]: expectedJobStatus, [QueueName.SMART_SEARCH]: expectedJobStatus,
[QueueName.METADATA_EXTRACTION]: expectedJobStatus, [QueueName.METADATA_EXTRACTION]: expectedJobStatus,
[QueueName.OBJECT_TAGGING]: expectedJobStatus, [QueueName.OBJECT_TAGGING]: expectedJobStatus,
[QueueName.SEARCH]: expectedJobStatus, [QueueName.SEARCH]: expectedJobStatus,
@ -171,7 +171,7 @@ describe(JobService.name, () => {
it('should handle a start clip encoding command', async () => { it('should handle a start clip encoding command', async () => {
jobMock.getQueueStatus.mockResolvedValue({ isActive: false, isPaused: false }); jobMock.getQueueStatus.mockResolvedValue({ isActive: false, isPaused: false });
await sut.handleCommand(QueueName.CLIP_ENCODING, { command: JobCommand.START, force: false }); await sut.handleCommand(QueueName.SMART_SEARCH, { command: JobCommand.START, force: false });
expect(jobMock.queue).toHaveBeenCalledWith({ name: JobName.QUEUE_ENCODE_CLIP, data: { force: false } }); expect(jobMock.queue).toHaveBeenCalledWith({ name: JobName.QUEUE_ENCODE_CLIP, data: { force: false } });
}); });
@ -232,7 +232,7 @@ describe(JobService.name, () => {
SystemConfigCore.create(newSystemConfigRepositoryMock(false)).config$.next({ SystemConfigCore.create(newSystemConfigRepositoryMock(false)).config$.next({
job: { job: {
[QueueName.BACKGROUND_TASK]: { concurrency: 10 }, [QueueName.BACKGROUND_TASK]: { concurrency: 10 },
[QueueName.CLIP_ENCODING]: { concurrency: 10 }, [QueueName.SMART_SEARCH]: { concurrency: 10 },
[QueueName.METADATA_EXTRACTION]: { concurrency: 10 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 10 },
[QueueName.OBJECT_TAGGING]: { concurrency: 10 }, [QueueName.OBJECT_TAGGING]: { concurrency: 10 },
[QueueName.RECOGNIZE_FACES]: { concurrency: 10 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 10 },
@ -247,7 +247,7 @@ describe(JobService.name, () => {
} as SystemConfig); } as SystemConfig);
expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.BACKGROUND_TASK, 10); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.BACKGROUND_TASK, 10);
expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.CLIP_ENCODING, 10); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.SMART_SEARCH, 10);
expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.METADATA_EXTRACTION, 10); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.METADATA_EXTRACTION, 10);
expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.OBJECT_TAGGING, 10); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.OBJECT_TAGGING, 10);
expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.RECOGNIZE_FACES, 10); expect(jobMock.setConcurrency).toHaveBeenCalledWith(QueueName.RECOGNIZE_FACES, 10);
@ -367,7 +367,7 @@ describe(JobService.name, () => {
const featureTests: Array<{ queue: QueueName; feature: FeatureFlag; configKey: SystemConfigKey }> = [ const featureTests: Array<{ queue: QueueName; feature: FeatureFlag; configKey: SystemConfigKey }> = [
{ {
queue: QueueName.CLIP_ENCODING, queue: QueueName.SMART_SEARCH,
feature: FeatureFlag.CLIP_ENCODE, feature: FeatureFlag.CLIP_ENCODE,
configKey: SystemConfigKey.MACHINE_LEARNING_CLIP_ENABLED, configKey: SystemConfigKey.MACHINE_LEARNING_CLIP_ENABLED,
}, },

View File

@ -98,7 +98,7 @@ export class JobService {
await this.configCore.requireFeature(FeatureFlag.TAG_IMAGE); await this.configCore.requireFeature(FeatureFlag.TAG_IMAGE);
return this.jobRepository.queue({ name: JobName.QUEUE_OBJECT_TAGGING, data: { force } }); return this.jobRepository.queue({ name: JobName.QUEUE_OBJECT_TAGGING, data: { force } });
case QueueName.CLIP_ENCODING: case QueueName.SMART_SEARCH:
await this.configCore.requireFeature(FeatureFlag.CLIP_ENCODE); await this.configCore.requireFeature(FeatureFlag.CLIP_ENCODE);
return this.jobRepository.queue({ name: JobName.QUEUE_ENCODE_CLIP, data: { force } }); return this.jobRepository.queue({ name: JobName.QUEUE_ENCODE_CLIP, data: { force } });

View File

@ -29,13 +29,13 @@ export class SmartInfoService {
} }
async init() { async init() {
await this.jobRepository.pause(QueueName.CLIP_ENCODING); await this.jobRepository.pause(QueueName.SMART_SEARCH);
let { isActive } = await this.jobRepository.getQueueStatus(QueueName.CLIP_ENCODING); let { isActive } = await this.jobRepository.getQueueStatus(QueueName.SMART_SEARCH);
while (isActive) { while (isActive) {
this.logger.verbose('Waiting for CLIP encoding queue to stop...'); this.logger.verbose('Waiting for CLIP encoding queue to stop...');
await setTimeout(1000).then(async () => { await setTimeout(1000).then(async () => {
({ isActive } = await this.jobRepository.getQueueStatus(QueueName.CLIP_ENCODING)); ({ isActive } = await this.jobRepository.getQueueStatus(QueueName.SMART_SEARCH));
}); });
} }
@ -43,7 +43,7 @@ export class SmartInfoService {
await this.repository.init(machineLearning.clip.modelName); await this.repository.init(machineLearning.clip.modelName);
await this.jobRepository.resume(QueueName.CLIP_ENCODING); await this.jobRepository.resume(QueueName.SMART_SEARCH);
} }
async handleQueueObjectTagging({ force }: IBaseJob) { async handleQueueObjectTagging({ force }: IBaseJob) {

View File

@ -39,7 +39,7 @@ export class SystemConfigJobDto implements Record<QueueName, JobSettingsDto> {
@ValidateNested() @ValidateNested()
@IsObject() @IsObject()
@Type(() => JobSettingsDto) @Type(() => JobSettingsDto)
[QueueName.CLIP_ENCODING]!: JobSettingsDto; [QueueName.SMART_SEARCH]!: JobSettingsDto;
@ApiProperty({ type: JobSettingsDto }) @ApiProperty({ type: JobSettingsDto })
@ValidateNested() @ValidateNested()

View File

@ -47,7 +47,7 @@ export const defaults = Object.freeze<SystemConfig>({
}, },
job: { job: {
[QueueName.BACKGROUND_TASK]: { concurrency: 5 }, [QueueName.BACKGROUND_TASK]: { concurrency: 5 },
[QueueName.CLIP_ENCODING]: { concurrency: 2 }, [QueueName.SMART_SEARCH]: { concurrency: 2 },
[QueueName.METADATA_EXTRACTION]: { concurrency: 5 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 5 },
[QueueName.OBJECT_TAGGING]: { concurrency: 2 }, [QueueName.OBJECT_TAGGING]: { concurrency: 2 },
[QueueName.RECOGNIZE_FACES]: { concurrency: 2 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 2 },

View File

@ -27,7 +27,7 @@ const updates: SystemConfigEntity[] = [
const updatedConfig = Object.freeze<SystemConfig>({ const updatedConfig = Object.freeze<SystemConfig>({
job: { job: {
[QueueName.BACKGROUND_TASK]: { concurrency: 5 }, [QueueName.BACKGROUND_TASK]: { concurrency: 5 },
[QueueName.CLIP_ENCODING]: { concurrency: 2 }, [QueueName.SMART_SEARCH]: { concurrency: 2 },
[QueueName.METADATA_EXTRACTION]: { concurrency: 5 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 5 },
[QueueName.OBJECT_TAGGING]: { concurrency: 2 }, [QueueName.OBJECT_TAGGING]: { concurrency: 2 },
[QueueName.RECOGNIZE_FACES]: { concurrency: 2 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 2 },

View File

@ -136,7 +136,7 @@ class ImmichApi {
[JobName.MetadataExtraction]: 'Extract Metadata', [JobName.MetadataExtraction]: 'Extract Metadata',
[JobName.Sidecar]: 'Sidecar Metadata', [JobName.Sidecar]: 'Sidecar Metadata',
[JobName.ObjectTagging]: 'Tag Objects', [JobName.ObjectTagging]: 'Tag Objects',
[JobName.ClipEncoding]: 'Encode Clip', [JobName.SmartSearch]: 'Smart Search',
[JobName.RecognizeFaces]: 'Recognize Faces', [JobName.RecognizeFaces]: 'Recognize Faces',
[JobName.VideoConversion]: 'Transcode Videos', [JobName.VideoConversion]: 'Transcode Videos',
[JobName.StorageTemplateMigration]: 'Storage Template Migration', [JobName.StorageTemplateMigration]: 'Storage Template Migration',

View File

@ -355,12 +355,6 @@ export interface AllJobStatusResponseDto {
* @memberof AllJobStatusResponseDto * @memberof AllJobStatusResponseDto
*/ */
'backgroundTask': JobStatusDto; 'backgroundTask': JobStatusDto;
/**
*
* @type {JobStatusDto}
* @memberof AllJobStatusResponseDto
*/
'clipEncoding': JobStatusDto;
/** /**
* *
* @type {JobStatusDto} * @type {JobStatusDto}
@ -403,6 +397,12 @@ export interface AllJobStatusResponseDto {
* @memberof AllJobStatusResponseDto * @memberof AllJobStatusResponseDto
*/ */
'sidecar': JobStatusDto; 'sidecar': JobStatusDto;
/**
*
* @type {JobStatusDto}
* @memberof AllJobStatusResponseDto
*/
'smartSearch': JobStatusDto;
/** /**
* *
* @type {JobStatusDto} * @type {JobStatusDto}
@ -2017,7 +2017,7 @@ export const JobName = {
VideoConversion: 'videoConversion', VideoConversion: 'videoConversion',
ObjectTagging: 'objectTagging', ObjectTagging: 'objectTagging',
RecognizeFaces: 'recognizeFaces', RecognizeFaces: 'recognizeFaces',
ClipEncoding: 'clipEncoding', SmartSearch: 'smartSearch',
BackgroundTask: 'backgroundTask', BackgroundTask: 'backgroundTask',
StorageTemplateMigration: 'storageTemplateMigration', StorageTemplateMigration: 'storageTemplateMigration',
Migration: 'migration', Migration: 'migration',
@ -3785,12 +3785,6 @@ export interface SystemConfigJobDto {
* @memberof SystemConfigJobDto * @memberof SystemConfigJobDto
*/ */
'backgroundTask': JobSettingsDto; 'backgroundTask': JobSettingsDto;
/**
*
* @type {JobSettingsDto}
* @memberof SystemConfigJobDto
*/
'clipEncoding': JobSettingsDto;
/** /**
* *
* @type {JobSettingsDto} * @type {JobSettingsDto}
@ -3833,6 +3827,12 @@ export interface SystemConfigJobDto {
* @memberof SystemConfigJobDto * @memberof SystemConfigJobDto
*/ */
'sidecar': JobSettingsDto; 'sidecar': JobSettingsDto;
/**
*
* @type {JobSettingsDto}
* @memberof SystemConfigJobDto
*/
'smartSearch': JobSettingsDto;
/** /**
* *
* @type {JobSettingsDto} * @type {JobSettingsDto}

View File

@ -12,10 +12,10 @@
mdiFileJpgBox, mdiFileJpgBox,
mdiFileXmlBox, mdiFileXmlBox,
mdiFolderMove, mdiFolderMove,
mdiImageSearch,
mdiLibraryShelves, mdiLibraryShelves,
mdiTable, mdiTable,
mdiTagMultiple, mdiTagMultiple,
mdiVectorCircle,
mdiVideo, mdiVideo,
} from '@mdi/js'; } from '@mdi/js';
import ConfirmDialogue from '../../shared-components/confirm-dialogue.svelte'; import ConfirmDialogue from '../../shared-components/confirm-dialogue.svelte';
@ -56,12 +56,12 @@
[JobName.ThumbnailGeneration]: { [JobName.ThumbnailGeneration]: {
icon: mdiFileJpgBox, icon: mdiFileJpgBox,
title: api.getJobName(JobName.ThumbnailGeneration), title: api.getJobName(JobName.ThumbnailGeneration),
subtitle: 'Regenerate JPEG and WebP thumbnails', subtitle: 'Generate large, small and blurred thumbnails for each asset, as well as thumbnails for each person',
}, },
[JobName.MetadataExtraction]: { [JobName.MetadataExtraction]: {
icon: mdiTable, icon: mdiTable,
title: api.getJobName(JobName.MetadataExtraction), title: api.getJobName(JobName.MetadataExtraction),
subtitle: 'Extract metadata information i.e. GPS, resolution...etc', subtitle: 'Extract metadata information from each asset, such as GPS and resolution',
}, },
[JobName.Library]: { [JobName.Library]: {
icon: mdiLibraryShelves, icon: mdiLibraryShelves,
@ -81,26 +81,27 @@
[JobName.ObjectTagging]: { [JobName.ObjectTagging]: {
icon: mdiTagMultiple, icon: mdiTagMultiple,
title: api.getJobName(JobName.ObjectTagging), title: api.getJobName(JobName.ObjectTagging),
subtitle: 'Run machine learning to tag objects\nNote that some assets may not have any objects detected', subtitle:
'Run machine learning on assets to tag objects\nNote that some assets may not have any objects detected',
disabled: !$featureFlags.tagImage, disabled: !$featureFlags.tagImage,
}, },
[JobName.ClipEncoding]: { [JobName.SmartSearch]: {
icon: mdiVectorCircle, icon: mdiImageSearch,
title: api.getJobName(JobName.ClipEncoding), title: api.getJobName(JobName.SmartSearch),
subtitle: 'Run machine learning to generate clip embeddings', subtitle: 'Run machine learning on assets to support smart search',
disabled: !$featureFlags.clipEncode, disabled: !$featureFlags.clipEncode,
}, },
[JobName.RecognizeFaces]: { [JobName.RecognizeFaces]: {
icon: mdiFaceRecognition, icon: mdiFaceRecognition,
title: api.getJobName(JobName.RecognizeFaces), title: api.getJobName(JobName.RecognizeFaces),
subtitle: 'Run machine learning to recognize faces', subtitle: 'Run machine learning on assets to recognize faces',
handleCommand: handleFaceCommand, handleCommand: handleFaceCommand,
disabled: !$featureFlags.facialRecognition, disabled: !$featureFlags.facialRecognition,
}, },
[JobName.VideoConversion]: { [JobName.VideoConversion]: {
icon: mdiVideo, icon: mdiVideo,
title: api.getJobName(JobName.VideoConversion), title: api.getJobName(JobName.VideoConversion),
subtitle: 'Transcode videos not in the desired format', subtitle: 'Transcode videos for wider compatibility with browsers and devices',
}, },
[JobName.StorageTemplateMigration]: { [JobName.StorageTemplateMigration]: {
icon: mdiFolderMove, icon: mdiFolderMove,

View File

@ -23,7 +23,7 @@
JobName.Library, JobName.Library,
JobName.Sidecar, JobName.Sidecar,
JobName.ObjectTagging, JobName.ObjectTagging,
JobName.ClipEncoding, JobName.SmartSearch,
JobName.RecognizeFaces, JobName.RecognizeFaces,
JobName.VideoConversion, JobName.VideoConversion,
JobName.StorageTemplateMigration, JobName.StorageTemplateMigration,