Skip to content

Commit

Permalink
add support for using command line args as input; add support for dra…
Browse files Browse the repository at this point in the history
…g and drop folders
  • Loading branch information
arition committed May 28, 2024
1 parent a8b1072 commit a29595c
Show file tree
Hide file tree
Showing 3 changed files with 279 additions and 279 deletions.
5 changes: 3 additions & 2 deletions SubRenamer/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
BorderBrush="{DynamicResource AccentColorBrush}"
BorderThickness="1"
WindowStartupLocation="CenterScreen"
Title="SubRenamer" Height="600" Width="1100" FontFamily="{DynamicResource DefaultFont}">
Title="SubRenamer" Height="700" Width="1400" FontFamily="{DynamicResource DefaultFont}"
>
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVis" />
</Window.Resources>
Expand Down Expand Up @@ -41,7 +42,7 @@
<GridViewColumn Header="原视频文件名" Width="350" DisplayMemberBinding="{Binding OriginalMovieFileName}"/>
<GridViewColumn Header="视频文件名" Width="350" DisplayMemberBinding="{Binding MovieFileName}"/>
<GridViewColumn Header="字幕文件名" Width="350" DisplayMemberBinding="{Binding SubFileName}"/>
<GridViewColumn Header="最终文件名" Width="350" DisplayMemberBinding="{Binding RenamedSubFileName}"/>
<GridViewColumn Header="最终文件名" Width="700" DisplayMemberBinding="{Binding RenamedSubFileName}"/>
</GridView>
</ListView.View>
</ListView>
Expand Down
304 changes: 153 additions & 151 deletions SubRenamer/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,192 +13,194 @@
using NLog;
using SubRenamer.Annotations;

namespace SubRenamer
namespace SubRenamer;

/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : INotifyPropertyChanged
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : INotifyPropertyChanged
private bool _copySub;
private bool _eatSushi;
private string _subtitleFileExtension;

public MainWindow()
{
private bool _copySub;
private bool _eatSushi;
private string _subtitleFileExtension;
DataContext = this;
InitializeComponent();
Column = GridView.Columns[0];
GridView.Columns.RemoveAt(0);

public MainWindow()
// watch theme
if (OperatingSystem.IsWindows())
{
DataContext = this;
InitializeComponent();
Column = GridView.Columns[0];
GridView.Columns.RemoveAt(0);

if (OperatingSystem.IsWindows())
{
Theme.OnWindowsThemeChanged += ((sender, theme) =>
Dispatcher.Invoke(() =>
ThemeManager.Current.ChangeTheme(this,
theme == WindowsTheme.Theme.Light ? "Light.Steel" : "Dark.Steel")));
Theme.WatchTheme();
}
Theme.OnWindowsThemeChanged += (sender, theme) =>
Dispatcher.Invoke(() =>
ThemeManager.Current.ChangeTheme(this,
theme == WindowsTheme.Theme.Light ? "Light.Steel" : "Dark.Steel"));
Theme.WatchTheme();
}

private GridViewColumn Column { get; }
public ModelList ModelList { get; } = new();
private Logger Logger { get; } = LogManager.GetCurrentClassLogger();
private Logger SushiLogger { get; } = LogManager.GetLogger("Sushi");
private WindowsTheme Theme { get; } = new();
// add files from command line
var args = Environment.GetCommandLineArgs();
ModelList.AddDropFiles(args, EatSushi);
}

private GridViewColumn Column { get; }
public ModelList ModelList { get; } = new();
private Logger Logger { get; } = LogManager.GetCurrentClassLogger();
private Logger SushiLogger { get; } = LogManager.GetLogger("Sushi");
private WindowsTheme Theme { get; } = new();

public string SubtitleFileExtension
public string SubtitleFileExtension
{
get => _subtitleFileExtension;
set
{
get => _subtitleFileExtension;
set
{
ModelList.SubtitleFileExtension = value;
_subtitleFileExtension = value;
OnPropertyChanged();
}
ModelList.SubtitleFileExtension = value;
_subtitleFileExtension = value;
OnPropertyChanged();
}
}

public bool CopySub
public bool CopySub
{
get => _copySub;
set
{
get => _copySub;
set
{
_copySub = value;
OnPropertyChanged();
}
_copySub = value;
OnPropertyChanged();
}
}

public bool EatSushi
public bool EatSushi
{
get => _eatSushi;
set
{
get => _eatSushi;
set
{
_eatSushi = value;
if (_eatSushi)
GridView.Columns.Insert(0, Column);
else
GridView.Columns.RemoveAt(0);
OnPropertyChanged();
}
_eatSushi = value;
if (_eatSushi)
GridView.Columns.Insert(0, Column);
else
GridView.Columns.RemoveAt(0);
OnPropertyChanged();
}
}

public event PropertyChangedEventHandler PropertyChanged;
public event PropertyChangedEventHandler PropertyChanged;

private void BtnSelectOriginalMovie_OnClick(object sender, RoutedEventArgs e)
private void BtnSelectOriginalMovie_OnClick(object sender, RoutedEventArgs e)
{
var selectFile = new OpenFileDialog
{
var selectFile = new OpenFileDialog
{
Multiselect = true,
Filter = "视频文件(*.mp4;*.m4v;*.mkv;*.m2ts;*.webm)|*.mp4;*.m4v;*.mkv;*.m2ts;*.webm|所有文件 (*.*)|*.*"
};
if (selectFile.ShowDialog() == true) ModelList.AddOriginalMovie(selectFile.FileNames);
}
Multiselect = true,
Filter = "视频文件(*.mp4;*.m4v;*.mkv;*.m2ts;*.webm)|*.mp4;*.m4v;*.mkv;*.m2ts;*.webm|所有文件 (*.*)|*.*"
};
if (selectFile.ShowDialog() == true) ModelList.AddOriginalMovie(selectFile.FileNames);
}

private void BtnSelectMovie_OnClick(object sender, RoutedEventArgs e)
private void BtnSelectMovie_OnClick(object sender, RoutedEventArgs e)
{
var selectFile = new OpenFileDialog
{
var selectFile = new OpenFileDialog
{
Multiselect = true,
Filter = "视频文件(*.mp4;*.m4v;*.mkv;*.m2ts;*.webm)|*.mp4;*.m4v;*.mkv;*.m2ts;*.webm|所有文件 (*.*)|*.*"
};
if (selectFile.ShowDialog() == true) ModelList.AddMovie(selectFile.FileNames);
}
Multiselect = true,
Filter = "视频文件(*.mp4;*.m4v;*.mkv;*.m2ts;*.webm)|*.mp4;*.m4v;*.mkv;*.m2ts;*.webm|所有文件 (*.*)|*.*"
};
if (selectFile.ShowDialog() == true) ModelList.AddMovie(selectFile.FileNames);
}

private void BtnSelectSub_OnClick(object sender, RoutedEventArgs e)
private void BtnSelectSub_OnClick(object sender, RoutedEventArgs e)
{
var selectFile = new OpenFileDialog
{
var selectFile = new OpenFileDialog
{
Multiselect = true,
Filter = "字幕文件(*.ass;*.ssa;*.srt;*.sub;*.idx)|*.ass;*.ssa;*.srt;*.sub;*.idx|所有文件 (*.*)|*.*"
};
if (selectFile.ShowDialog() == true) ModelList.AddSub(selectFile.FileNames);
}
Multiselect = true,
Filter = "字幕文件(*.ass;*.ssa;*.srt;*.sub;*.idx)|*.ass;*.ssa;*.srt;*.sub;*.idx|所有文件 (*.*)|*.*"
};
if (selectFile.ShowDialog() == true) ModelList.AddSub(selectFile.FileNames);
}

private async void BtnRename_OnClick(object sender, RoutedEventArgs e)
private async void BtnRename_OnClick(object sender, RoutedEventArgs e)
{
ProgressDialogController controller = null;
if (EatSushi)
{
ProgressDialogController controller = null;
if (EatSushi)
{
controller = await this.ShowProgressAsync("正在处理", "正在处理第1个字幕");
controller.Minimum = 0;
controller.Maximum = 1;
}
controller = await this.ShowProgressAsync("正在处理", "正在处理第1个字幕");
controller.Minimum = 0;
controller.Maximum = 1;
}

var sb = new StringBuilder();
for (var i = 0; i < ModelList.Models.Count; i++)
var sb = new StringBuilder();
for (var i = 0; i < ModelList.Models.Count; i++)
{
if (EatSushi) controller?.SetMessage($"正在处理第{i + 1}个字幕");
Logger.Info($"正在处理第{i + 1}个字幕");
var model = ModelList.Models[i];
try
{
if (EatSushi) controller?.SetMessage($"正在处理第{i + 1}个字幕");
Logger.Info($"正在处理第{i + 1}个字幕");
var model = ModelList.Models[i];
try
{
model.GenerateRenameSubFiles(CopySub);
for (var j = 0; j < model.SubFiles.Count; j++)
model.GenerateRenameSubFiles(CopySub);
for (var j = 0; j < model.SubFiles.Count; j++)
if (!EatSushi)
{
if (!EatSushi)
{
if (CopySub) model.SubFiles[j].CopyTo(model.RenamedSubFiles[j].FullName);
else model.SubFiles[j].MoveTo(model.RenamedSubFiles[j].FullName);
}
else
if (CopySub) model.SubFiles[j].CopyTo(model.RenamedSubFiles[j].FullName);
else model.SubFiles[j].MoveTo(model.RenamedSubFiles[j].FullName);
}
else
{
var process = new Process
{
var process = new Process
StartInfo = new ProcessStartInfo
{
StartInfo = new ProcessStartInfo
{
FileName = Path.Combine("Sushi", "sushi.exe"),
Arguments = $"--src \"{model.OriginalMovieFile.FullName}\" " +
$"--dst \"{model.MovieFile.FullName}\" " +
$"--script \"{model.SubFiles[j].FullName}\" " +
$"-o \"{model.RenamedSubFiles[j].FullName}\"",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
}
};
process.OutputDataReceived += (senderx, ex) => SushiLogger.Info(ex.Data);
process.ErrorDataReceived += (senderx, ex) => SushiLogger.Info(ex.Data);
process.Start();
await Task.Run(() => process.WaitForExit());
if (!CopySub) model.SubFiles[j].Delete();
}
FileName = Path.Combine("Sushi", "sushi.exe"),
Arguments = $"--src \"{model.OriginalMovieFile.FullName}\" " +
$"--dst \"{model.MovieFile.FullName}\" " +
$"--script \"{model.SubFiles[j].FullName}\" " +
$"-o \"{model.RenamedSubFiles[j].FullName}\"",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
}
};
process.OutputDataReceived += (senderx, ex) => SushiLogger.Info(ex.Data);
process.ErrorDataReceived += (senderx, ex) => SushiLogger.Info(ex.Data);
process.Start();
await Task.Run(() => process.WaitForExit());
if (!CopySub) model.SubFiles[j].Delete();
}
}
catch (Exception ex)
{
sb.AppendLine($"第{i + 1}个字幕出现错误:{ex.Message}");
Logger.Error(ex, $"第{i + 1}个字幕出现错误");
}

if (EatSushi) controller?.SetProgress((i + 1d) / ModelList.Models.Count);
}
catch (Exception ex)
{
sb.AppendLine($"第{i + 1}个字幕出现错误:{ex.Message}");
Logger.Error(ex, $"第{i + 1}个字幕出现错误");
}

if (EatSushi && controller != null) await controller.CloseAsync();
Logger.Info("重命名完成");
var message = sb.ToString();
if (string.IsNullOrWhiteSpace(message))
await this.ShowMessageAsync("成功", "重命名成功");
else
await this.ShowMessageAsync("错误", message);
ModelList.Models.Clear();
if (EatSushi) controller?.SetProgress((i + 1d) / ModelList.Models.Count);
}

private void BtnClearList_OnClick(object sender, RoutedEventArgs e)
{
ModelList.Models.Clear();
}
if (EatSushi && controller != null) await controller.CloseAsync();
Logger.Info("重命名完成");
var message = sb.ToString();
if (string.IsNullOrWhiteSpace(message))
await this.ShowMessageAsync("成功", "重命名成功");
else
await this.ShowMessageAsync("错误", message);
ModelList.Models.Clear();
}

private void ListInfo_OnDrop(object sender, DragEventArgs e)
{
if (e.Data.GetData(DataFormats.FileDrop) is string[] files)
ModelList.AddDropFiles(files, EatSushi);
}
private void BtnClearList_OnClick(object sender, RoutedEventArgs e)
{
ModelList.Models.Clear();
}

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void ListInfo_OnDrop(object sender, DragEventArgs e)
{
if (e.Data.GetData(DataFormats.FileDrop) is string[] files)
ModelList.AddDropFiles(files, EatSushi);
}

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Loading

0 comments on commit a29595c

Please sign in to comment.