0.12.0-18 Tests and Converter Fixes

This commit is contained in:
2026-03-31 12:51:32 +00:00
parent aea8fa6772
commit 5aa65ad4c1
24 changed files with 2281 additions and 249 deletions
+67 -18
View File
@@ -22,6 +22,7 @@ import {
normalizeStatus,
STATUS_FILTER_OPTIONS
} from '../utils/statusPresentation';
import { confirmModal } from '../utils/confirmModal';
const MEDIA_FILTER_OPTIONS = [
{ label: 'Alle Medien', value: '' },
@@ -274,25 +275,50 @@ function resolveAudiobookDetails(row) {
};
}
function getOutputLabelForRow(row) {
const mediaType = resolveMediaType(row);
if (mediaType === 'cd') {
return 'Audio-Dateien';
function resolveConverterMediaType(row) {
const encodePlan = row?.encodePlan && typeof row.encodePlan === 'object' ? row.encodePlan : {};
const value = String(
encodePlan?.converterMediaType
|| row?.converterMediaType
|| ''
).trim().toLowerCase();
if (value === 'audio') {
return 'audio';
}
if (mediaType === 'audiobook') {
if (value === 'video' || value === 'iso') {
return 'video';
}
return null;
}
function hasAudioOutput(row) {
const mediaType = resolveMediaType(row);
if (mediaType === 'cd' || mediaType === 'audiobook') {
return true;
}
if (mediaType === 'converter') {
return resolveConverterMediaType(row) === 'audio';
}
return false;
}
function getOutputLabelForRow(row) {
if (resolveMediaType(row) === 'audiobook') {
return 'Audiobook-Datei(en)';
}
if (hasAudioOutput(row)) {
return 'Audio-Dateien';
}
return 'Movie-Datei(en)';
}
function getOutputShortLabelForRow(row) {
const mediaType = resolveMediaType(row);
if (mediaType === 'cd') {
return 'Audio';
}
if (mediaType === 'audiobook') {
if (resolveMediaType(row) === 'audiobook') {
return 'Audiobook';
}
if (hasAudioOutput(row)) {
return 'Audio';
}
return 'Movie';
}
@@ -717,7 +743,12 @@ export default function HistoryPage({ refreshToken = 0 }) {
} else if (action === 'restart_review') {
const title = job?.title || job?.detected_title || `Job #${job?.id}`;
if (!skipConfirm) {
const confirmed = window.confirm(`Review für "${title}" neu starten?\nDer Job wird erneut analysiert. Spur- und Skriptauswahl kann danach im Dashboard neu getroffen werden.`);
const confirmed = await confirmModal({
header: 'Review neu starten',
message: `Review für "${title}" neu starten?\nDer Job wird erneut analysiert. Spur- und Skriptauswahl kann danach im Dashboard neu getroffen werden.`,
acceptLabel: 'Review starten',
rejectLabel: 'Abbrechen'
});
if (!confirmed) {
return;
}
@@ -743,7 +774,12 @@ export default function HistoryPage({ refreshToken = 0 }) {
} else if (action === 'restart_cd_review') {
const title = job?.title || job?.detected_title || `Job #${job?.id}`;
if (!skipConfirm) {
const confirmed = window.confirm(`CD-Vorprüfung für "${title}" starten?\nMusicBrainz-Suche, Trackauswahl und Ausgabeeinstellungen werden im Dashboard geöffnet.`);
const confirmed = await confirmModal({
header: 'CD-Vorprüfung starten',
message: `CD-Vorprüfung für "${title}" starten?\nMusicBrainz-Suche, Trackauswahl und Ausgabeeinstellungen werden im Dashboard geöffnet.`,
acceptLabel: 'Vorprüfung starten',
rejectLabel: 'Abbrechen'
});
if (!confirmed) {
return;
}
@@ -848,7 +884,13 @@ export default function HistoryPage({ refreshToken = 0 }) {
const outputShortLabel = getOutputShortLabelForRow(row);
const label = target === 'raw' ? 'RAW-Dateien' : target === 'movie' ? outputLabel : `RAW + ${outputShortLabel}`;
const title = row.title || row.detected_title || `Job #${row.id}`;
const confirmed = window.confirm(`${label} für "${title}" wirklich löschen?`);
const confirmed = await confirmModal({
header: 'Dateien löschen',
message: `${label} für "${title}" wirklich löschen?`,
acceptLabel: 'Löschen',
rejectLabel: 'Abbrechen',
danger: true
});
if (!confirmed) {
return;
}
@@ -998,7 +1040,12 @@ export default function HistoryPage({ refreshToken = 0 }) {
const title = row?.title || row?.detected_title || `Job #${row?.id}`;
const mediaType = resolveMediaType(row);
const actionLabel = mediaType === 'cd' ? 'CD-Rip' : 'Retry';
const confirmed = window.confirm(`${actionLabel} für "${title}" neu starten?`);
const confirmed = await confirmModal({
header: `${actionLabel} neu starten`,
message: `${actionLabel} für "${title}" neu starten?`,
acceptLabel: 'Neu starten',
rejectLabel: 'Abbrechen'
});
if (!confirmed) {
return;
}
@@ -1415,6 +1462,7 @@ export default function HistoryPage({ refreshToken = 0 }) {
const listItem = (row) => {
const mediaMeta = resolveMediaTypeMeta(row);
const isCdJob = mediaMeta.mediaType === 'cd';
const outputIsAudio = hasAudioOutput(row);
const cdDetails = isCdJob ? resolveCdDetails(row) : null;
const subtitle = isCdJob
? [
@@ -1460,8 +1508,8 @@ export default function HistoryPage({ refreshToken = 0 }) {
<div className="history-dv-flags-row">
{renderPresenceChip('RAW', Boolean(row?.rawStatus?.exists))}
{renderPresenceChip(isCdJob || mediaMeta.mediaType === 'audiobook' ? 'Audio' : 'Movie', Boolean(row?.outputStatus?.exists))}
{renderPresenceChip('Encode', isCdJob || mediaMeta.mediaType === 'audiobook' ? Boolean(row?.ripSuccessful) : Boolean(row?.encodeSuccess))}
{renderPresenceChip(outputIsAudio ? 'Audio' : 'Movie', Boolean(row?.outputStatus?.exists))}
{renderPresenceChip('Encode', Boolean(row?.encodeSuccess))}
</div>
<div className="history-dv-ratings-row">{renderSupplementalInfo(row)}</div>
@@ -1476,6 +1524,7 @@ export default function HistoryPage({ refreshToken = 0 }) {
const gridItem = (row) => {
const mediaMeta = resolveMediaTypeMeta(row);
const isCdJob = mediaMeta.mediaType === 'cd';
const outputIsAudio = hasAudioOutput(row);
const cdDetails = isCdJob ? resolveCdDetails(row) : null;
const subtitle = isCdJob
? [
@@ -1523,8 +1572,8 @@ export default function HistoryPage({ refreshToken = 0 }) {
<div className="history-dv-flags-row">
{renderPresenceChip('RAW', Boolean(row?.rawStatus?.exists))}
{renderPresenceChip(isCdJob || mediaMeta.mediaType === 'audiobook' ? 'Audio' : 'Movie', Boolean(row?.outputStatus?.exists))}
{renderPresenceChip('Encode', isCdJob || mediaMeta.mediaType === 'audiobook' ? Boolean(row?.ripSuccessful) : Boolean(row?.encodeSuccess))}
{renderPresenceChip(outputIsAudio ? 'Audio' : 'Movie', Boolean(row?.outputStatus?.exists))}
{renderPresenceChip('Encode', Boolean(row?.encodeSuccess))}
</div>
<div className="history-dv-ratings-row">{renderSupplementalInfo(row)}</div>