Feat : Log recorder
This commit is contained in:
@@ -2,6 +2,7 @@ import { EventEmitter } from 'node:events';
|
||||
import OBSWebSocket from 'obs-websocket-js';
|
||||
import type {
|
||||
AgentAction,
|
||||
AgentEvent,
|
||||
AgentStatus,
|
||||
ObsSettings,
|
||||
PresetApplyResult,
|
||||
@@ -10,6 +11,19 @@ import type {
|
||||
} from '@stream-control/shared';
|
||||
import { RECORDING_ENCODERS, findRecordingPreset } from '@stream-control/shared';
|
||||
|
||||
/** Traduit l'état d'une sortie OBS en évènement d'historique et en libellé. */
|
||||
const RECORD_STATES: Record<string, { event: AgentEvent; label: string }> = {
|
||||
STARTED: { event: 'record.started', label: 'Enregistrement démarré' },
|
||||
STOPPED: { event: 'record.stopped', label: 'Enregistrement arrêté' },
|
||||
PAUSED: { event: 'record.paused', label: 'Enregistrement mis en pause' },
|
||||
RESUMED: { event: 'record.resumed', label: 'Enregistrement repris' },
|
||||
};
|
||||
|
||||
const STREAM_STATES: Record<string, { event: AgentEvent; label: string }> = {
|
||||
STARTED: { event: 'stream.started', label: 'Diffusion démarrée' },
|
||||
STOPPED: { event: 'stream.stopped', label: 'Diffusion arrêtée' },
|
||||
};
|
||||
|
||||
/**
|
||||
* Actions relevant d'OBS. `watch.*`, `hotkey.*`, `preset.apply` et
|
||||
* `agent.update` sont traitées en amont par l'agent : elles ne se réduisent pas
|
||||
@@ -115,7 +129,12 @@ export class ObsController extends EventEmitter {
|
||||
this.cachedVersion = undefined;
|
||||
if (wasConnected) {
|
||||
this.lastError = err instanceof Error ? err.message : undefined;
|
||||
this.emit('log', 'warn', `Session OBS fermée${this.lastError ? ` : ${this.lastError}` : ''}`);
|
||||
this.emit(
|
||||
'log',
|
||||
'warn',
|
||||
`Session OBS fermée${this.lastError ? ` : ${this.lastError}` : ''}`,
|
||||
'obs.disconnected',
|
||||
);
|
||||
}
|
||||
this.scheduleReconnect();
|
||||
});
|
||||
@@ -124,11 +143,17 @@ export class ObsController extends EventEmitter {
|
||||
if (typeof event.outputPath === 'string' && event.outputPath) {
|
||||
this.lastRecordingPath = event.outputPath;
|
||||
}
|
||||
this.emit('log', 'info', `Enregistrement : ${String(event.outputState).replace('OBS_WEBSOCKET_OUTPUT_', '')}`);
|
||||
// La source fait autorité : elle capte aussi les pauses déclenchées depuis
|
||||
// l'interface d'OBS, que le dashboard ne verrait pas autrement.
|
||||
const raw = String(event.outputState).replace('OBS_WEBSOCKET_OUTPUT_', '');
|
||||
const known = RECORD_STATES[raw];
|
||||
this.emit('log', 'info', known?.label ?? `Enregistrement : ${raw}`, known?.event);
|
||||
});
|
||||
|
||||
this.obs.on('StreamStateChanged', (event) => {
|
||||
this.emit('log', 'info', `Diffusion : ${String(event.outputState).replace('OBS_WEBSOCKET_OUTPUT_', '')}`);
|
||||
const raw = String(event.outputState).replace('OBS_WEBSOCKET_OUTPUT_', '');
|
||||
const known = STREAM_STATES[raw];
|
||||
this.emit('log', 'info', known?.label ?? `Diffusion : ${raw}`, known?.event);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -143,7 +168,7 @@ export class ObsController extends EventEmitter {
|
||||
settings.password !== this.settings.password;
|
||||
this.settings = settings;
|
||||
if (changed && this.connected) {
|
||||
this.emit('log', 'info', 'Paramètres OBS modifiés, reconnexion');
|
||||
this.emit('log', 'info', 'Paramètres OBS modifiés, reconnexion', 'config.changed');
|
||||
void this.reconnect();
|
||||
}
|
||||
}
|
||||
@@ -169,7 +194,12 @@ export class ObsController extends EventEmitter {
|
||||
this.connected = true;
|
||||
this.lastError = undefined;
|
||||
this.cachedVersion = info.obsWebSocketVersion;
|
||||
this.emit('log', 'info', `Connecté à OBS ${url} (obs-websocket ${info.obsWebSocketVersion})`);
|
||||
this.emit(
|
||||
'log',
|
||||
'info',
|
||||
`Connecté à OBS ${url} (obs-websocket ${info.obsWebSocketVersion})`,
|
||||
'obs.connected',
|
||||
);
|
||||
} catch (err) {
|
||||
this.connected = false;
|
||||
this.lastError = describeConnectionError(err);
|
||||
@@ -189,7 +219,7 @@ export class ObsController extends EventEmitter {
|
||||
this.clearReconnect();
|
||||
if (this.connected) await this.obs.disconnect();
|
||||
this.connected = false;
|
||||
this.emit('log', 'info', 'Déconnecté d\'OBS');
|
||||
this.emit('log', 'info', 'Déconnecté d\'OBS', 'obs.disconnected');
|
||||
}
|
||||
|
||||
private async reconnect(): Promise<void> {
|
||||
|
||||
Reference in New Issue
Block a user