0.16.1-5 Ebcode Fix / presets
Deploy Docs to GitHub Pages / Build Documentation (push) Has been cancelled
Deploy Docs to GitHub Pages / Deploy to GitHub Pages (push) Has been cancelled

This commit is contained in:
2026-04-30 12:37:32 +00:00
parent f9cf3cef09
commit 6fbc5395a1
24 changed files with 1131 additions and 784 deletions
+48 -18
View File
@@ -129,6 +129,16 @@ function formatPercent(value) {
return `${Math.trunc(parsed)}%`;
}
function isPlaylistTrackPreparationStatus(value) {
const normalized = String(value || '').trim().toUpperCase();
if (!normalized) {
return false;
}
return normalized.includes('PLAYLIST')
&& normalized.includes('TRACKDATEN')
&& normalized.includes('VORBEREIT');
}
function formatTemperature(value) {
const parsed = Number(value);
if (!Number.isFinite(parsed)) {
@@ -3132,9 +3142,10 @@ export default function RipperPage({
let stateLabel = null;
let stateSeverity = 'secondary';
let discInfo = null;
let showProgress = false;
let progressValue = 0;
let statusText = null;
let showProgress = false;
let progressValue = 0;
let statusText = null;
let showIndeterminateDriveProgress = false;
if (cdDrive) {
const s = String(cdDrive.state || '').toUpperCase();
@@ -3145,9 +3156,10 @@ export default function RipperPage({
: 'info';
const cd = cdDrive.device || {};
discInfo = cd.discLabel || cd.model || null;
showProgress = ['CD_RIPPING', 'CD_ENCODING', 'CD_ANALYZING'].includes(s);
progressValue = Number(cdDrive.progress ?? 0);
statusText = cdDrive.statusText || null;
showProgress = ['CD_RIPPING', 'CD_ENCODING', 'CD_ANALYZING'].includes(s);
progressValue = Number(cdDrive.progress ?? 0);
statusText = cdDrive.statusText || null;
showIndeterminateDriveProgress = isPlaylistTrackPreparationStatus(statusText);
} else if (pipelineDevice) {
const s = String(drv.pipelineState || '').toUpperCase();
stateLabel = s || 'DISC_DETECTED';
@@ -3286,12 +3298,14 @@ export default function RipperPage({
{discInfo ? <span className="drive-list-disc-label" title={discInfo}>{discInfo}</span> : null}
</div>
) : null}
{showProgress && (
<ProgressBar value={progressValue} style={{ height: '5px', margin: '0.2rem 0 0' }} showValue={false} />
)}
{showProgress && statusText && (
<div className="drive-list-status-text">{statusText}</div>
)}
{showProgress && (
showIndeterminateDriveProgress
? <ProgressBar mode="indeterminate" style={{ height: '5px', margin: '0.2rem 0 0' }} showValue={false} />
: <ProgressBar value={progressValue} style={{ height: '5px', margin: '0.2rem 0 0' }} showValue={false} />
)}
{showProgress && statusText && (
<div className="drive-list-status-text">{statusText}</div>
)}
</div>
);
})}
@@ -3463,7 +3477,8 @@ export default function RipperPage({
const mediaProfile = String(pipelineForJob?.context?.mediaProfile || '').trim().toLowerCase();
const jobState = String(pipelineForJob?.state || normalizedStatus).trim().toUpperCase();
const pipelineStage = String(pipelineForJob?.context?.stage || '').trim().toUpperCase();
const pipelineStatusText = String(pipelineForJob?.statusText || '').trim().toUpperCase();
const pipelineStatusTextRaw = String(pipelineForJob?.statusText || '').trim();
const pipelineStatusText = pipelineStatusTextRaw.toUpperCase();
const isCdJob = jobState.startsWith('CD_')
|| pipelineStage.startsWith('CD_')
|| mediaProfile === 'cd'
@@ -3509,6 +3524,8 @@ export default function RipperPage({
? Math.max(0, Math.min(100, rawProgress))
: 0;
const progressLabel = `${Math.trunc(clampedProgress)}%`;
const showIndeterminateProgress = !hasSeriesBatchProgress
&& isPlaylistTrackPreparationStatus(pipelineStatusTextRaw);
const etaLabel = isCancelledState ? '' : String(
hasSeriesBatchProgress
? (runningSeriesChild?.eta || pipelineForJob?.eta || '')
@@ -3982,9 +3999,16 @@ export default function RipperPage({
: null}
<JobStepChecks backupSuccess={Boolean(job?.backupSuccess)} encodeSuccess={Boolean(job?.encodeSuccess)} />
</div>
<div className="ripper-job-row-progress" aria-label={`Job Fortschritt ${progressLabel}`}>
<ProgressBar value={clampedProgress} showValue={false} />
<small>{etaLabel ? `${progressLabel} | ETA ${etaLabel}` : progressLabel}</small>
<div
className="ripper-job-row-progress"
aria-label={showIndeterminateProgress ? 'Job Fortschritt Vorbereitung läuft' : `Job Fortschritt ${progressLabel}`}
>
{showIndeterminateProgress ? (
<ProgressBar mode="indeterminate" showValue={false} />
) : (
<ProgressBar value={clampedProgress} showValue={false} />
)}
<small>{showIndeterminateProgress ? 'Vorbereitung läuft …' : (etaLabel ? `${progressLabel} | ETA ${etaLabel}` : progressLabel)}</small>
</div>
</div>
<i className="pi pi-angle-down" aria-hidden="true" />
@@ -4051,6 +4075,8 @@ export default function RipperPage({
: (jobProgressEntry?.progress ?? 0)
);
const clampedQueueProgress = Number.isFinite(rawQueueProgress) ? Math.max(0, Math.min(100, rawQueueProgress)) : 0;
const queueStatusText = String(jobProgressEntry?.statusText || '').trim();
const showIndeterminateQueueProgress = isPlaylistTrackPreparationStatus(queueStatusText);
return (
<div key={`running-${item.jobId}`} className="pipeline-queue-entry-wrap">
<div className="pipeline-queue-item running queue-job-item">
@@ -4062,8 +4088,12 @@ export default function RipperPage({
</strong>
{item.subtitle ? <small>{item.subtitle}</small> : null}
<small>#{item.jobId} | {getMergeAwareStatusLabel(item, item.status)}</small>
{clampedQueueProgress > 0 && (
<ProgressBar value={clampedQueueProgress} style={{ height: '5px' }} showValue={false} />
{showIndeterminateQueueProgress ? (
<ProgressBar mode="indeterminate" style={{ height: '5px' }} showValue={false} />
) : (
clampedQueueProgress > 0
? <ProgressBar value={clampedQueueProgress} style={{ height: '5px' }} showValue={false} />
: null
)}
</div>
{hasScriptSummary ? (