final dev
This commit is contained in:
@@ -6652,7 +6652,7 @@ class PipelineService extends EventEmitter {
|
|||||||
: 0
|
: 0
|
||||||
});
|
});
|
||||||
|
|
||||||
const job = await historyService.getJobById(jobId);
|
let job = await historyService.getJobById(jobId);
|
||||||
if (!job) {
|
if (!job) {
|
||||||
const error = new Error(`Job ${jobId} nicht gefunden.`);
|
const error = new Error(`Job ${jobId} nicht gefunden.`);
|
||||||
error.statusCode = 404;
|
error.statusCode = 404;
|
||||||
@@ -6660,6 +6660,36 @@ class PipelineService extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (job.status !== 'READY_TO_ENCODE' && job.last_state !== 'READY_TO_ENCODE') {
|
if (job.status !== 'READY_TO_ENCODE' && job.last_state !== 'READY_TO_ENCODE') {
|
||||||
|
const currentStatus = String(job.status || job.last_state || '').trim().toUpperCase();
|
||||||
|
const recoverableStatus = currentStatus === 'ERROR' || currentStatus === 'CANCELLED';
|
||||||
|
const recoveryPlan = this.safeParseJson(job.encode_plan_json);
|
||||||
|
const recoveryMode = String(recoveryPlan?.mode || '').trim().toLowerCase();
|
||||||
|
const recoveryPreRip = recoveryMode === 'pre_rip' || Boolean(recoveryPlan?.preRip);
|
||||||
|
const recoveryHasInput = recoveryPreRip
|
||||||
|
? Boolean(recoveryPlan?.encodeInputTitleId)
|
||||||
|
: Boolean(job?.encode_input_path || recoveryPlan?.encodeInputPath || job?.raw_path);
|
||||||
|
const recoveryHasConfirmedPlan = Boolean(
|
||||||
|
recoveryPlan
|
||||||
|
&& Array.isArray(recoveryPlan?.titles)
|
||||||
|
&& recoveryPlan.titles.length > 0
|
||||||
|
&& (Number(job?.encode_review_confirmed || 0) === 1 || Boolean(recoveryPlan?.reviewConfirmed))
|
||||||
|
&& recoveryHasInput
|
||||||
|
);
|
||||||
|
if (recoverableStatus && recoveryHasConfirmedPlan) {
|
||||||
|
await historyService.appendLog(
|
||||||
|
jobId,
|
||||||
|
'SYSTEM',
|
||||||
|
`Bestätigung angefordert obwohl Status ${currentStatus}. Letzte Encode-Auswahl wird automatisch geladen.`
|
||||||
|
);
|
||||||
|
await this.restartEncodeWithLastSettings(jobId, {
|
||||||
|
immediate: true,
|
||||||
|
triggerReason: 'confirm_auto_prepare'
|
||||||
|
});
|
||||||
|
job = await historyService.getJobById(jobId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!job || (job.status !== 'READY_TO_ENCODE' && job.last_state !== 'READY_TO_ENCODE')) {
|
||||||
const error = new Error('Bestätigung nicht möglich: Job ist nicht im Status READY_TO_ENCODE.');
|
const error = new Error('Bestätigung nicht möglich: Job ist nicht im Status READY_TO_ENCODE.');
|
||||||
error.statusCode = 409;
|
error.statusCode = 409;
|
||||||
throw error;
|
throw error;
|
||||||
@@ -8719,21 +8749,22 @@ class PipelineService extends EventEmitter {
|
|||||||
encode_input_path: inputPath,
|
encode_input_path: inputPath,
|
||||||
encode_review_confirmed: 0
|
encode_review_confirmed: 0
|
||||||
});
|
});
|
||||||
await historyService.appendLog(
|
const loadedSelectionText = (
|
||||||
jobId,
|
|
||||||
'USER_ACTION',
|
|
||||||
triggerReason === 'cancelled_encode'
|
|
||||||
? (
|
|
||||||
previousOutputPath
|
previousOutputPath
|
||||||
? `Encode wurde abgebrochen. Letzte bestätigte Auswahl wurde geladen und kann angepasst werden. Vorheriger Output-Pfad: ${previousOutputPath}. autoDeleteIncomplete=${restartDeleteIncompleteOutput ? 'on' : 'off'}`
|
? `Letzte bestätigte Auswahl wurde geladen und kann angepasst werden. Vorheriger Output-Pfad: ${previousOutputPath}. autoDeleteIncomplete=${restartDeleteIncompleteOutput ? 'on' : 'off'}`
|
||||||
: 'Encode wurde abgebrochen. Letzte bestätigte Auswahl wurde geladen und kann angepasst werden.'
|
: 'Letzte bestätigte Auswahl wurde geladen und kann angepasst werden.'
|
||||||
)
|
|
||||||
: (
|
|
||||||
previousOutputPath
|
|
||||||
? `Encode-Neustart angefordert. Letzte bestätigte Auswahl wurde geladen und kann angepasst werden. Vorheriger Output-Pfad: ${previousOutputPath}. autoDeleteIncomplete=${restartDeleteIncompleteOutput ? 'on' : 'off'}`
|
|
||||||
: 'Encode-Neustart angefordert. Letzte bestätigte Auswahl wurde geladen und kann angepasst werden.'
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
let restartLogMessage;
|
||||||
|
if (triggerReason === 'cancelled_encode') {
|
||||||
|
restartLogMessage = `Encode wurde abgebrochen. ${loadedSelectionText}`;
|
||||||
|
} else if (triggerReason === 'failed_encode') {
|
||||||
|
restartLogMessage = `Encode ist fehlgeschlagen. ${loadedSelectionText}`;
|
||||||
|
} else if (triggerReason === 'confirm_auto_prepare') {
|
||||||
|
restartLogMessage = `Status war nicht READY_TO_ENCODE. ${loadedSelectionText}`;
|
||||||
|
} else {
|
||||||
|
restartLogMessage = `Encode-Neustart angefordert. ${loadedSelectionText}`;
|
||||||
|
}
|
||||||
|
await historyService.appendLog(jobId, 'USER_ACTION', restartLogMessage);
|
||||||
|
|
||||||
await this.setState('READY_TO_ENCODE', {
|
await this.setState('READY_TO_ENCODE', {
|
||||||
activeJobId: jobId,
|
activeJobId: jobId,
|
||||||
@@ -9190,21 +9221,21 @@ class PipelineService extends EventEmitter {
|
|||||||
hasRawPath = false;
|
hasRawPath = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isCancelled && normalizedStage === 'ENCODING' && hasConfirmedPlan) {
|
if (normalizedStage === 'ENCODING' && hasConfirmedPlan) {
|
||||||
try {
|
try {
|
||||||
await historyService.appendLog(
|
await historyService.appendLog(
|
||||||
jobId,
|
jobId,
|
||||||
'SYSTEM',
|
'SYSTEM',
|
||||||
`Abbruch in ${stage}: ${message}. Letzte Encode-Auswahl wird zur direkten Anpassung geladen.`
|
`${isCancelled ? 'Abbruch' : 'Fehler'} in ${stage}: ${message}. Letzte Encode-Auswahl wird zur direkten Anpassung geladen.`
|
||||||
);
|
);
|
||||||
await this.restartEncodeWithLastSettings(jobId, {
|
await this.restartEncodeWithLastSettings(jobId, {
|
||||||
immediate: true,
|
immediate: true,
|
||||||
triggerReason: 'cancelled_encode'
|
triggerReason: isCancelled ? 'cancelled_encode' : 'failed_encode'
|
||||||
});
|
});
|
||||||
this.cancelRequestedByJob.delete(Number(jobId));
|
this.cancelRequestedByJob.delete(Number(jobId));
|
||||||
return;
|
return;
|
||||||
} catch (recoveryError) {
|
} catch (recoveryError) {
|
||||||
logger.error('job:cancelled-encode:auto-recover-failed', {
|
logger.error('job:encoding:auto-recover-failed', {
|
||||||
jobId,
|
jobId,
|
||||||
stage,
|
stage,
|
||||||
error: errorToMeta(recoveryError)
|
error: errorToMeta(recoveryError)
|
||||||
|
|||||||
Reference in New Issue
Block a user