Skip to content

Commit a54d130

Browse files
committed
feat(Core): no longer embed OCR model inside binary
1 parent 7a6e99f commit a54d130

File tree

7 files changed

+477
-231
lines changed

7 files changed

+477
-231
lines changed

SnapX.Avalonia/ViewModels/OCRViewModel.cs

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,34 +31,46 @@ public static readonly (string Display, string Code)[] _languages =
3131

3232
[ObservableProperty]
3333
public int selectedLanguageIndex;
34-
public ObservableCollection<string> LanguageDisplayNames { get; } = new(_languages.Select(l => l.Display));
34+
public ObservableCollection<string> LanguageDisplayNames { get; } =
35+
new(_languages.Select(l => l.Display));
3536

3637
public string GetLanguageCode(int index) => _languages[index].Code;
3738

38-
public async Task<string> RunOCRAsync(HistoryItem? Item = null, string? languageCode = null)
39+
public async Task<string> RunOCRAsync(
40+
HistoryItem? Item = null,
41+
string? languageCode = null,
42+
Progress<TaskHelpers.OCRProgress>? progressHandler = null
43+
)
3944
{
40-
return await Task.Factory.StartNew(async () =>
41-
{
42-
Image? img = null;
43-
44-
if (img is null && Item?.BestImageSource is not null)
45+
return await Task
46+
.Factory.StartNew(
47+
async () =>
4548
{
46-
if (!Uri.IsWellFormedUriString(Item.BestImageSource, UriKind.Absolute))
47-
{
48-
// It's likely a file path, so no need to download
49-
}
50-
else
49+
Image? img = null;
50+
51+
if (img is null && Item?.BestImageSource is not null)
5152
{
52-
img = await WebHelpers.DownloadImageAsync(Item.BestImageSource);
53+
if (!Uri.IsWellFormedUriString(Item.BestImageSource, UriKind.Absolute))
54+
{
55+
// It's likely a file path, so no need to download
56+
}
57+
else
58+
{
59+
img = await WebHelpers.DownloadImageAsync(Item.BestImageSource);
60+
}
5361
}
54-
}
55-
5662

57-
return await TaskHelpers.OCRImage(img, Item?.BestImageSource, TaskSettings.GetDefaultTaskSettings(), languageCode);
58-
},
59-
CancellationToken.None,
60-
TaskCreationOptions.LongRunning,
61-
TaskScheduler.Default).Unwrap();
63+
return await TaskHelpers.OCRImage(
64+
img,
65+
Item?.BestImageSource,
66+
TaskSettings.GetDefaultTaskSettings(),
67+
languageCode, progressHandler
68+
);
69+
},
70+
CancellationToken.None,
71+
TaskCreationOptions.LongRunning,
72+
TaskScheduler.Default
73+
)
74+
.Unwrap();
6275
}
63-
6476
}

SnapX.Avalonia/Views/OCR.axaml.cs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using SnapX.Core;
66
using SnapX.Core.History;
77
using SnapX.Core.Utils;
8+
using static SnapX.Core.Job.TaskHelpers;
89

910
namespace SnapX.Avalonia.Views;
1011

@@ -13,7 +14,6 @@ public partial class OCR : AppWindow
1314
private OCRViewModel _ocrViewModel;
1415
private HistoryItem? _item;
1516

16-
1717
public OCR(HistoryItem? item, OCRViewModel viewModel)
1818
{
1919
DataContext = viewModel;
@@ -29,18 +29,22 @@ public OCR(HistoryItem? item, OCRViewModel viewModel)
2929
// LoadImage();
3030
// RunOCR(_languages[0]);
3131
}
32-
public OCR() : this(null, new OCRViewModel())
33-
{
34-
}
35-
public OCR(HistoryItem item) : this(item, new OCRViewModel())
36-
{
37-
}
3832

39-
private async void LanguageSelector_SelectionChanged(object? sender, SelectionChangedEventArgs e)
33+
public OCR()
34+
: this(null, new OCRViewModel()) { }
35+
36+
public OCR(HistoryItem item)
37+
: this(item, new OCRViewModel()) { }
38+
39+
private async void LanguageSelector_SelectionChanged(
40+
object? sender,
41+
SelectionChangedEventArgs e
42+
)
4043
{
4144
DebugHelper.WriteLine($"{nameof(LanguageSelector_SelectionChanged)} triggered");
4245

43-
if (LanguageSelector?.SelectedIndex is not (>= 0 and var index)) return;
46+
if (LanguageSelector?.SelectedIndex is not (>= 0 and var index))
47+
return;
4448

4549
_ocrViewModel.SelectedLanguageIndex = index;
4650

@@ -53,8 +57,21 @@ private async Task RunOCRAsync(string languageCode)
5357
DebugHelper.WriteLine($"{nameof(RunOCRAsync)} triggered");
5458
var textBox = this.FindControl<TextBox>("ResultText")!;
5559
textBox.Text = Lang.Processing;
56-
var result = await _ocrViewModel.RunOCRAsync(_item, languageCode);
57-
if (SingleLine?.IsChecked ?? false) result = result.Replace("\r", "").Replace("\n", "");
60+
LanguageSelector?.IsEnabled = false;
61+
62+
var progressHandler = new Progress<OCRProgress>(update =>
63+
{
64+
textBox.Text = $"[{update.Percent}%] {update.Status}";
65+
});
66+
67+
var result = await _ocrViewModel.RunOCRAsync(_item, languageCode, progressHandler);
68+
69+
if (SingleLine?.IsChecked ?? false)
70+
{
71+
result = result.Replace("\r", "").Replace("\n", "");
72+
}
73+
LanguageSelector?.IsEnabled = true;
74+
5875
textBox.Text = result;
5976
}
6077

@@ -76,4 +93,3 @@ private void CopyResult_Click(object? Sender, RoutedEventArgs E)
7693
Clipboard?.SetTextAsync(ResultText.Text);
7794
}
7895
}
79-

0 commit comments

Comments
 (0)