1.0.0-rc3 rc

This commit is contained in:
2026-05-27 12:22:32 +02:00
parent 2359c03bc8
commit 196ac2ee07
3 changed files with 74 additions and 32 deletions
+35 -18
View File
@@ -22793,6 +22793,12 @@ class PipelineService extends EventEmitter {
throw error; throw error;
} }
const readyMediaProfile = this.resolveMediaProfileForJob(job, {
encodePlan: planForConfirm
});
const confirmSettings = await settingsService.getEffectiveSettingsMap(readyMediaProfile);
const settingsExtraArgsForProfile = String(confirmSettings?.handbrake_extra_args || '').trim();
// Resolve user preset: explicit payload wins, otherwise preserve currently selected preset from encode plan. // Resolve user preset: explicit payload wins, otherwise preserve currently selected preset from encode plan.
const hasUserPresetIdField = Object.prototype.hasOwnProperty.call(options || {}, 'selectedUserPresetId'); const hasUserPresetIdField = Object.prototype.hasOwnProperty.call(options || {}, 'selectedUserPresetId');
const hasHandBrakePresetField = Object.prototype.hasOwnProperty.call(options || {}, 'selectedHandBrakePreset'); const hasHandBrakePresetField = Object.prototype.hasOwnProperty.call(options || {}, 'selectedHandBrakePreset');
@@ -22822,10 +22828,17 @@ class PipelineService extends EventEmitter {
? { ? {
name: `HandBrake: ${rawHandBrakePreset}`, name: `HandBrake: ${rawHandBrakePreset}`,
handbrakePreset: rawHandBrakePreset, handbrakePreset: rawHandBrakePreset,
extraArgs: '' extraArgs: settingsExtraArgsForProfile
} }
: null; : null;
} }
if (!resolvedUserPreset && explicitPresetClearRequested && settingsExtraArgsForProfile) {
resolvedUserPreset = {
name: 'Settings CLI-Parameter',
handbrakePreset: null,
extraArgs: settingsExtraArgsForProfile
};
}
if (!resolvedUserPreset && !explicitPresetClearRequested) { if (!resolvedUserPreset && !explicitPresetClearRequested) {
resolvedUserPreset = normalizeUserPresetForPlan( resolvedUserPreset = normalizeUserPresetForPlan(
planForConfirm?.userPreset || encodePlan?.userPreset || null planForConfirm?.userPreset || encodePlan?.userPreset || null
@@ -22850,10 +22863,6 @@ class PipelineService extends EventEmitter {
reviewConfirmedAt: nowIso(), reviewConfirmedAt: nowIso(),
userPreset: normalizeUserPresetForPlan(resolvedUserPreset) userPreset: normalizeUserPresetForPlan(resolvedUserPreset)
}; };
const readyMediaProfile = this.resolveMediaProfileForJob(job, {
encodePlan: confirmedPlan
});
const confirmSettings = await settingsService.getEffectiveSettingsMap(readyMediaProfile);
const confirmedConverterMediaType = String( const confirmedConverterMediaType = String(
confirmedPlan?.converterMediaType || encodePlan?.converterMediaType || '' confirmedPlan?.converterMediaType || encodePlan?.converterMediaType || ''
).trim().toLowerCase(); ).trim().toLowerCase();
@@ -22878,19 +22887,27 @@ class PipelineService extends EventEmitter {
|| encodePlan?.selectors?.extraArgs || encodePlan?.selectors?.extraArgs
|| '' || ''
).trim(); ).trim();
const effectivePresetName = String( const effectivePresetName = explicitPresetClearRequested
resolvedUserPreset?.handbrakePreset ? ''
|| rawHandBrakePreset : String(
|| planPresetName resolvedUserPreset?.handbrakePreset
|| confirmSettings?.handbrake_preset || rawHandBrakePreset
|| '' || planPresetName
).trim(); || confirmSettings?.handbrake_preset
const effectiveExtraArgs = String( || ''
resolvedUserPreset?.extraArgs ).trim();
|| planExtraArgs const effectiveExtraArgs = explicitPresetClearRequested
|| confirmSettings?.handbrake_extra_args ? String(
|| '' resolvedUserPreset?.extraArgs
).trim(); || settingsExtraArgsForProfile
|| ''
).trim()
: String(
resolvedUserPreset?.extraArgs
|| planExtraArgs
|| settingsExtraArgsForProfile
|| ''
).trim();
if (requiresExplicitPreset && !effectivePresetName && !effectiveExtraArgs) { if (requiresExplicitPreset && !effectivePresetName && !effectiveExtraArgs) {
const error = new Error('Bestätigung nicht möglich: Kein Preset oder Extra-Args gesetzt. Bitte User-/HandBrake-Preset wählen oder passende Settings hinterlegen.'); const error = new Error('Bestätigung nicht möglich: Kein Preset oder Extra-Args gesetzt. Bitte User-/HandBrake-Preset wählen oder passende Settings hinterlegen.');
error.statusCode = 400; error.statusCode = 400;
@@ -739,11 +739,15 @@ function buildHandBrakeCommandPreview({
hasExplicitVariantSelection: normalizedSubtitleSelectionMode === 'variants' hasExplicitVariantSelection: normalizedSubtitleSelectionMode === 'variants'
&& hasExplicitSelectedVariantSelection && hasExplicitSelectedVariantSelection
}); });
const subtitleTrackIds = resolvedSubtitleSelection.subtitleTrackIds.length > 0 const subtitleTrackIds = normalizedSubtitleSelectionMode === 'track_ids'
? resolvedSubtitleSelection.subtitleTrackIds ? normalizedSelectedSubtitleTrackIds
: (hasExplicitSelectedVariantSelection : (
? [] resolvedSubtitleSelection.subtitleTrackIds.length > 0
: normalizedSelectedSubtitleTrackIds); ? resolvedSubtitleSelection.subtitleTrackIds
: (hasExplicitSelectedVariantSelection
? []
: normalizedSelectedSubtitleTrackIds)
);
const selectedSubtitleSet = new Set(normalizeTrackIdList(subtitleTrackIds).map((id) => String(id))); const selectedSubtitleSet = new Set(normalizeTrackIdList(subtitleTrackIds).map((id) => String(id)));
const selectedSubtitleTracks = (Array.isArray(title?.subtitleTracks) ? title.subtitleTracks : []).filter((track) => { const selectedSubtitleTracks = (Array.isArray(title?.subtitleTracks) ? title.subtitleTracks : []).filter((track) => {
const id = normalizeTrackId(track?.id); const id = normalizeTrackId(track?.id);
@@ -787,7 +791,7 @@ function buildHandBrakeCommandPreview({
if (subtitleDefaultTrackId !== null) { if (subtitleDefaultTrackId !== null) {
overrideArgs.push(`--subtitle-default=${subtitleDefaultTrackId}`); overrideArgs.push(`--subtitle-default=${subtitleDefaultTrackId}`);
} }
if (resolvedSubtitleSelection.subtitleForcedTrackIndexes.length > 0) { if (normalizedSubtitleSelectionMode !== 'track_ids' && resolvedSubtitleSelection.subtitleForcedTrackIndexes.length > 0) {
overrideArgs.push(`--subtitle-forced=${resolvedSubtitleSelection.subtitleForcedTrackIndexes.join(',')}`); overrideArgs.push(`--subtitle-forced=${resolvedSubtitleSelection.subtitleForcedTrackIndexes.join(',')}`);
} }
@@ -1617,6 +1621,8 @@ export default function MediaInfoReviewPanel({
onUserPresetChange = null, onUserPresetChange = null,
selectedHandBrakePreset = '', selectedHandBrakePreset = '',
onHandBrakePresetChange = null, onHandBrakePresetChange = null,
presetSelectionExplicitlyCleared = false,
onPresetTokenChange = null,
handBrakePresetOptions = [], handBrakePresetOptions = [],
comparisonReviewItems = [], comparisonReviewItems = [],
topContent = null topContent = null
@@ -1922,24 +1928,31 @@ export default function MediaInfoReviewPanel({
const isHandBrakePresetActive = !isUserPresetActive && Boolean(trimmedHandBrakePreset); const isHandBrakePresetActive = !isUserPresetActive && Boolean(trimmedHandBrakePreset);
const settingsPresetFallback = String(review?.selectors?.preset || '').trim(); const settingsPresetFallback = String(review?.selectors?.preset || '').trim();
const settingsExtraArgsFallback = String(review?.selectors?.extraArgs || '').trim(); const settingsExtraArgsFallback = String(review?.selectors?.extraArgs || '').trim();
const usesSettingsFallbackOnly = !isUserPresetActive && !isHandBrakePresetActive; const hasNoExplicitPresetSelected = !isUserPresetActive && !isHandBrakePresetActive;
const hasSettingsPresetFallback = Boolean(settingsPresetFallback); const effectiveSettingsPresetFallback = presetSelectionExplicitlyCleared ? '' : settingsPresetFallback;
const hasSettingsPresetFallback = Boolean(effectiveSettingsPresetFallback);
const hasSettingsExtraArgsFallback = Boolean(settingsExtraArgsFallback); const hasSettingsExtraArgsFallback = Boolean(settingsExtraArgsFallback);
const hasInvalidPresetConfig = usesSettingsFallbackOnly const hasInvalidPresetConfig = hasNoExplicitPresetSelected
&& !hasSettingsPresetFallback && !hasSettingsPresetFallback
&& !hasSettingsExtraArgsFallback; && !hasSettingsExtraArgsFallback;
const hasSettingsArgsOnlyConfig = usesSettingsFallbackOnly const hasSettingsArgsOnlyConfig = hasNoExplicitPresetSelected
&& !hasSettingsPresetFallback && !hasSettingsPresetFallback
&& hasSettingsExtraArgsFallback; && hasSettingsExtraArgsFallback;
const effectivePresetOverride = isUserPresetActive const effectivePresetOverride = isUserPresetActive
? { handbrakePreset: selectedUserPreset.handbrakePreset || '', extraArgs: selectedUserPreset.extraArgs || '' } ? { handbrakePreset: selectedUserPreset.handbrakePreset || '', extraArgs: selectedUserPreset.extraArgs || '' }
: (isHandBrakePresetActive ? { handbrakePreset: trimmedHandBrakePreset, extraArgs: '' } : null); : (isHandBrakePresetActive
? { handbrakePreset: trimmedHandBrakePreset, extraArgs: settingsExtraArgsFallback }
: (presetSelectionExplicitlyCleared
? { handbrakePreset: '', extraArgs: settingsExtraArgsFallback }
: null));
const effectiveAudioSelector = effectivePresetOverride?.extraArgs const effectiveAudioSelector = effectivePresetOverride?.extraArgs
? parseAudioSelectorFromArgs(effectivePresetOverride.extraArgs, review?.selectors?.audio) ? parseAudioSelectorFromArgs(effectivePresetOverride.extraArgs, review?.selectors?.audio)
: (review?.selectors?.audio || null); : (review?.selectors?.audio || null);
const activePresetDisplayLabel = isUserPresetActive const activePresetDisplayLabel = isUserPresetActive
? 'User-Preset' ? 'User-Preset'
: ((isHandBrakePresetActive || String(presetLabel || '').trim()) ? 'HandBrake-Preset' : '(kein Preset)'); : (isHandBrakePresetActive
? 'HandBrake-Preset'
: (presetSelectionExplicitlyCleared ? 'Kein Preset' : (String(presetLabel || '').trim() ? 'HandBrake-Preset' : '(kein Preset)')));
const minLengthMinutes = Number(review?.minLengthMinutes); const minLengthMinutes = Number(review?.minLengthMinutes);
const minLengthLabel = Number.isFinite(minLengthMinutes) const minLengthLabel = Number.isFinite(minLengthMinutes)
? (minLengthMinutes <= 0 ? (minLengthMinutes <= 0
@@ -2240,6 +2253,9 @@ export default function MediaInfoReviewPanel({
optionDisabled="disabled" optionDisabled="disabled"
onChange={(e) => { onChange={(e) => {
const value = String(e?.value || '').trim(); const value = String(e?.value || '').trim();
if (typeof onPresetTokenChange === 'function') {
onPresetTokenChange(value);
}
if (value.startsWith('user:')) { if (value.startsWith('user:')) {
const presetId = Number(value.slice(5)); const presetId = Number(value.slice(5));
if (typeof onUserPresetChange === 'function') { if (typeof onUserPresetChange === 'function') {
+11 -2
View File
@@ -1679,6 +1679,7 @@ export default function PipelineStatusCard({
const [selectedUserPresetId, setSelectedUserPresetId] = useState(null); const [selectedUserPresetId, setSelectedUserPresetId] = useState(null);
const [handBrakePresetOptions, setHandBrakePresetOptions] = useState([]); const [handBrakePresetOptions, setHandBrakePresetOptions] = useState([]);
const [selectedHandBrakePreset, setSelectedHandBrakePreset] = useState(''); const [selectedHandBrakePreset, setSelectedHandBrakePreset] = useState('');
const [presetSelectionExplicitlyCleared, setPresetSelectionExplicitlyCleared] = useState(false);
const [selectedOutputFormat, setSelectedOutputFormat] = useState('mkv'); const [selectedOutputFormat, setSelectedOutputFormat] = useState('mkv');
const [converterConfigSaving, setConverterConfigSaving] = useState(false); const [converterConfigSaving, setConverterConfigSaving] = useState(false);
const [converterConfigError, setConverterConfigError] = useState(null); const [converterConfigError, setConverterConfigError] = useState(null);
@@ -1886,6 +1887,7 @@ export default function PipelineStatusCard({
setSelectedOutputFormat(nextOutputFormat); setSelectedOutputFormat(nextOutputFormat);
const userPresetId = Number(mediaInfoReview?.userPreset?.id); const userPresetId = Number(mediaInfoReview?.userPreset?.id);
const settingsPresetName = String(mediaInfoReview?.selectors?.preset || '').trim(); const settingsPresetName = String(mediaInfoReview?.selectors?.preset || '').trim();
setPresetSelectionExplicitlyCleared(false);
if (Number.isFinite(userPresetId) && userPresetId > 0) { if (Number.isFinite(userPresetId) && userPresetId > 0) {
setSelectedUserPresetId(Math.trunc(userPresetId)); setSelectedUserPresetId(Math.trunc(userPresetId));
setSelectedHandBrakePreset(''); setSelectedHandBrakePreset('');
@@ -1928,6 +1930,7 @@ export default function PipelineStatusCard({
setPostEncodeItems([]); setPostEncodeItems([]);
setSelectedUserPresetId(null); setSelectedUserPresetId(null);
setSelectedHandBrakePreset(''); setSelectedHandBrakePreset('');
setPresetSelectionExplicitlyCleared(false);
}, [mediaInfoReview, retryJobId]); }, [mediaInfoReview, retryJobId]);
const resolveEffectiveSelectedTitleIds = (reviewTitles = []) => { const resolveEffectiveSelectedTitleIds = (reviewTitles = []) => {
@@ -2344,8 +2347,9 @@ export default function PipelineStatusCard({
const settingsPresetFallback = String(mediaInfoReview?.selectors?.preset || '').trim(); const settingsPresetFallback = String(mediaInfoReview?.selectors?.preset || '').trim();
const settingsExtraArgsFallback = String(mediaInfoReview?.selectors?.extraArgs || '').trim(); const settingsExtraArgsFallback = String(mediaInfoReview?.selectors?.extraArgs || '').trim();
const hasSelectedPreset = Boolean(selectedUserPresetId) || Boolean(trimmedHandBrakePreset); const hasSelectedPreset = Boolean(selectedUserPresetId) || Boolean(trimmedHandBrakePreset);
const hasSettingsPresetForValidation = !presetSelectionExplicitlyCleared && Boolean(settingsPresetFallback);
const hasEffectiveSelectedPreset = hasSelectedPreset const hasEffectiveSelectedPreset = hasSelectedPreset
|| Boolean(settingsPresetFallback) || hasSettingsPresetForValidation
|| Boolean(settingsExtraArgsFallback); || Boolean(settingsExtraArgsFallback);
const converterMediaType = String(mediaInfoReview?.converterMediaType || 'video').trim().toLowerCase() || 'video'; const converterMediaType = String(mediaInfoReview?.converterMediaType || 'video').trim().toLowerCase() || 'video';
const showConverterConfig = jobMediaProfile === 'converter' && converterMediaType !== 'audio'; const showConverterConfig = jobMediaProfile === 'converter' && converterMediaType !== 'audio';
@@ -4342,7 +4346,7 @@ export default function PipelineStatusCard({
<div className="playlist-decision-block"> <div className="playlist-decision-block">
<h3>Preset-Auswahl erforderlich</h3> <h3>Preset-Auswahl erforderlich</h3>
<small> <small>
Es ist weder ein User-Preset noch ein Settings-Preset gesetzt. Bitte ein Preset auswählen, bevor das Encoding starten kann. Es ist kein gültiges Preset/CLI-Setup aktiv. Bitte Preset auswählen oder gültige Extra-Args hinterlegen.
</small> </small>
</div> </div>
) : null} ) : null}
@@ -4568,6 +4572,11 @@ export default function PipelineStatusCard({
setSelectedUserPresetId(null); setSelectedUserPresetId(null);
} }
}} }}
presetSelectionExplicitlyCleared={presetSelectionExplicitlyCleared}
onPresetTokenChange={showConverterConfig || multipartSettingsLocked ? null : (token) => {
const normalizedToken = String(token || '').trim().toLowerCase();
setPresetSelectionExplicitlyCleared(normalizedToken === 'none');
}}
handBrakePresetOptions={handBrakePresetOptions} handBrakePresetOptions={handBrakePresetOptions}
allowEncodeItemSelection={allowEncodeItemSelectionInReview} allowEncodeItemSelection={allowEncodeItemSelectionInReview}
comparisonReviewItems={multipartComparisonReviews} comparisonReviewItems={multipartComparisonReviews}