diff --git a/cli/src/api/open-api/api.ts b/cli/src/api/open-api/api.ts index 04bbc4258..2ce8d3ec5 100644 --- a/cli/src/api/open-api/api.ts +++ b/cli/src/api/open-api/api.ts @@ -355,12 +355,6 @@ export interface AllJobStatusResponseDto { * @memberof AllJobStatusResponseDto */ 'backgroundTask': JobStatusDto; - /** - * - * @type {JobStatusDto} - * @memberof AllJobStatusResponseDto - */ - 'clipEncoding': JobStatusDto; /** * * @type {JobStatusDto} @@ -403,6 +397,12 @@ export interface AllJobStatusResponseDto { * @memberof AllJobStatusResponseDto */ 'sidecar': JobStatusDto; + /** + * + * @type {JobStatusDto} + * @memberof AllJobStatusResponseDto + */ + 'smartSearch': JobStatusDto; /** * * @type {JobStatusDto} @@ -2017,7 +2017,7 @@ export const JobName = { VideoConversion: 'videoConversion', ObjectTagging: 'objectTagging', RecognizeFaces: 'recognizeFaces', - ClipEncoding: 'clipEncoding', + SmartSearch: 'smartSearch', BackgroundTask: 'backgroundTask', StorageTemplateMigration: 'storageTemplateMigration', Migration: 'migration', @@ -3785,12 +3785,6 @@ export interface SystemConfigJobDto { * @memberof SystemConfigJobDto */ 'backgroundTask': JobSettingsDto; - /** - * - * @type {JobSettingsDto} - * @memberof SystemConfigJobDto - */ - 'clipEncoding': JobSettingsDto; /** * * @type {JobSettingsDto} @@ -3833,6 +3827,12 @@ export interface SystemConfigJobDto { * @memberof SystemConfigJobDto */ 'sidecar': JobSettingsDto; + /** + * + * @type {JobSettingsDto} + * @memberof SystemConfigJobDto + */ + 'smartSearch': JobSettingsDto; /** * * @type {JobSettingsDto} diff --git a/docs/docs/FAQ.md b/docs/docs/FAQ.md index 27906660e..39696e6f9 100644 --- a/docs/docs/FAQ.md +++ b/docs/docs/FAQ.md @@ -26,7 +26,7 @@ Immich optionally uses machine learning for several features. However, it can be ### 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. - Under Settings > Transcoding Settings > Threads, set the number of threads to a low number like 1 or 2. diff --git a/mobile/openapi/doc/AllJobStatusResponseDto.md b/mobile/openapi/doc/AllJobStatusResponseDto.md index 71b50efbe..7b54ead21 100644 --- a/mobile/openapi/doc/AllJobStatusResponseDto.md +++ b/mobile/openapi/doc/AllJobStatusResponseDto.md @@ -9,7 +9,6 @@ import 'package:openapi/api.dart'; Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **backgroundTask** | [**JobStatusDto**](JobStatusDto.md) | | -**clipEncoding** | [**JobStatusDto**](JobStatusDto.md) | | **library_** | [**JobStatusDto**](JobStatusDto.md) | | **metadataExtraction** | [**JobStatusDto**](JobStatusDto.md) | | **migration** | [**JobStatusDto**](JobStatusDto.md) | | @@ -17,6 +16,7 @@ Name | Type | Description | Notes **recognizeFaces** | [**JobStatusDto**](JobStatusDto.md) | | **search** | [**JobStatusDto**](JobStatusDto.md) | | **sidecar** | [**JobStatusDto**](JobStatusDto.md) | | +**smartSearch** | [**JobStatusDto**](JobStatusDto.md) | | **storageTemplateMigration** | [**JobStatusDto**](JobStatusDto.md) | | **thumbnailGeneration** | [**JobStatusDto**](JobStatusDto.md) | | **videoConversion** | [**JobStatusDto**](JobStatusDto.md) | | diff --git a/mobile/openapi/doc/SystemConfigJobDto.md b/mobile/openapi/doc/SystemConfigJobDto.md index 5660b245e..b0944930d 100644 --- a/mobile/openapi/doc/SystemConfigJobDto.md +++ b/mobile/openapi/doc/SystemConfigJobDto.md @@ -9,7 +9,6 @@ import 'package:openapi/api.dart'; Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **backgroundTask** | [**JobSettingsDto**](JobSettingsDto.md) | | -**clipEncoding** | [**JobSettingsDto**](JobSettingsDto.md) | | **library_** | [**JobSettingsDto**](JobSettingsDto.md) | | **metadataExtraction** | [**JobSettingsDto**](JobSettingsDto.md) | | **migration** | [**JobSettingsDto**](JobSettingsDto.md) | | @@ -17,6 +16,7 @@ Name | Type | Description | Notes **recognizeFaces** | [**JobSettingsDto**](JobSettingsDto.md) | | **search** | [**JobSettingsDto**](JobSettingsDto.md) | | **sidecar** | [**JobSettingsDto**](JobSettingsDto.md) | | +**smartSearch** | [**JobSettingsDto**](JobSettingsDto.md) | | **storageTemplateMigration** | [**JobSettingsDto**](JobSettingsDto.md) | | **thumbnailGeneration** | [**JobSettingsDto**](JobSettingsDto.md) | | **videoConversion** | [**JobSettingsDto**](JobSettingsDto.md) | | diff --git a/mobile/openapi/lib/model/all_job_status_response_dto.dart b/mobile/openapi/lib/model/all_job_status_response_dto.dart index 4d3008a3b..138d1cd79 100644 --- a/mobile/openapi/lib/model/all_job_status_response_dto.dart +++ b/mobile/openapi/lib/model/all_job_status_response_dto.dart @@ -14,7 +14,6 @@ class AllJobStatusResponseDto { /// Returns a new [AllJobStatusResponseDto] instance. AllJobStatusResponseDto({ required this.backgroundTask, - required this.clipEncoding, required this.library_, required this.metadataExtraction, required this.migration, @@ -22,6 +21,7 @@ class AllJobStatusResponseDto { required this.recognizeFaces, required this.search, required this.sidecar, + required this.smartSearch, required this.storageTemplateMigration, required this.thumbnailGeneration, required this.videoConversion, @@ -29,8 +29,6 @@ class AllJobStatusResponseDto { JobStatusDto backgroundTask; - JobStatusDto clipEncoding; - JobStatusDto library_; JobStatusDto metadataExtraction; @@ -45,6 +43,8 @@ class AllJobStatusResponseDto { JobStatusDto sidecar; + JobStatusDto smartSearch; + JobStatusDto storageTemplateMigration; JobStatusDto thumbnailGeneration; @@ -54,7 +54,6 @@ class AllJobStatusResponseDto { @override bool operator ==(Object other) => identical(this, other) || other is AllJobStatusResponseDto && other.backgroundTask == backgroundTask && - other.clipEncoding == clipEncoding && other.library_ == library_ && other.metadataExtraction == metadataExtraction && other.migration == migration && @@ -62,6 +61,7 @@ class AllJobStatusResponseDto { other.recognizeFaces == recognizeFaces && other.search == search && other.sidecar == sidecar && + other.smartSearch == smartSearch && other.storageTemplateMigration == storageTemplateMigration && other.thumbnailGeneration == thumbnailGeneration && other.videoConversion == videoConversion; @@ -70,7 +70,6 @@ class AllJobStatusResponseDto { int get hashCode => // ignore: unnecessary_parenthesis (backgroundTask.hashCode) + - (clipEncoding.hashCode) + (library_.hashCode) + (metadataExtraction.hashCode) + (migration.hashCode) + @@ -78,17 +77,17 @@ class AllJobStatusResponseDto { (recognizeFaces.hashCode) + (search.hashCode) + (sidecar.hashCode) + + (smartSearch.hashCode) + (storageTemplateMigration.hashCode) + (thumbnailGeneration.hashCode) + (videoConversion.hashCode); @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 toJson() { final json = {}; json[r'backgroundTask'] = this.backgroundTask; - json[r'clipEncoding'] = this.clipEncoding; json[r'library'] = this.library_; json[r'metadataExtraction'] = this.metadataExtraction; json[r'migration'] = this.migration; @@ -96,6 +95,7 @@ class AllJobStatusResponseDto { json[r'recognizeFaces'] = this.recognizeFaces; json[r'search'] = this.search; json[r'sidecar'] = this.sidecar; + json[r'smartSearch'] = this.smartSearch; json[r'storageTemplateMigration'] = this.storageTemplateMigration; json[r'thumbnailGeneration'] = this.thumbnailGeneration; json[r'videoConversion'] = this.videoConversion; @@ -111,7 +111,6 @@ class AllJobStatusResponseDto { return AllJobStatusResponseDto( backgroundTask: JobStatusDto.fromJson(json[r'backgroundTask'])!, - clipEncoding: JobStatusDto.fromJson(json[r'clipEncoding'])!, library_: JobStatusDto.fromJson(json[r'library'])!, metadataExtraction: JobStatusDto.fromJson(json[r'metadataExtraction'])!, migration: JobStatusDto.fromJson(json[r'migration'])!, @@ -119,6 +118,7 @@ class AllJobStatusResponseDto { recognizeFaces: JobStatusDto.fromJson(json[r'recognizeFaces'])!, search: JobStatusDto.fromJson(json[r'search'])!, sidecar: JobStatusDto.fromJson(json[r'sidecar'])!, + smartSearch: JobStatusDto.fromJson(json[r'smartSearch'])!, storageTemplateMigration: JobStatusDto.fromJson(json[r'storageTemplateMigration'])!, thumbnailGeneration: JobStatusDto.fromJson(json[r'thumbnailGeneration'])!, videoConversion: JobStatusDto.fromJson(json[r'videoConversion'])!, @@ -170,7 +170,6 @@ class AllJobStatusResponseDto { /// The list of required keys that must be present in a JSON. static const requiredKeys = { 'backgroundTask', - 'clipEncoding', 'library', 'metadataExtraction', 'migration', @@ -178,6 +177,7 @@ class AllJobStatusResponseDto { 'recognizeFaces', 'search', 'sidecar', + 'smartSearch', 'storageTemplateMigration', 'thumbnailGeneration', 'videoConversion', diff --git a/mobile/openapi/lib/model/job_name.dart b/mobile/openapi/lib/model/job_name.dart index c1008d079..bc88c2efd 100644 --- a/mobile/openapi/lib/model/job_name.dart +++ b/mobile/openapi/lib/model/job_name.dart @@ -28,7 +28,7 @@ class JobName { static const videoConversion = JobName._(r'videoConversion'); static const objectTagging = JobName._(r'objectTagging'); 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 storageTemplateMigration = JobName._(r'storageTemplateMigration'); static const migration = JobName._(r'migration'); @@ -43,7 +43,7 @@ class JobName { videoConversion, objectTagging, recognizeFaces, - clipEncoding, + smartSearch, backgroundTask, storageTemplateMigration, migration, @@ -93,7 +93,7 @@ class JobNameTypeTransformer { case r'videoConversion': return JobName.videoConversion; case r'objectTagging': return JobName.objectTagging; 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'storageTemplateMigration': return JobName.storageTemplateMigration; case r'migration': return JobName.migration; diff --git a/mobile/openapi/lib/model/system_config_job_dto.dart b/mobile/openapi/lib/model/system_config_job_dto.dart index d7ff7ea6f..c8da684ae 100644 --- a/mobile/openapi/lib/model/system_config_job_dto.dart +++ b/mobile/openapi/lib/model/system_config_job_dto.dart @@ -14,7 +14,6 @@ class SystemConfigJobDto { /// Returns a new [SystemConfigJobDto] instance. SystemConfigJobDto({ required this.backgroundTask, - required this.clipEncoding, required this.library_, required this.metadataExtraction, required this.migration, @@ -22,6 +21,7 @@ class SystemConfigJobDto { required this.recognizeFaces, required this.search, required this.sidecar, + required this.smartSearch, required this.storageTemplateMigration, required this.thumbnailGeneration, required this.videoConversion, @@ -29,8 +29,6 @@ class SystemConfigJobDto { JobSettingsDto backgroundTask; - JobSettingsDto clipEncoding; - JobSettingsDto library_; JobSettingsDto metadataExtraction; @@ -45,6 +43,8 @@ class SystemConfigJobDto { JobSettingsDto sidecar; + JobSettingsDto smartSearch; + JobSettingsDto storageTemplateMigration; JobSettingsDto thumbnailGeneration; @@ -54,7 +54,6 @@ class SystemConfigJobDto { @override bool operator ==(Object other) => identical(this, other) || other is SystemConfigJobDto && other.backgroundTask == backgroundTask && - other.clipEncoding == clipEncoding && other.library_ == library_ && other.metadataExtraction == metadataExtraction && other.migration == migration && @@ -62,6 +61,7 @@ class SystemConfigJobDto { other.recognizeFaces == recognizeFaces && other.search == search && other.sidecar == sidecar && + other.smartSearch == smartSearch && other.storageTemplateMigration == storageTemplateMigration && other.thumbnailGeneration == thumbnailGeneration && other.videoConversion == videoConversion; @@ -70,7 +70,6 @@ class SystemConfigJobDto { int get hashCode => // ignore: unnecessary_parenthesis (backgroundTask.hashCode) + - (clipEncoding.hashCode) + (library_.hashCode) + (metadataExtraction.hashCode) + (migration.hashCode) + @@ -78,17 +77,17 @@ class SystemConfigJobDto { (recognizeFaces.hashCode) + (search.hashCode) + (sidecar.hashCode) + + (smartSearch.hashCode) + (storageTemplateMigration.hashCode) + (thumbnailGeneration.hashCode) + (videoConversion.hashCode); @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 toJson() { final json = {}; json[r'backgroundTask'] = this.backgroundTask; - json[r'clipEncoding'] = this.clipEncoding; json[r'library'] = this.library_; json[r'metadataExtraction'] = this.metadataExtraction; json[r'migration'] = this.migration; @@ -96,6 +95,7 @@ class SystemConfigJobDto { json[r'recognizeFaces'] = this.recognizeFaces; json[r'search'] = this.search; json[r'sidecar'] = this.sidecar; + json[r'smartSearch'] = this.smartSearch; json[r'storageTemplateMigration'] = this.storageTemplateMigration; json[r'thumbnailGeneration'] = this.thumbnailGeneration; json[r'videoConversion'] = this.videoConversion; @@ -111,7 +111,6 @@ class SystemConfigJobDto { return SystemConfigJobDto( backgroundTask: JobSettingsDto.fromJson(json[r'backgroundTask'])!, - clipEncoding: JobSettingsDto.fromJson(json[r'clipEncoding'])!, library_: JobSettingsDto.fromJson(json[r'library'])!, metadataExtraction: JobSettingsDto.fromJson(json[r'metadataExtraction'])!, migration: JobSettingsDto.fromJson(json[r'migration'])!, @@ -119,6 +118,7 @@ class SystemConfigJobDto { recognizeFaces: JobSettingsDto.fromJson(json[r'recognizeFaces'])!, search: JobSettingsDto.fromJson(json[r'search'])!, sidecar: JobSettingsDto.fromJson(json[r'sidecar'])!, + smartSearch: JobSettingsDto.fromJson(json[r'smartSearch'])!, storageTemplateMigration: JobSettingsDto.fromJson(json[r'storageTemplateMigration'])!, thumbnailGeneration: JobSettingsDto.fromJson(json[r'thumbnailGeneration'])!, videoConversion: JobSettingsDto.fromJson(json[r'videoConversion'])!, @@ -170,7 +170,6 @@ class SystemConfigJobDto { /// The list of required keys that must be present in a JSON. static const requiredKeys = { 'backgroundTask', - 'clipEncoding', 'library', 'metadataExtraction', 'migration', @@ -178,6 +177,7 @@ class SystemConfigJobDto { 'recognizeFaces', 'search', 'sidecar', + 'smartSearch', 'storageTemplateMigration', 'thumbnailGeneration', 'videoConversion', diff --git a/mobile/openapi/test/all_job_status_response_dto_test.dart b/mobile/openapi/test/all_job_status_response_dto_test.dart index 4f6d964cb..fdbafc544 100644 --- a/mobile/openapi/test/all_job_status_response_dto_test.dart +++ b/mobile/openapi/test/all_job_status_response_dto_test.dart @@ -21,11 +21,6 @@ void main() { // TODO }); - // JobStatusDto clipEncoding - test('to test the property `clipEncoding`', () async { - // TODO - }); - // JobStatusDto library_ test('to test the property `library_`', () async { // TODO @@ -61,6 +56,11 @@ void main() { // TODO }); + // JobStatusDto smartSearch + test('to test the property `smartSearch`', () async { + // TODO + }); + // JobStatusDto storageTemplateMigration test('to test the property `storageTemplateMigration`', () async { // TODO diff --git a/mobile/openapi/test/system_config_job_dto_test.dart b/mobile/openapi/test/system_config_job_dto_test.dart index 4900e722f..2a85c0ff5 100644 --- a/mobile/openapi/test/system_config_job_dto_test.dart +++ b/mobile/openapi/test/system_config_job_dto_test.dart @@ -21,11 +21,6 @@ void main() { // TODO }); - // JobSettingsDto clipEncoding - test('to test the property `clipEncoding`', () async { - // TODO - }); - // JobSettingsDto library_ test('to test the property `library_`', () async { // TODO @@ -61,6 +56,11 @@ void main() { // TODO }); + // JobSettingsDto smartSearch + test('to test the property `smartSearch`', () async { + // TODO + }); + // JobSettingsDto storageTemplateMigration test('to test the property `storageTemplateMigration`', () async { // TODO diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 4de277f2b..24c730676 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -6470,9 +6470,6 @@ "backgroundTask": { "$ref": "#/components/schemas/JobStatusDto" }, - "clipEncoding": { - "$ref": "#/components/schemas/JobStatusDto" - }, "library": { "$ref": "#/components/schemas/JobStatusDto" }, @@ -6494,6 +6491,9 @@ "sidecar": { "$ref": "#/components/schemas/JobStatusDto" }, + "smartSearch": { + "$ref": "#/components/schemas/JobStatusDto" + }, "storageTemplateMigration": { "$ref": "#/components/schemas/JobStatusDto" }, @@ -6509,7 +6509,7 @@ "metadataExtraction", "videoConversion", "objectTagging", - "clipEncoding", + "smartSearch", "storageTemplateMigration", "migration", "backgroundTask", @@ -7821,7 +7821,7 @@ "videoConversion", "objectTagging", "recognizeFaces", - "clipEncoding", + "smartSearch", "backgroundTask", "storageTemplateMigration", "migration", @@ -9182,9 +9182,6 @@ "backgroundTask": { "$ref": "#/components/schemas/JobSettingsDto" }, - "clipEncoding": { - "$ref": "#/components/schemas/JobSettingsDto" - }, "library": { "$ref": "#/components/schemas/JobSettingsDto" }, @@ -9206,6 +9203,9 @@ "sidecar": { "$ref": "#/components/schemas/JobSettingsDto" }, + "smartSearch": { + "$ref": "#/components/schemas/JobSettingsDto" + }, "storageTemplateMigration": { "$ref": "#/components/schemas/JobSettingsDto" }, @@ -9221,7 +9221,7 @@ "metadataExtraction", "videoConversion", "objectTagging", - "clipEncoding", + "smartSearch", "storageTemplateMigration", "migration", "backgroundTask", diff --git a/server/src/domain/job/job.constants.ts b/server/src/domain/job/job.constants.ts index 287d22db6..50c4fbc51 100644 --- a/server/src/domain/job/job.constants.ts +++ b/server/src/domain/job/job.constants.ts @@ -4,7 +4,7 @@ export enum QueueName { VIDEO_CONVERSION = 'videoConversion', OBJECT_TAGGING = 'objectTagging', RECOGNIZE_FACES = 'recognizeFaces', - CLIP_ENCODING = 'clipEncoding', + SMART_SEARCH = 'smartSearch', BACKGROUND_TASK = 'backgroundTask', STORAGE_TEMPLATE_MIGRATION = 'storageTemplateMigration', MIGRATION = 'migration', @@ -135,8 +135,8 @@ export const JOBS_TO_QUEUE: Record = { [JobName.RECOGNIZE_FACES]: QueueName.RECOGNIZE_FACES, // clip - [JobName.QUEUE_ENCODE_CLIP]: QueueName.CLIP_ENCODING, - [JobName.ENCODE_CLIP]: QueueName.CLIP_ENCODING, + [JobName.QUEUE_ENCODE_CLIP]: QueueName.SMART_SEARCH, + [JobName.ENCODE_CLIP]: QueueName.SMART_SEARCH, // XMP sidecars [JobName.QUEUE_SIDECAR]: QueueName.SIDECAR, diff --git a/server/src/domain/job/job.dto.ts b/server/src/domain/job/job.dto.ts index ec4cf7bb6..cdbb3fa8e 100644 --- a/server/src/domain/job/job.dto.ts +++ b/server/src/domain/job/job.dto.ts @@ -63,7 +63,7 @@ export class AllJobStatusResponseDto implements Record [QueueName.OBJECT_TAGGING]!: JobStatusDto; @ApiProperty({ type: JobStatusDto }) - [QueueName.CLIP_ENCODING]!: JobStatusDto; + [QueueName.SMART_SEARCH]!: JobStatusDto; @ApiProperty({ type: JobStatusDto }) [QueueName.STORAGE_TEMPLATE_MIGRATION]!: JobStatusDto; diff --git a/server/src/domain/job/job.service.spec.ts b/server/src/domain/job/job.service.spec.ts index c37f1ad21..0ce36cb89 100644 --- a/server/src/domain/job/job.service.spec.ts +++ b/server/src/domain/job/job.service.spec.ts @@ -97,7 +97,7 @@ describe(JobService.name, () => { await expect(sut.getAllJobsStatus()).resolves.toEqual({ [QueueName.BACKGROUND_TASK]: expectedJobStatus, - [QueueName.CLIP_ENCODING]: expectedJobStatus, + [QueueName.SMART_SEARCH]: expectedJobStatus, [QueueName.METADATA_EXTRACTION]: expectedJobStatus, [QueueName.OBJECT_TAGGING]: expectedJobStatus, [QueueName.SEARCH]: expectedJobStatus, @@ -171,7 +171,7 @@ describe(JobService.name, () => { it('should handle a start clip encoding command', async () => { 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 } }); }); @@ -232,7 +232,7 @@ describe(JobService.name, () => { SystemConfigCore.create(newSystemConfigRepositoryMock(false)).config$.next({ job: { [QueueName.BACKGROUND_TASK]: { concurrency: 10 }, - [QueueName.CLIP_ENCODING]: { concurrency: 10 }, + [QueueName.SMART_SEARCH]: { concurrency: 10 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 10 }, [QueueName.OBJECT_TAGGING]: { concurrency: 10 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 10 }, @@ -247,7 +247,7 @@ describe(JobService.name, () => { } as SystemConfig); 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.OBJECT_TAGGING, 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 }> = [ { - queue: QueueName.CLIP_ENCODING, + queue: QueueName.SMART_SEARCH, feature: FeatureFlag.CLIP_ENCODE, configKey: SystemConfigKey.MACHINE_LEARNING_CLIP_ENABLED, }, diff --git a/server/src/domain/job/job.service.ts b/server/src/domain/job/job.service.ts index 0e266c4c4..37b2f0733 100644 --- a/server/src/domain/job/job.service.ts +++ b/server/src/domain/job/job.service.ts @@ -98,7 +98,7 @@ export class JobService { await this.configCore.requireFeature(FeatureFlag.TAG_IMAGE); 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); return this.jobRepository.queue({ name: JobName.QUEUE_ENCODE_CLIP, data: { force } }); diff --git a/server/src/domain/smart-info/smart-info.service.ts b/server/src/domain/smart-info/smart-info.service.ts index 88208dec9..2a73ecf6e 100644 --- a/server/src/domain/smart-info/smart-info.service.ts +++ b/server/src/domain/smart-info/smart-info.service.ts @@ -29,13 +29,13 @@ export class SmartInfoService { } 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) { this.logger.verbose('Waiting for CLIP encoding queue to stop...'); 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.jobRepository.resume(QueueName.CLIP_ENCODING); + await this.jobRepository.resume(QueueName.SMART_SEARCH); } async handleQueueObjectTagging({ force }: IBaseJob) { diff --git a/server/src/domain/system-config/dto/system-config-job.dto.ts b/server/src/domain/system-config/dto/system-config-job.dto.ts index e3d19418f..98e382028 100644 --- a/server/src/domain/system-config/dto/system-config-job.dto.ts +++ b/server/src/domain/system-config/dto/system-config-job.dto.ts @@ -39,7 +39,7 @@ export class SystemConfigJobDto implements Record { @ValidateNested() @IsObject() @Type(() => JobSettingsDto) - [QueueName.CLIP_ENCODING]!: JobSettingsDto; + [QueueName.SMART_SEARCH]!: JobSettingsDto; @ApiProperty({ type: JobSettingsDto }) @ValidateNested() diff --git a/server/src/domain/system-config/system-config.core.ts b/server/src/domain/system-config/system-config.core.ts index 2eeb80538..b4b6afc7e 100644 --- a/server/src/domain/system-config/system-config.core.ts +++ b/server/src/domain/system-config/system-config.core.ts @@ -47,7 +47,7 @@ export const defaults = Object.freeze({ }, job: { [QueueName.BACKGROUND_TASK]: { concurrency: 5 }, - [QueueName.CLIP_ENCODING]: { concurrency: 2 }, + [QueueName.SMART_SEARCH]: { concurrency: 2 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 5 }, [QueueName.OBJECT_TAGGING]: { concurrency: 2 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 2 }, diff --git a/server/src/domain/system-config/system-config.service.spec.ts b/server/src/domain/system-config/system-config.service.spec.ts index 4ab1880d6..3951083c1 100644 --- a/server/src/domain/system-config/system-config.service.spec.ts +++ b/server/src/domain/system-config/system-config.service.spec.ts @@ -27,7 +27,7 @@ const updates: SystemConfigEntity[] = [ const updatedConfig = Object.freeze({ job: { [QueueName.BACKGROUND_TASK]: { concurrency: 5 }, - [QueueName.CLIP_ENCODING]: { concurrency: 2 }, + [QueueName.SMART_SEARCH]: { concurrency: 2 }, [QueueName.METADATA_EXTRACTION]: { concurrency: 5 }, [QueueName.OBJECT_TAGGING]: { concurrency: 2 }, [QueueName.RECOGNIZE_FACES]: { concurrency: 2 }, diff --git a/web/src/api/api.ts b/web/src/api/api.ts index aecf28e12..a3ff5dbf1 100644 --- a/web/src/api/api.ts +++ b/web/src/api/api.ts @@ -136,7 +136,7 @@ class ImmichApi { [JobName.MetadataExtraction]: 'Extract Metadata', [JobName.Sidecar]: 'Sidecar Metadata', [JobName.ObjectTagging]: 'Tag Objects', - [JobName.ClipEncoding]: 'Encode Clip', + [JobName.SmartSearch]: 'Smart Search', [JobName.RecognizeFaces]: 'Recognize Faces', [JobName.VideoConversion]: 'Transcode Videos', [JobName.StorageTemplateMigration]: 'Storage Template Migration', diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 04bbc4258..2ce8d3ec5 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -355,12 +355,6 @@ export interface AllJobStatusResponseDto { * @memberof AllJobStatusResponseDto */ 'backgroundTask': JobStatusDto; - /** - * - * @type {JobStatusDto} - * @memberof AllJobStatusResponseDto - */ - 'clipEncoding': JobStatusDto; /** * * @type {JobStatusDto} @@ -403,6 +397,12 @@ export interface AllJobStatusResponseDto { * @memberof AllJobStatusResponseDto */ 'sidecar': JobStatusDto; + /** + * + * @type {JobStatusDto} + * @memberof AllJobStatusResponseDto + */ + 'smartSearch': JobStatusDto; /** * * @type {JobStatusDto} @@ -2017,7 +2017,7 @@ export const JobName = { VideoConversion: 'videoConversion', ObjectTagging: 'objectTagging', RecognizeFaces: 'recognizeFaces', - ClipEncoding: 'clipEncoding', + SmartSearch: 'smartSearch', BackgroundTask: 'backgroundTask', StorageTemplateMigration: 'storageTemplateMigration', Migration: 'migration', @@ -3785,12 +3785,6 @@ export interface SystemConfigJobDto { * @memberof SystemConfigJobDto */ 'backgroundTask': JobSettingsDto; - /** - * - * @type {JobSettingsDto} - * @memberof SystemConfigJobDto - */ - 'clipEncoding': JobSettingsDto; /** * * @type {JobSettingsDto} @@ -3833,6 +3827,12 @@ export interface SystemConfigJobDto { * @memberof SystemConfigJobDto */ 'sidecar': JobSettingsDto; + /** + * + * @type {JobSettingsDto} + * @memberof SystemConfigJobDto + */ + 'smartSearch': JobSettingsDto; /** * * @type {JobSettingsDto} diff --git a/web/src/lib/components/admin-page/jobs/jobs-panel.svelte b/web/src/lib/components/admin-page/jobs/jobs-panel.svelte index 350ff3b21..e2c909af6 100644 --- a/web/src/lib/components/admin-page/jobs/jobs-panel.svelte +++ b/web/src/lib/components/admin-page/jobs/jobs-panel.svelte @@ -12,10 +12,10 @@ mdiFileJpgBox, mdiFileXmlBox, mdiFolderMove, + mdiImageSearch, mdiLibraryShelves, mdiTable, mdiTagMultiple, - mdiVectorCircle, mdiVideo, } from '@mdi/js'; import ConfirmDialogue from '../../shared-components/confirm-dialogue.svelte'; @@ -56,12 +56,12 @@ [JobName.ThumbnailGeneration]: { icon: mdiFileJpgBox, 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]: { icon: mdiTable, 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]: { icon: mdiLibraryShelves, @@ -81,26 +81,27 @@ [JobName.ObjectTagging]: { icon: mdiTagMultiple, 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, }, - [JobName.ClipEncoding]: { - icon: mdiVectorCircle, - title: api.getJobName(JobName.ClipEncoding), - subtitle: 'Run machine learning to generate clip embeddings', + [JobName.SmartSearch]: { + icon: mdiImageSearch, + title: api.getJobName(JobName.SmartSearch), + subtitle: 'Run machine learning on assets to support smart search', disabled: !$featureFlags.clipEncode, }, [JobName.RecognizeFaces]: { icon: mdiFaceRecognition, title: api.getJobName(JobName.RecognizeFaces), - subtitle: 'Run machine learning to recognize faces', + subtitle: 'Run machine learning on assets to recognize faces', handleCommand: handleFaceCommand, disabled: !$featureFlags.facialRecognition, }, [JobName.VideoConversion]: { icon: mdiVideo, 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]: { icon: mdiFolderMove, diff --git a/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte b/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte index f102e791d..96a379139 100644 --- a/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte +++ b/web/src/lib/components/admin-page/settings/job-settings/job-settings.svelte @@ -23,7 +23,7 @@ JobName.Library, JobName.Sidecar, JobName.ObjectTagging, - JobName.ClipEncoding, + JobName.SmartSearch, JobName.RecognizeFaces, JobName.VideoConversion, JobName.StorageTemplateMigration,