From 2dbf7c1c512f88a1a618dde5b23ef0f233423394 Mon Sep 17 00:00:00 2001 From: icarus Date: Sun, 19 Oct 2025 19:00:13 +0800 Subject: [PATCH] refactor(ocr): improve service initialization and registration Move availability checks to service instantiation Update registry to store service instances directly Simplify registration logic by removing redundant bind calls --- src/main/services/ocr/OcrService.ts | 28 +++++++++++-------- src/main/services/ocr/builtin/OvOcrService.ts | 17 +++++------ .../services/ocr/builtin/SystemOcrService.ts | 2 +- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/main/services/ocr/OcrService.ts b/src/main/services/ocr/OcrService.ts index 80cd547671..0dc188e0a8 100644 --- a/src/main/services/ocr/OcrService.ts +++ b/src/main/services/ocr/OcrService.ts @@ -1,8 +1,8 @@ import { loggerService } from '@logger' -import { isLinux } from '@main/constant' -import type { OcrHandler, OcrProvider, OcrResult, SupportedOcrFile } from '@types' +import type { OcrProvider, OcrResult, SupportedOcrFile } from '@types' import { BuiltinOcrProviderIds } from '@types' +import type { OcrBaseService } from './builtin/OcrBaseService' import { ovOcrService } from './builtin/OvOcrService' import { ppocrService } from './builtin/PpocrService' import { systemOcrService } from './builtin/SystemOcrService' @@ -11,13 +11,13 @@ import { tesseractService } from './builtin/TesseractService' const logger = loggerService.withContext('OcrService') export class OcrService { - private registry: Map = new Map() + private registry: Map = new Map() - register(providerId: string, handler: OcrHandler): void { + register(providerId: string, service: OcrBaseService): void { if (this.registry.has(providerId)) { logger.warn(`Provider ${providerId} has existing handler. Overwrited.`) } - this.registry.set(providerId, handler) + this.registry.set(providerId, service) } unregister(providerId: string): void { @@ -29,21 +29,25 @@ export class OcrService { } public async ocr(file: SupportedOcrFile, provider: OcrProvider): Promise { - const handler = this.registry.get(provider.id) - if (!handler) { + const service = this.registry.get(provider.id) + if (!service) { throw new Error(`Provider ${provider.id} is not registered`) } - return handler(file, provider.config) + return service.ocr(file, provider.config) } } export const ocrService = new OcrService() // Register built-in providers -ocrService.register(BuiltinOcrProviderIds.tesseract, tesseractService.ocr.bind(tesseractService)) +ocrService.register(BuiltinOcrProviderIds.tesseract, tesseractService) -!isLinux && ocrService.register(BuiltinOcrProviderIds.system, systemOcrService.ocr.bind(systemOcrService)) +if (systemOcrService) { + ocrService.register(BuiltinOcrProviderIds.system, systemOcrService) +} -ocrService.register(BuiltinOcrProviderIds.paddleocr, ppocrService.ocr.bind(ppocrService)) +ocrService.register(BuiltinOcrProviderIds.paddleocr, ppocrService) -ovOcrService.isAvailable() && ocrService.register(BuiltinOcrProviderIds.ovocr, ovOcrService.ocr.bind(ovOcrService)) +if (ovOcrService) { + ocrService.register(BuiltinOcrProviderIds.ovocr, ovOcrService) +} diff --git a/src/main/services/ocr/builtin/OvOcrService.ts b/src/main/services/ocr/builtin/OvOcrService.ts index 6e0eee1c37..0967866ff8 100644 --- a/src/main/services/ocr/builtin/OvOcrService.ts +++ b/src/main/services/ocr/builtin/OvOcrService.ts @@ -15,20 +15,17 @@ const execAsync = promisify(exec) const PATH_BAT_FILE = path.join(os.homedir(), '.cherrystudio', 'ovms', 'ovocr', 'run.npu.bat') +const isOvAvailable = + isWin && + os.cpus()[0].model.toLowerCase().includes('intel') && + os.cpus()[0].model.toLowerCase().includes('ultra') && + fs.existsSync(PATH_BAT_FILE) + export class OvOcrService extends OcrBaseService { constructor() { super() } - public isAvailable(): boolean { - return ( - isWin && - os.cpus()[0].model.toLowerCase().includes('intel') && - os.cpus()[0].model.toLowerCase().includes('ultra') && - fs.existsSync(PATH_BAT_FILE) - ) - } - private getOvOcrPath(): string { return path.join(os.homedir(), '.cherrystudio', 'ovms', 'ovocr') } @@ -126,4 +123,4 @@ export class OvOcrService extends OcrBaseService { } } -export const ovOcrService = new OvOcrService() +export const ovOcrService = isOvAvailable ? new OvOcrService() : undefined diff --git a/src/main/services/ocr/builtin/SystemOcrService.ts b/src/main/services/ocr/builtin/SystemOcrService.ts index f166718e4a..70872b5dc5 100644 --- a/src/main/services/ocr/builtin/SystemOcrService.ts +++ b/src/main/services/ocr/builtin/SystemOcrService.ts @@ -31,4 +31,4 @@ export class SystemOcrService extends OcrBaseService { } } -export const systemOcrService = new SystemOcrService() +export const systemOcrService = !isLinux ? new SystemOcrService() : undefined