Skip to content

Commit 22e7ea8

Browse files
committed
feat: support automatic subtitle synchronization
- Implement SubSyncService to manage FFsubsync binary operations - Add methods for bootstrapping, executing, and shutting down the service - Integrate download functionality for FFsubsync binary - Update SettingsWindow to include SubSync settings and download options - Enhance UI with status indicators for SubSync binary installation
1 parent 0cf1dbd commit 22e7ea8

21 files changed

Lines changed: 796 additions & 45 deletions

SubRenamer/App.axaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
<ResourceDictionary>
1414
<ResourceDictionary.MergedDictionaries>
1515
<ResourceInclude Source="/Assets/Lang/zh-Hans.axaml" />
16+
<ResourceInclude Source="avares://LoadingIndicators.Avalonia/LoadingIndicators.axaml" />
1617
</ResourceDictionary.MergedDictionaries>
1718
</ResourceDictionary>
18-
1919
</Application.Resources>
20-
20+
2121
<Application.Styles>
2222
<FluentTheme />
2323
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>

SubRenamer/App.axaml.cs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Globalization;
33
using System.IO;
4+
using System.Linq;
45
using System.Threading.Tasks;
56
using Avalonia;
67
using Avalonia.Controls.ApplicationLifetimes;
@@ -61,6 +62,7 @@ public override void OnFrameworkInitializationCompleted()
6162
services.AddSingleton<IClipboardService>(x => new ClipboardService(desktop.MainWindow));
6263
services.AddSingleton<IImportService>(x => new ImportService(desktop.MainWindow));
6364
services.AddSingleton<IRenameService>(x => new RenameService(desktop.MainWindow));
65+
services.AddSingleton<ISubSyncService>(x => new SubSyncService(desktop.MainWindow));
6466
services.AddSingleton<IWindowService>(x => new WindowService(desktop.MainWindow, OnSetTopmost));
6567

6668
Services = services.BuildServiceProvider();
@@ -126,7 +128,7 @@ private void MenuSetting_OnClick(object? sender, EventArgs e)
126128
Current?.Services?.GetService<IDialogService>()?.OpenSettings();
127129
}
128130

129-
private static void _afterInitTasks(MainViewModel? mainWindowStore)
131+
private static void _afterInitTasks(MainViewModel store)
130132
{
131133
IssueReporter.CheckCrashAndShowDialog();
132134

@@ -139,10 +141,10 @@ private static void _afterInitTasks(MainViewModel? mainWindowStore)
139141
try
140142
{
141143
var updateSrc = await Updater.GetUpdatesAsync();
142-
if (updateSrc != null && mainWindowStore != null)
144+
if (updateSrc != null)
143145
{
144-
mainWindowStore.CurrVersionText += " " + Application.Current.GetResource<string>("App.Strings.MenuUpdateAlert");
145-
mainWindowStore.CurrVersionBtnLink = updateSrc;
146+
store.CurrVersionText += " " + Application.Current.GetResource<string>("App.Strings.MenuUpdateAlert");
147+
store.CurrVersionBtnLink = updateSrc;
146148
}
147149
}
148150
catch (Exception e)
@@ -165,6 +167,29 @@ private static void _afterInitTasks(MainViewModel? mainWindowStore)
165167
Console.WriteLine(e);
166168
}
167169
});
170+
171+
Task.Run(async () =>
172+
{
173+
var subSyncService = Current?.Services?.GetService<ISubSyncService>()!;
174+
subSyncService.OnBootstrapped += () =>
175+
{
176+
store.SubSyncAvailable = true;
177+
};
178+
subSyncService.OnShutdown += () =>
179+
{
180+
store.SubSyncAvailable = false;
181+
store.SubSyncEnabled = false;
182+
};
183+
try
184+
{
185+
await subSyncService.Bootstrap();
186+
}
187+
catch (Exception)
188+
{
189+
store.SubSyncAvailable = false;
190+
store.SubSyncEnabled = false;
191+
}
192+
});
168193
}
169194
}
170195
}

SubRenamer/Assets/Lang/en-US.axaml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<system:String x:Key="App.Strings.OpRules">Rules</system:String>
1212
<system:String x:Key="App.Strings.OpSettings">Settings</system:String>
1313
<system:String x:Key="App.Strings.OpPreview">Preview</system:String>
14+
<system:String x:Key="App.Strings.OpSubSync">Sync</system:String>
1415
<system:String x:Key="App.Strings.OpRename">Rename</system:String>
1516
<system:String x:Key="App.Strings.NativeMenuSettings">Settings...</system:String>
1617
<system:String x:Key="App.Strings.NativeMenuQuit">Quit SubRenamer</system:String>
@@ -32,6 +33,8 @@
3233
<system:String x:Key="App.Strings.ContextMenuRevealVideo">Reveal Video in Folder</system:String>
3334
<system:String x:Key="App.Strings.ContextMenuRevealSubtitle">Reveal Subtitle in Folder</system:String>
3435
<system:String x:Key="App.Strings.ContextMenuCopyRenameCommands">Copy Rename Commands to Clipboard</system:String>
36+
<system:String x:Key="App.Strings.ContextMenuPerformSubSync">Perform Subtitle Timeline Synchronization</system:String>
37+
<system:String x:Key="App.Strings.ContextMenuExitPreviewMode">Exit Preview Mode</system:String>
3538
<system:String x:Key="App.Strings.DataGridMatch">Match</system:String>
3639
<system:String x:Key="App.Strings.DataGridVideo">Video</system:String>
3740
<system:String x:Key="App.Strings.DataGridSubtitle">Subtitle</system:String>
@@ -110,7 +113,13 @@ It can be modified to: "[Steins;Gate][$$]*.sc.ass"</system:String>
110113
<system:String x:Key="App.Strings.SettingsVideoFormatExtension">Video Format Extension</system:String>
111114
<system:String x:Key="App.Strings.SettingsVideoFormatWatermark">e.g., mkv</system:String>
112115
<system:String x:Key="App.Strings.SettingsUpdateCheck">Check for Program Updates</system:String>
113-
<system:String x:Key="App.Strings.SettingsOpenSourceProgram">|´・ω・)ノ Hi! This is an open-source program</system:String>
116+
<system:String x:Key="App.Strings.SettingsSubSyncProgram">Automatic Subtitles Sync: </system:String>
117+
<system:String x:Key="App.Strings.SettingsSubSyncInstalled">Installed</system:String>
118+
<system:String x:Key="App.Strings.SettingsSubSyncNotInstalled">Not installed</system:String>
119+
<system:String x:Key="App.Strings.SettingsSubSyncDesc">Support FFsubsync + FFmpeg automatic subtitles timeline synchronization, additional download is required, and the ffsubsync_bin file in the current program directory is read by default</system:String>
120+
<system:String x:Key="App.Strings.SettingsSubSyncDownload">Download</system:String>
121+
<system:String x:Key="App.Strings.SettingsSubSyncViewReadme">View Readme</system:String>
122+
<system:String x:Key="App.Strings.SettingsOpenSourceProgram">|´・ω・)ノ Hi! SubRenamer is an open-source program</system:String>
114123
<system:String x:Key="App.Strings.SettingsConsiderStar1">You can find the source code on</system:String>
115124
<system:String x:Key="App.Strings.SettingsConsiderStar2">GitHub</system:String>
116125
<system:String x:Key="App.Strings.SettingsConsiderStar3">, please consider giving it a star 🌟, it would help us a lot!</system:String>
@@ -123,4 +132,12 @@ It can be modified to: "[Steins;Gate][$$]*.sc.ass"</system:String>
123132
<system:String x:Key="App.Strings.OpenFileDialogTitle">Select and Import Files</system:String>
124133
<system:String x:Key="App.Strings.OpenFolderDialogTitle">Import Folder</system:String>
125134
<system:String x:Key="App.Strings.SaveFileDialogTitle">Save File</system:String>
135+
<system:String x:Key="App.Strings.SubSyncTasksComplete">All tasks have been completed.</system:String>
136+
<system:String x:Key="App.Strings.SubSyncTasksFail">Task execution failed.</system:String>
137+
<system:String x:Key="App.Strings.SubSyncTasksDuration">Duration</system:String>
138+
<system:String x:Key="App.Strings.SubSyncBinDownloadTitle">FFsubsync automatic timeline synchronization</system:String>
139+
<system:String x:Key="App.Strings.SubSyncBinDownloadDesc">Downloading FFsubsync...</system:String>
140+
<system:String x:Key="App.Strings.SubSyncBinDownloadDone">FFsubsync download successful</system:String>
141+
<system:String x:Key="App.Strings.ProgressDialogCancel">Cancel</system:String>
142+
<system:String x:Key="App.Strings.ProgressDialogDone">Done</system:String>
126143
</ResourceDictionary>

SubRenamer/Assets/Lang/ja-JP.axaml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<system:String x:Key="App.Strings.OpRules">ルール</system:String>
1212
<system:String x:Key="App.Strings.OpSettings">設定</system:String>
1313
<system:String x:Key="App.Strings.OpPreview">プレビュー</system:String>
14+
<system:String x:Key="App.Strings.OpSubSync">同期</system:String>
1415
<system:String x:Key="App.Strings.OpRename">リネーム</system:String>
1516
<system:String x:Key="App.Strings.NativeMenuSettings">設定...</system:String>
1617
<system:String x:Key="App.Strings.NativeMenuQuit">SubRenamerを終了</system:String>
@@ -32,6 +33,8 @@
3233
<system:String x:Key="App.Strings.ContextMenuRevealVideo">フォルダでビデオファイルを見つける</system:String>
3334
<system:String x:Key="App.Strings.ContextMenuRevealSubtitle">フォルダで字幕ファイルを見つける</system:String>
3435
<system:String x:Key="App.Strings.ContextMenuCopyRenameCommands">リネームコマンドをクリップボードにコピー</system:String>
36+
<system:String x:Key="App.Strings.ContextMenuPerformSubSync">字幕タイムライン同期を実行する</system:String>
37+
<system:String x:Key="App.Strings.ContextMenuExitPreviewMode">レビューモードを終了</system:String>
3538
<system:String x:Key="App.Strings.DataGridMatch">マッチ</system:String>
3639
<system:String x:Key="App.Strings.DataGridVideo">ビデオ</system:String>
3740
<system:String x:Key="App.Strings.DataGridSubtitle">字幕</system:String>
@@ -110,7 +113,13 @@
110113
<system:String x:Key="App.Strings.SettingsVideoFormatExtension">ビデオフォーマット拡張</system:String>
111114
<system:String x:Key="App.Strings.SettingsVideoFormatWatermark">例: mkv</system:String>
112115
<system:String x:Key="App.Strings.SettingsUpdateCheck">プログラムの更新チェック</system:String>
113-
<system:String x:Key="App.Strings.SettingsOpenSourceProgram">|´・ω・)ノ こんにちは!これはオープンソースプログラムです</system:String>
116+
<system:String x:Key="App.Strings.SettingsSubSyncProgram">自動タイムライン同期: </system:String>
117+
<system:String x:Key="App.Strings.SettingsSubSyncInstalled">インストール済み</system:String>
118+
<system:String x:Key="App.Strings.SettingsSubSyncNotInstalled">インストールされていません</system:String>
119+
<system:String x:Key="App.Strings.SettingsSubSyncDesc">FFsubsync + FFmpeg 自動軸調整をサポートし、追加のダウンロードが必要で、デフォルトで現在のプログラム ディレクトリにある ffsubsync_bin ファイルを読み取ります</system:String>
120+
<system:String x:Key="App.Strings.SettingsSubSyncDownload">ダウンロード</system:String>
121+
<system:String x:Key="App.Strings.SettingsSubSyncViewReadme">手順を表示</system:String>
122+
<system:String x:Key="App.Strings.SettingsOpenSourceProgram">|´・ω・)ノ こんにちは! SubRenamer はオープン ソース プログラムです。</system:String>
114123
<system:String x:Key="App.Strings.SettingsConsiderStar1">あなたは</system:String>
115124
<system:String x:Key="App.Strings.SettingsConsiderStar2">GitHub</system:String>
116125
<system:String x:Key="App.Strings.SettingsConsiderStar3">でソースコードを見つけることができます。Star 🌟を付けていただけると嬉しいです!</system:String>
@@ -123,4 +132,12 @@
123132
<system:String x:Key="App.Strings.OpenFileDialogTitle">ファイルを選択してインポート</system:String>
124133
<system:String x:Key="App.Strings.OpenFolderDialogTitle">フォルダをインポート</system:String>
125134
<system:String x:Key="App.Strings.SaveFileDialogTitle">ファイルを保存</system:String>
135+
<system:String x:Key="App.Strings.SubSyncTasksComplete">すべてのタスクが完了しました。</system:String>
136+
<system:String x:Key="App.Strings.SubSyncTasksFail">タスクの実行に失敗しました。</system:String>
137+
<system:String x:Key="App.Strings.SubSyncTasksDuration">処理時間</system:String>
138+
<system:String x:Key="App.Strings.SubSyncBinDownloadTitle">FFsubsync の自動タイムライン同期</system:String>
139+
<system:String x:Key="App.Strings.SubSyncBinDownloadDesc">FFsubsync をダウンロードしています...</system:String>
140+
<system:String x:Key="App.Strings.SubSyncBinDownloadDone">FFsubsync のダウンロードに成功しました</system:String>
141+
<system:String x:Key="App.Strings.ProgressDialogCancel">キャンセル</system:String>
142+
<system:String x:Key="App.Strings.ProgressDialogDone">完了</system:String>
126143
</ResourceDictionary>

SubRenamer/Assets/Lang/zh-Hans.axaml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<system:String x:Key="App.Strings.OpRules">规则</system:String>
1212
<system:String x:Key="App.Strings.OpSettings">设置</system:String>
1313
<system:String x:Key="App.Strings.OpPreview">预览</system:String>
14+
<system:String x:Key="App.Strings.OpSubSync">调轴</system:String>
1415
<system:String x:Key="App.Strings.OpRename">一键改名</system:String>
1516
<system:String x:Key="App.Strings.NativeMenuSettings">设置...</system:String>
1617
<system:String x:Key="App.Strings.NativeMenuQuit">退出 SubRenamer</system:String>
@@ -32,6 +33,8 @@
3233
<system:String x:Key="App.Strings.ContextMenuRevealVideo">在文件夹中找到视频文件</system:String>
3334
<system:String x:Key="App.Strings.ContextMenuRevealSubtitle">在文件夹中找到字幕文件</system:String>
3435
<system:String x:Key="App.Strings.ContextMenuCopyRenameCommands">复制改名命令至剪切板</system:String>
36+
<system:String x:Key="App.Strings.ContextMenuPerformSubSync">执行字幕自动调轴程序</system:String>
37+
<system:String x:Key="App.Strings.ContextMenuExitPreviewMode">退出预览模式</system:String>
3538
<system:String x:Key="App.Strings.DataGridMatch">匹配</system:String>
3639
<system:String x:Key="App.Strings.DataGridVideo">视频</system:String>
3740
<system:String x:Key="App.Strings.DataGridSubtitle">字幕</system:String>
@@ -110,7 +113,13 @@
110113
<system:String x:Key="App.Strings.SettingsVideoFormatExtension">视频格式扩充</system:String>
111114
<system:String x:Key="App.Strings.SettingsVideoFormatWatermark">例如:mkv</system:String>
112115
<system:String x:Key="App.Strings.SettingsUpdateCheck">程序升级检查</system:String>
113-
<system:String x:Key="App.Strings.SettingsOpenSourceProgram">|´・ω・)ノ 嗨!这是开源程序</system:String>
116+
<system:String x:Key="App.Strings.SettingsSubSyncProgram">自动调轴程序:</system:String>
117+
<system:String x:Key="App.Strings.SettingsSubSyncInstalled">已安装</system:String>
118+
<system:String x:Key="App.Strings.SettingsSubSyncNotInstalled">未安装</system:String>
119+
<system:String x:Key="App.Strings.SettingsSubSyncDesc">支持 FFsubsync + FFmpeg 自动调轴,需额外下载,默认读取当前程序目录的 ffsubsync_bin 文件</system:String>
120+
<system:String x:Key="App.Strings.SettingsSubSyncDownload">下载</system:String>
121+
<system:String x:Key="App.Strings.SettingsSubSyncViewReadme">查看说明</system:String>
122+
<system:String x:Key="App.Strings.SettingsOpenSourceProgram">|´・ω・)ノ 嗨!SubRenamer 是开源程序</system:String>
114123
<system:String x:Key="App.Strings.SettingsConsiderStar1">你可以在</system:String>
115124
<system:String x:Key="App.Strings.SettingsConsiderStar2">GitHub</system:String>
116125
<system:String x:Key="App.Strings.SettingsConsiderStar3">找到源代码,请考虑点个 Star 🌟这会对我们很有帮助!</system:String>
@@ -123,4 +132,12 @@
123132
<system:String x:Key="App.Strings.OpenFileDialogTitle">选择并导入文件</system:String>
124133
<system:String x:Key="App.Strings.OpenFolderDialogTitle">导入文件夹</system:String>
125134
<system:String x:Key="App.Strings.SaveFileDialogTitle">保存文件</system:String>
135+
<system:String x:Key="App.Strings.SubSyncTasksComplete">所有任务已完成。</system:String>
136+
<system:String x:Key="App.Strings.SubSyncTasksFail">任务执行失败。</system:String>
137+
<system:String x:Key="App.Strings.SubSyncTasksDuration">执行耗时:</system:String>
138+
<system:String x:Key="App.Strings.SubSyncBinDownloadTitle">FFsubsync 自动调轴程序</system:String>
139+
<system:String x:Key="App.Strings.SubSyncBinDownloadDesc">正在下载 FFsubsync...</system:String>
140+
<system:String x:Key="App.Strings.SubSyncBinDownloadDone">FFsubsync 下载成功</system:String>
141+
<system:String x:Key="App.Strings.ProgressDialogCancel">取消</system:String>
142+
<system:String x:Key="App.Strings.ProgressDialogDone">完成</system:String>
126143
</ResourceDictionary>

0 commit comments

Comments
 (0)