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

View File

@ -18,12 +18,14 @@ public sealed class AddFilesOptionsViewModel : INotifyPropertyChanged
IReadOnlyList<ConversionProfilePresetRow> profiles, IReadOnlyList<ConversionProfilePresetRow> profiles,
string selectedProfileName, string selectedProfileName,
bool disableSubtitleDefault, bool disableSubtitleDefault,
bool removeForeignAudioAndSubtitles,
Action<AddFilesOptions> onAdd, Action<AddFilesOptions> onAdd,
Action onCancel) Action onCancel)
{ {
_onAdd = onAdd; _onAdd = onAdd;
_onCancel = onCancel; _onCancel = onCancel;
_disableSubtitleDefault = disableSubtitleDefault; _disableSubtitleDefault = disableSubtitleDefault;
_removeForeignAudioAndSubtitles = removeForeignAudioAndSubtitles;
Profiles = new ObservableCollection<ConversionProfilePresetRow>(profiles); Profiles = new ObservableCollection<ConversionProfilePresetRow>(profiles);
_selectedProfile = Profiles.FirstOrDefault(p => p.Profile.Equals(selectedProfileName, StringComparison.OrdinalIgnoreCase)) _selectedProfile = Profiles.FirstOrDefault(p => p.Profile.Equals(selectedProfileName, StringComparison.OrdinalIgnoreCase))
?? Profiles.FirstOrDefault(p => p.Profile.Equals("Emby", 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 string _defaultQueueProfile = "Emby";
private bool _copyPreviousTrackSettings; private bool _copyPreviousTrackSettings;
private bool _disableSubtitleDefault; private bool _disableSubtitleDefault;
private bool _removeForeignTracksByDefault;
private ConversionProfilePresetRow? _selectedDefaultProfile; private ConversionProfilePresetRow? _selectedDefaultProfile;
private bool _isQueueDropHighlight; private bool _isQueueDropHighlight;
private bool _isExecutionRunning; 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) public void SyncDefaultProfileFromList(IReadOnlyList<ConversionProfilePresetRow> profiles)
{ {
if (profiles is null || profiles.Count == 0) if (profiles is null || profiles.Count == 0)
@ -1757,11 +1773,13 @@ public sealed class ConversionViewModel : INotifyPropertyChanged
_presetRowsForSetup(), _presetRowsForSetup(),
CurrentProfileNameForNewTasks(), CurrentProfileNameForNewTasks(),
DisableSubtitleDefault, DisableSubtitleDefault,
RemoveForeignTracksByDefault,
options => options =>
{ {
selected = options; selected = options;
_defaultQueueProfile = options.Profile; _defaultQueueProfile = options.Profile;
DisableSubtitleDefault = options.DisableSubtitleDefault; DisableSubtitleDefault = options.DisableSubtitleDefault;
RemoveForeignTracksByDefault = options.RemoveForeignAudioAndSubtitles;
SyncDefaultProfileFromList(_presetRowsForSetup()); SyncDefaultProfileFromList(_presetRowsForSetup());
dialog.DialogResult = true; dialog.DialogResult = true;
dialog.Close(); dialog.Close();

View File

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

View File

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