0.12.0-10 Fix Multi Job
This commit is contained in:
@@ -7133,7 +7133,15 @@ class PipelineService extends EventEmitter {
|
||||
|
||||
const runningJobs = await historyService.getRunningJobs();
|
||||
const foreignRunningJobs = runningJobs.filter((item) => Number(item?.id) !== Number(job.id));
|
||||
const keepCurrentPipelineSession = foreignRunningJobs.length > 0;
|
||||
// Only block metadata selection if a foreign job requires active user interaction
|
||||
// in the pipeline UI. Autonomous jobs (ENCODING, RIPPING, READY_TO_ENCODE) run
|
||||
// independently via activeProcesses and must not prevent new disc metadata selection.
|
||||
const PIPELINE_INTERACTIVE_STATES = new Set([
|
||||
'ANALYZING', 'METADATA_SELECTION', 'WAITING_FOR_USER_DECISION', 'MEDIAINFO_CHECK'
|
||||
]);
|
||||
const keepCurrentPipelineSession = foreignRunningJobs.some(
|
||||
(item) => PIPELINE_INTERACTIVE_STATES.has(String(item?.status || '').toUpperCase())
|
||||
);
|
||||
if (!keepCurrentPipelineSession) {
|
||||
await this.setState('METADATA_SELECTION', {
|
||||
activeJobId: job.id,
|
||||
@@ -7161,7 +7169,7 @@ class PipelineService extends EventEmitter {
|
||||
await historyService.appendLog(
|
||||
job.id,
|
||||
'SYSTEM',
|
||||
`Metadaten-Auswahl im Hintergrund vorbereitet. Aktive Session bleibt bei laufendem Job #${foreignRunningJobs.map((item) => item.id).join(',')}.`
|
||||
`Metadaten-Auswahl im Hintergrund vorbereitet. Aktive Session bleibt bei interaktivem Job #${foreignRunningJobs.map((item) => item.id).join(',')}.`
|
||||
);
|
||||
}
|
||||
|
||||
@@ -8478,7 +8486,15 @@ class PipelineService extends EventEmitter {
|
||||
|
||||
const runningJobs = await historyService.getRunningJobs();
|
||||
const foreignRunningJobs = runningJobs.filter((item) => Number(item?.id) !== Number(jobId));
|
||||
const keepCurrentPipelineSession = foreignRunningJobs.length > 0;
|
||||
// Only block the state transition if a foreign job requires active user interaction.
|
||||
// Autonomous jobs (ENCODING, RIPPING, READY_TO_ENCODE) must not prevent this job
|
||||
// from advancing through its own pipeline steps.
|
||||
const PIPELINE_INTERACTIVE_STATES = new Set([
|
||||
'ANALYZING', 'METADATA_SELECTION', 'WAITING_FOR_USER_DECISION', 'MEDIAINFO_CHECK'
|
||||
]);
|
||||
const keepCurrentPipelineSession = foreignRunningJobs.some(
|
||||
(item) => PIPELINE_INTERACTIVE_STATES.has(String(item?.status || '').toUpperCase())
|
||||
);
|
||||
|
||||
if (existingRawPath) {
|
||||
await historyService.appendLog(
|
||||
@@ -11201,17 +11217,26 @@ class PipelineService extends EventEmitter {
|
||||
? `${finishedStatusTextBase} (${postEncodeScriptsSummary.failed} Skript(e) fehlgeschlagen)`
|
||||
: finishedStatusTextBase;
|
||||
|
||||
await this.setState('FINISHED', {
|
||||
activeJobId: jobId,
|
||||
progress: 100,
|
||||
eta: null,
|
||||
statusText: finishedStatusText,
|
||||
context: {
|
||||
jobId,
|
||||
mode,
|
||||
outputPath: finalizedOutputPath
|
||||
}
|
||||
});
|
||||
// Only switch the pipeline UI to FINISHED if this job is still the active one.
|
||||
// If the pipeline has moved to another job (e.g. metadata selection for a new disc
|
||||
// that was inserted while this one was encoding), complete silently so the other
|
||||
// job's UI state is not disrupted. The DB status is already FINISHED (above).
|
||||
if (Number(this.snapshot.activeJobId) === Number(jobId)) {
|
||||
await this.setState('FINISHED', {
|
||||
activeJobId: jobId,
|
||||
progress: 100,
|
||||
eta: null,
|
||||
statusText: finishedStatusText,
|
||||
context: {
|
||||
jobId,
|
||||
mode,
|
||||
outputPath: finalizedOutputPath
|
||||
}
|
||||
});
|
||||
} else {
|
||||
logger.info('encoding:finished:background', { jobId, mode, activeJobId: this.snapshot.activeJobId });
|
||||
void this.pumpQueue();
|
||||
}
|
||||
|
||||
if (mode === 'reencode') {
|
||||
void this.notifyPushover('reencode_finished', {
|
||||
@@ -14046,18 +14071,24 @@ class PipelineService extends EventEmitter {
|
||||
error_message: null
|
||||
});
|
||||
|
||||
await this.setState('FINISHED', {
|
||||
activeJobId: jobId,
|
||||
progress: 100,
|
||||
eta: null,
|
||||
statusText: 'Audiobook abgeschlossen',
|
||||
context: {
|
||||
jobId,
|
||||
mode: 'audiobook',
|
||||
mediaProfile: 'audiobook',
|
||||
outputPath: finalizedOutputPath
|
||||
}
|
||||
});
|
||||
// Only switch the pipeline UI to FINISHED if this job is still the active one.
|
||||
if (Number(this.snapshot.activeJobId) === Number(jobId)) {
|
||||
await this.setState('FINISHED', {
|
||||
activeJobId: jobId,
|
||||
progress: 100,
|
||||
eta: null,
|
||||
statusText: 'Audiobook abgeschlossen',
|
||||
context: {
|
||||
jobId,
|
||||
mode: 'audiobook',
|
||||
mediaProfile: 'audiobook',
|
||||
outputPath: finalizedOutputPath
|
||||
}
|
||||
});
|
||||
} else {
|
||||
logger.info('audiobook:finished:background', { jobId, activeJobId: this.snapshot.activeJobId });
|
||||
void this.pumpQueue();
|
||||
}
|
||||
|
||||
void this.notifyPushover('job_finished', {
|
||||
title: 'Ripster - Audiobook abgeschlossen',
|
||||
|
||||
Reference in New Issue
Block a user