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
@@ -739,11 +739,15 @@ function buildHandBrakeCommandPreview({
hasExplicitVariantSelection: normalizedSubtitleSelectionMode === 'variants'
&& hasExplicitSelectedVariantSelection
});
const subtitleTrackIds = resolvedSubtitleSelection.subtitleTrackIds.length > 0
? resolvedSubtitleSelection.subtitleTrackIds
: (hasExplicitSelectedVariantSelection
? []
: normalizedSelectedSubtitleTrackIds);
const subtitleTrackIds = normalizedSubtitleSelectionMode === 'track_ids'
? normalizedSelectedSubtitleTrackIds
: (
resolvedSubtitleSelection.subtitleTrackIds.length > 0
? resolvedSubtitleSelection.subtitleTrackIds
: (hasExplicitSelectedVariantSelection
? []
: normalizedSelectedSubtitleTrackIds)
);
const selectedSubtitleSet = new Set(normalizeTrackIdList(subtitleTrackIds).map((id) => String(id)));
const selectedSubtitleTracks = (Array.isArray(title?.subtitleTracks) ? title.subtitleTracks : []).filter((track) => {
const id = normalizeTrackId(track?.id);
@@ -787,7 +791,7 @@ function buildHandBrakeCommandPreview({
if (subtitleDefaultTrackId !== null) {
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(',')}`);
}
@@ -1617,6 +1621,8 @@ export default function MediaInfoReviewPanel({
onUserPresetChange = null,
selectedHandBrakePreset = '',
onHandBrakePresetChange = null,
presetSelectionExplicitlyCleared = false,
onPresetTokenChange = null,
handBrakePresetOptions = [],
comparisonReviewItems = [],
topContent = null
@@ -1922,24 +1928,31 @@ export default function MediaInfoReviewPanel({
const isHandBrakePresetActive = !isUserPresetActive && Boolean(trimmedHandBrakePreset);
const settingsPresetFallback = String(review?.selectors?.preset || '').trim();
const settingsExtraArgsFallback = String(review?.selectors?.extraArgs || '').trim();
const usesSettingsFallbackOnly = !isUserPresetActive && !isHandBrakePresetActive;
const hasSettingsPresetFallback = Boolean(settingsPresetFallback);
const hasNoExplicitPresetSelected = !isUserPresetActive && !isHandBrakePresetActive;
const effectiveSettingsPresetFallback = presetSelectionExplicitlyCleared ? '' : settingsPresetFallback;
const hasSettingsPresetFallback = Boolean(effectiveSettingsPresetFallback);
const hasSettingsExtraArgsFallback = Boolean(settingsExtraArgsFallback);
const hasInvalidPresetConfig = usesSettingsFallbackOnly
const hasInvalidPresetConfig = hasNoExplicitPresetSelected
&& !hasSettingsPresetFallback
&& !hasSettingsExtraArgsFallback;
const hasSettingsArgsOnlyConfig = usesSettingsFallbackOnly
const hasSettingsArgsOnlyConfig = hasNoExplicitPresetSelected
&& !hasSettingsPresetFallback
&& hasSettingsExtraArgsFallback;
const effectivePresetOverride = isUserPresetActive
? { 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
? parseAudioSelectorFromArgs(effectivePresetOverride.extraArgs, review?.selectors?.audio)
: (review?.selectors?.audio || null);
const activePresetDisplayLabel = isUserPresetActive
? '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 minLengthLabel = Number.isFinite(minLengthMinutes)
? (minLengthMinutes <= 0
@@ -2240,6 +2253,9 @@ export default function MediaInfoReviewPanel({
optionDisabled="disabled"
onChange={(e) => {
const value = String(e?.value || '').trim();
if (typeof onPresetTokenChange === 'function') {
onPresetTokenChange(value);
}
if (value.startsWith('user:')) {
const presetId = Number(value.slice(5));
if (typeof onUserPresetChange === 'function') {
+11 -2
View File
@@ -1679,6 +1679,7 @@ export default function PipelineStatusCard({
const [selectedUserPresetId, setSelectedUserPresetId] = useState(null);
const [handBrakePresetOptions, setHandBrakePresetOptions] = useState([]);
const [selectedHandBrakePreset, setSelectedHandBrakePreset] = useState('');
const [presetSelectionExplicitlyCleared, setPresetSelectionExplicitlyCleared] = useState(false);
const [selectedOutputFormat, setSelectedOutputFormat] = useState('mkv');
const [converterConfigSaving, setConverterConfigSaving] = useState(false);
const [converterConfigError, setConverterConfigError] = useState(null);
@@ -1886,6 +1887,7 @@ export default function PipelineStatusCard({
setSelectedOutputFormat(nextOutputFormat);
const userPresetId = Number(mediaInfoReview?.userPreset?.id);
const settingsPresetName = String(mediaInfoReview?.selectors?.preset || '').trim();
setPresetSelectionExplicitlyCleared(false);
if (Number.isFinite(userPresetId) && userPresetId > 0) {
setSelectedUserPresetId(Math.trunc(userPresetId));
setSelectedHandBrakePreset('');
@@ -1928,6 +1930,7 @@ export default function PipelineStatusCard({
setPostEncodeItems([]);
setSelectedUserPresetId(null);
setSelectedHandBrakePreset('');
setPresetSelectionExplicitlyCleared(false);
}, [mediaInfoReview, retryJobId]);
const resolveEffectiveSelectedTitleIds = (reviewTitles = []) => {
@@ -2344,8 +2347,9 @@ export default function PipelineStatusCard({
const settingsPresetFallback = String(mediaInfoReview?.selectors?.preset || '').trim();
const settingsExtraArgsFallback = String(mediaInfoReview?.selectors?.extraArgs || '').trim();
const hasSelectedPreset = Boolean(selectedUserPresetId) || Boolean(trimmedHandBrakePreset);
const hasSettingsPresetForValidation = !presetSelectionExplicitlyCleared && Boolean(settingsPresetFallback);
const hasEffectiveSelectedPreset = hasSelectedPreset
|| Boolean(settingsPresetFallback)
|| hasSettingsPresetForValidation
|| Boolean(settingsExtraArgsFallback);
const converterMediaType = String(mediaInfoReview?.converterMediaType || 'video').trim().toLowerCase() || 'video';
const showConverterConfig = jobMediaProfile === 'converter' && converterMediaType !== 'audio';
@@ -4342,7 +4346,7 @@ export default function PipelineStatusCard({
<div className="playlist-decision-block">
<h3>Preset-Auswahl erforderlich</h3>
<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>
</div>
) : null}
@@ -4568,6 +4572,11 @@ export default function PipelineStatusCard({
setSelectedUserPresetId(null);
}
}}
presetSelectionExplicitlyCleared={presetSelectionExplicitlyCleared}
onPresetTokenChange={showConverterConfig || multipartSettingsLocked ? null : (token) => {
const normalizedToken = String(token || '').trim().toLowerCase();
setPresetSelectionExplicitlyCleared(normalizedToken === 'none');
}}
handBrakePresetOptions={handBrakePresetOptions}
allowEncodeItemSelection={allowEncodeItemSelectionInReview}
comparisonReviewItems={multipartComparisonReviews}