Persist remove foreign tracks add option

This commit is contained in:
Emby Toolbox 2026-05-16 15:09:56 +05:00
parent 642656971c
commit 62c700c8cd
5 changed files with 80 additions and 46 deletions

View File

@ -76,7 +76,8 @@ public sealed class AppSettingsService
LastTrackExtractDestinationFolder = settings.LastTrackExtractDestinationFolder,
LastCommonFolder = settings.LastCommonFolder,
CopyPreviousTrackSettings = settings.CopyPreviousTrackSettings,
DisableSubtitleDefault = settings.DisableSubtitleDefault
DisableSubtitleDefault = settings.DisableSubtitleDefault,
RemoveForeignTracksByDefault = settings.RemoveForeignTracksByDefault
};
var settingsDir = Path.GetDirectoryName(_settingsFilePath)!;
@ -97,6 +98,7 @@ public sealed class AppSettingsService
IsLogCollapsed = true,
CopyPreviousTrackSettings = false,
DisableSubtitleDefault = false,
RemoveForeignTracksByDefault = false,
NotifyCompletionSoundAfterQueue = true,
NotifyWindowsToastAfterQueue = true,
ConversionProfiles = CreateDefaultProfiles()
@ -351,6 +353,8 @@ public sealed record AppSettings
/// <summary>Конвертация: выключать default у всех subtitle-дорожек.</summary>
public bool DisableSubtitleDefault { get; set; }
public bool RemoveForeignTracksByDefault { get; set; }
/// <summary>После завершения очереди конвертации воспроизводить системный звук Windows.</summary>
public bool NotifyCompletionSoundAfterQueue { get; set; } = true;

View File

@ -18,12 +18,14 @@ public sealed class AddFilesOptionsViewModel : INotifyPropertyChanged
IReadOnlyList<ConversionProfilePresetRow> profiles,
string selectedProfileName,
bool disableSubtitleDefault,
bool removeForeignAudioAndSubtitles,
Action<AddFilesOptions> onAdd,
Action onCancel)
{
_onAdd = onAdd;
_onCancel = onCancel;
_disableSubtitleDefault = disableSubtitleDefault;
_removeForeignAudioAndSubtitles = removeForeignAudioAndSubtitles;
Profiles = new ObservableCollection<ConversionProfilePresetRow>(profiles);
_selectedProfile = Profiles.FirstOrDefault(p => p.Profile.Equals(selectedProfileName, StringComparison.OrdinalIgnoreCase))
?? Profiles.FirstOrDefault(p => p.Profile.Equals("Emby", StringComparison.OrdinalIgnoreCase))

View File

@ -43,6 +43,7 @@ public sealed class ConversionViewModel : INotifyPropertyChanged
private string _defaultQueueProfile = "Emby";
private bool _copyPreviousTrackSettings;
private bool _disableSubtitleDefault;
private bool _removeForeignTracksByDefault;
private ConversionProfilePresetRow? _selectedDefaultProfile;
private bool _isQueueDropHighlight;
private bool _isExecutionRunning;
@ -459,6 +460,21 @@ public sealed class ConversionViewModel : INotifyPropertyChanged
}
}
public bool RemoveForeignTracksByDefault
{
get => _removeForeignTracksByDefault;
set
{
if (_removeForeignTracksByDefault == value)
{
return;
}
_removeForeignTracksByDefault = value;
OnPropertyChanged();
}
}
public void SyncDefaultProfileFromList(IReadOnlyList<ConversionProfilePresetRow> profiles)
{
if (profiles is null || profiles.Count == 0)
@ -1757,11 +1773,13 @@ public sealed class ConversionViewModel : INotifyPropertyChanged
_presetRowsForSetup(),
CurrentProfileNameForNewTasks(),
DisableSubtitleDefault,
RemoveForeignTracksByDefault,
options =>
{
selected = options;
_defaultQueueProfile = options.Profile;
DisableSubtitleDefault = options.DisableSubtitleDefault;
RemoveForeignTracksByDefault = options.RemoveForeignAudioAndSubtitles;
SyncDefaultProfileFromList(_presetRowsForSetup());
dialog.DialogResult = true;
dialog.Close();

View File

@ -97,6 +97,7 @@ public sealed class MainWindowViewModel : INotifyPropertyChanged
ApplyConversionProfilesFromQueueSetupDocument);
Conversion.CopyPreviousTrackSettings = _loadedSettings.CopyPreviousTrackSettings;
Conversion.DisableSubtitleDefault = _loadedSettings.DisableSubtitleDefault;
Conversion.RemoveForeignTracksByDefault = _loadedSettings.RemoveForeignTracksByDefault;
Conversion.SyncDefaultProfileFromList(ConversionProfiles.ToList());
VideoInfo = new VideoInfoViewModel(
ff,
@ -378,6 +379,7 @@ public sealed class MainWindowViewModel : INotifyPropertyChanged
IsLogCollapsed = true,
CopyPreviousTrackSettings = Conversion.CopyPreviousTrackSettings,
DisableSubtitleDefault = Conversion.DisableSubtitleDefault,
RemoveForeignTracksByDefault = Conversion.RemoveForeignTracksByDefault,
NotifyCompletionSoundAfterQueue = NotifyCompletionSoundAfterQueue,
NotifyWindowsToastAfterQueue = NotifyWindowsToastAfterQueue,
ConversionProfiles = ConversionProfiles
@ -421,6 +423,7 @@ public sealed class MainWindowViewModel : INotifyPropertyChanged
LoadConversionProfiles(_loadedSettings.ConversionProfiles);
Conversion.CopyPreviousTrackSettings = _loadedSettings.CopyPreviousTrackSettings;
Conversion.DisableSubtitleDefault = _loadedSettings.DisableSubtitleDefault;
Conversion.RemoveForeignTracksByDefault = _loadedSettings.RemoveForeignTracksByDefault;
_logging.Info("изменения в настройках отменены", "settings");
}
@ -601,6 +604,10 @@ public sealed class MainWindowViewModel : INotifyPropertyChanged
{
PersistDisableSubtitleDefault();
}
else if (e.PropertyName == nameof(ConversionViewModel.RemoveForeignTracksByDefault))
{
PersistRemoveForeignTracksByDefault();
}
if (e.PropertyName == nameof(ConversionViewModel.IsExecutionRunning)
|| e.PropertyName == nameof(ConversionViewModel.OverallProgressPercent)
@ -664,6 +671,21 @@ public sealed class MainWindowViewModel : INotifyPropertyChanged
}
}
private void PersistRemoveForeignTracksByDefault()
{
try
{
var settings = _settingsService.Load();
settings.RemoveForeignTracksByDefault = Conversion.RemoveForeignTracksByDefault;
_settingsService.Save(settings);
_loadedSettings = settings;
}
catch
{
// ignore persistence errors for UI convenience flag
}
}
private void RefreshStatusBar()
{
var dispatcher = Application.Current?.Dispatcher ?? Dispatcher.CurrentDispatcher;

View File

@ -15,58 +15,46 @@
<Grid Grid.Row="0"
VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
Grid.Column="0"
Text="Профиль"
Style="{StaticResource UiTextCaption}"
VerticalAlignment="Center"
Margin="0,0,12,12" />
<ComboBox Grid.Row="0"
Grid.Column="1"
Style="{StaticResource UiCombo}"
ItemsSource="{Binding Profiles}"
SelectedItem="{Binding SelectedProfile, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Margin="0,0,0,12">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Profile, Mode=OneWay}"
TextTrimming="CharacterEllipsis" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<Grid Grid.Row="0"
Margin="0,0,0,12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="1"
Grid.Column="0"
Text="Отключать субтитры"
Style="{StaticResource UiTextCaption}"
VerticalAlignment="Center"
Margin="0,0,12,12" />
<CheckBox Grid.Row="1"
Grid.Column="1"
VerticalAlignment="Center"
IsChecked="{Binding DisableSubtitleDefault, Mode=TwoWay}"
Margin="0,0,0,12" />
<TextBlock Grid.Column="0"
Text="Профиль"
Style="{StaticResource UiTextCaption}"
VerticalAlignment="Center"
Margin="0,0,12,0" />
<ComboBox Grid.Column="1"
Style="{StaticResource UiCombo}"
ItemsSource="{Binding Profiles}"
SelectedItem="{Binding SelectedProfile, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Profile, Mode=OneWay}"
TextTrimming="CharacterEllipsis" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</Grid>
<TextBlock Grid.Row="2"
Grid.Column="0"
Text="Удалять иностранные дорожки"
Style="{StaticResource UiTextCaption}"
VerticalAlignment="Center"
Margin="0,0,12,0" />
<CheckBox Grid.Row="2"
Grid.Column="1"
VerticalAlignment="Center"
IsChecked="{Binding RemoveForeignAudioAndSubtitles, Mode=TwoWay}" />
<StackPanel Grid.Row="1"
Orientation="Horizontal">
<CheckBox VerticalAlignment="Center"
Content="Отключать субтитры"
IsChecked="{Binding DisableSubtitleDefault, Mode=TwoWay}"
Margin="0,0,18,0" />
<CheckBox VerticalAlignment="Center"
Content="Удалять иностранные дорожки"
IsChecked="{Binding RemoveForeignAudioAndSubtitles, Mode=TwoWay}" />
</StackPanel>
</Grid>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,12,0,0">