0.13.1-1 Episode Detection

This commit is contained in:
2026-04-12 19:43:56 +00:00
parent bc193db50a
commit 850f05453c
19 changed files with 2046 additions and 119 deletions
+61
View File
@@ -345,6 +345,11 @@ function getQueueActionResult(response) {
return response?.result && typeof response.result === 'object' ? response.result : {};
}
function isPipelineMetadataFlowStatus(value) {
const normalized = String(value || '').trim().toUpperCase();
return ['METADATA_SELECTION', 'READY_TO_START', 'WAITING_FOR_USER_DECISION'].includes(normalized);
}
function normalizeSortText(value) {
return String(value || '').trim().toLocaleLowerCase('de-DE');
}
@@ -1113,6 +1118,14 @@ export default function HistoryPage({ refreshToken = 0 }) {
const discNumber = selectedMetadata?.discNumber ?? analyzeContext?.seriesLookupHint?.discNumber ?? null;
const context = {
jobId,
status: row?.status || null,
lastState: row?.last_state || null,
submitMode: (
isPipelineMetadataFlowStatus(row?.status)
|| isPipelineMetadataFlowStatus(row?.last_state)
)
? 'pipeline'
: 'assign',
detectedTitle: row?.detected_title || row?.title || '',
selectedMetadata: {
...(selectedMetadata && typeof selectedMetadata === 'object' ? selectedMetadata : {}),
@@ -1166,8 +1179,53 @@ export default function HistoryPage({ refreshToken = 0 }) {
const handleOmdbSubmit = async (payload) => {
const provider = String(payload?.metadataProvider || metadataDialogContext?.metadataProvider || 'omdb').trim().toLowerCase() || 'omdb';
const submitMode = String(metadataDialogContext?.submitMode || 'assign').trim().toLowerCase() || 'assign';
const isPipelineFlow = submitMode === 'pipeline';
setOmdbAssignBusy(true);
try {
if (isPipelineFlow) {
await api.selectMetadata(payload);
setMetadataDialogVisible(false);
setMetadataDialogContext(null);
try {
const startResponse = await api.startJob(payload.jobId);
const startResult = getQueueActionResult(startResponse);
if (startResult.queued) {
toastRef.current?.show({
severity: 'info',
summary: 'Job in Queue',
detail: startResult.queuePosition > 0
? `Metadaten übernommen. Start wurde in Queue-Position ${startResult.queuePosition} eingeplant.`
: 'Metadaten übernommen. Start wurde in der Queue eingeplant.',
life: 3500
});
} else {
toastRef.current?.show({
severity: 'success',
summary: 'Job gestartet',
detail: 'Metadaten übernommen. Die Verarbeitung wurde gestartet.',
life: 3200
});
}
} catch (startError) {
const startMessage = String(startError?.message || '').trim();
const waitingForPlaylist = startMessage.includes('waiting_for_manual_playlist_selection');
toastRef.current?.show({
severity: waitingForPlaylist ? 'warn' : 'error',
summary: waitingForPlaylist ? 'Metadaten übernommen' : 'Start fehlgeschlagen',
detail: waitingForPlaylist
? 'Metadaten wurden übernommen, aber es fehlt noch eine Titel-/Playlist-Auswahl. Bitte im Ripper fortsetzen.'
: (startMessage || 'Job konnte nach der Metadaten-Übernahme nicht gestartet werden.'),
life: waitingForPlaylist ? 4200 : 4500
});
}
await load();
await refreshDetailIfOpen(payload.jobId);
return;
}
await api.assignJobOmdb(payload.jobId, payload);
toastRef.current?.show({
severity: 'success',
@@ -1180,6 +1238,9 @@ export default function HistoryPage({ refreshToken = 0 }) {
await load();
await refreshDetailIfOpen(payload.jobId);
} catch (error) {
if (isPipelineFlow) {
throw error;
}
toastRef.current?.show({
severity: 'error',
summary: provider === 'tmdb' ? 'TMDb-Zuweisung fehlgeschlagen' : 'OMDb-Zuweisung fehlgeschlagen',