Compare commits
No commits in common. "77f8bd4a60e2d85d46c4a4b447e27e7674e74078" and "4aad7e32551cc15845a08c5861b091bb832023f2" have entirely different histories.
77f8bd4a60
...
4aad7e3255
25
src/main.ts
25
src/main.ts
@ -12,7 +12,6 @@ interface VoiceNoteData {
|
|||||||
// провайдера и команда его проверки.
|
// провайдера и команда его проверки.
|
||||||
export default class VoiceNotePlugin extends Plugin {
|
export default class VoiceNotePlugin extends Plugin {
|
||||||
override settings: VoiceNoteData = { openai: readSettings(undefined) };
|
override settings: VoiceNoteData = { openai: readSettings(undefined) };
|
||||||
private data: Record<string, unknown> = {};
|
|
||||||
private readonly controller = new AbortController();
|
private readonly controller = new AbortController();
|
||||||
private transcriber = new OpenAiTranscriber(obsidianHttp, () => this.settings.openai, Math.random);
|
private transcriber = new OpenAiTranscriber(obsidianHttp, () => this.settings.openai, Math.random);
|
||||||
|
|
||||||
@ -31,20 +30,16 @@ export default class VoiceNotePlugin extends Plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async loadSettings(): Promise<void> {
|
async loadSettings(): Promise<void> {
|
||||||
const data: unknown = await this.loadData();
|
const data = (await this.loadData()) as { openai?: unknown } | null;
|
||||||
this.data = data !== null && typeof data === 'object' && !Array.isArray(data) ? (data as Record<string, unknown>) : {};
|
this.settings = { openai: readSettings(data?.openai) };
|
||||||
this.settings = { openai: readSettings(this.data.openai) };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ключи data.json, которых плагин пока не знает, сохраняются как были при загрузке.
|
|
||||||
async saveSettings(): Promise<void> {
|
async saveSettings(): Promise<void> {
|
||||||
await this.saveData({ ...this.data, ...this.settings });
|
await this.saveData(this.settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Только уведомление: заметки, frontmatter и очередь не трогаются.
|
// Только уведомление: заметки, frontmatter и очередь не трогаются.
|
||||||
// После выгрузки плагина (signal.aborted) уведомлений не показывает.
|
private async checkTranscriber(): Promise<void> {
|
||||||
async checkTranscriber(): Promise<void> {
|
|
||||||
const signal = this.controller.signal;
|
|
||||||
const files = this.app.vault.getFiles();
|
const files = this.app.vault.getFiles();
|
||||||
const picked = pickCheckAudio(files.map((f) => f.path));
|
const picked = pickCheckAudio(files.map((f) => f.path));
|
||||||
const file = picked && files.find((f) => f.path === picked.path);
|
const file = picked && files.find((f) => f.path === picked.path);
|
||||||
@ -53,16 +48,12 @@ export default class VoiceNotePlugin extends Plugin {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
new Notice(`Проверка провайдера: ${picked.path}…`);
|
new Notice(`Проверка провайдера: ${picked.path}…`);
|
||||||
let audio: ArrayBuffer;
|
|
||||||
try {
|
try {
|
||||||
audio = await this.app.vault.readBinary(file);
|
const audio = await this.app.vault.readBinary(file);
|
||||||
|
const result = await this.transcriber.transcribe(audio, picked.mime, this.controller.signal);
|
||||||
|
new Notice(checkNotice(result), 10_000);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (!signal.aborted) new Notice(`Не удалось прочитать ${picked.path}: ${e instanceof Error ? e.message : String(e)}`, 10_000);
|
new Notice(`Не удалось прочитать ${picked.path}: ${e instanceof Error ? e.message : String(e)}`, 10_000);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if (signal.aborted) return;
|
|
||||||
// transcribe() не бросает: любая ошибка приходит в result.
|
|
||||||
const result = await this.transcriber.transcribe(audio, picked.mime, signal);
|
|
||||||
if (!signal.aborted) new Notice(checkNotice(result), 10_000);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
import { type App, PluginSettingTab, Setting } from 'obsidian';
|
import { type App, PluginSettingTab, Setting } from 'obsidian';
|
||||||
import { SOURCE_DIR } from '../core/naming';
|
|
||||||
import type { OpenAiSettings } from '../core/openai';
|
import type { OpenAiSettings } from '../core/openai';
|
||||||
import type VoiceNotePlugin from '../main';
|
import type VoiceNotePlugin from '../main';
|
||||||
|
|
||||||
@ -19,12 +18,6 @@ export class VoiceNoteSettingTab extends PluginSettingTab {
|
|||||||
this.field('Модель', 'Например, gpt-4o-transcribe', 'model');
|
this.field('Модель', 'Например, gpt-4o-transcribe', 'model');
|
||||||
this.field('API-ключ', 'Хранится только в data.json плагина и синхронизируется вместе с vault', 'apiKey', true);
|
this.field('API-ключ', 'Хранится только в data.json плагина и синхронизируется вместе с vault', 'apiKey', true);
|
||||||
this.field('Язык', 'Код языка (ru, en). Пусто — модель определяет язык сама', 'language');
|
this.field('Язык', 'Код языка (ru, en). Пусто — модель определяет язык сама', 'language');
|
||||||
new Setting(containerEl)
|
|
||||||
.setName('Проверка провайдера')
|
|
||||||
.setDesc(
|
|
||||||
`Отправит последнюю запись из ${SOURCE_DIR}/ и покажет результат в уведомлении. То же — команда «Проверить провайдер распознавания».`,
|
|
||||||
)
|
|
||||||
.addButton((button) => button.setButtonText('Проверить').onClick(() => void this.plugin.checkTranscriber()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private field(name: string, desc: string, key: keyof OpenAiSettings, secret = false): void {
|
private field(name: string, desc: string, key: keyof OpenAiSettings, secret = false): void {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user