From 4f93a21098d6a7905c71b0b9f834febe3a0dda16 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Sat, 9 Aug 2025 04:11:25 -0500 Subject: [PATCH 1/2] Updated UI/App Settings Changed interval check from a Numeric spin box, to a pre-defined option selector. Now have 1/2 minute, 1 Minute, 30 Minutes, 1 hour, 6 hours, 12 hours and 24 hour intervals. --- FreeTubeSyncer/App.axaml.cs | 3 +++ FreeTubeSyncer/MainWindow.axaml | 8 +++++++- FreeTubeSyncer/Models/AppSetting.cs | 26 +++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/FreeTubeSyncer/App.axaml.cs b/FreeTubeSyncer/App.axaml.cs index 68ad15a..72c7439 100644 --- a/FreeTubeSyncer/App.axaml.cs +++ b/FreeTubeSyncer/App.axaml.cs @@ -125,6 +125,7 @@ public partial class App : Application _settings.SyncSearchHistory = @new.SyncSearchHistory; _settings.SyncSettings = @new.SyncSettings; _settings.SettingsDirty = false; + _settings.UpdateInterval(); } public void SaveSettings() @@ -146,11 +147,13 @@ public partial class App : Application if (!File.Exists(path)) { _settings = new AppSettings(); + _settings.UpdateInterval(); return; } var data = File.ReadAllText(path); _settings = JsonSerializer.Deserialize(data); + _settings!.UpdateInterval(); } private string GetAppFolder() => Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "FreeTubeSyncer"); diff --git a/FreeTubeSyncer/MainWindow.axaml b/FreeTubeSyncer/MainWindow.axaml index 8ee3fa1..7efbfa5 100644 --- a/FreeTubeSyncer/MainWindow.axaml +++ b/FreeTubeSyncer/MainWindow.axaml @@ -24,7 +24,13 @@ - + + + + + + + _checkIntervalOptions = [ + new CheckIntervalOption("1/2 Minute", 30), + new CheckIntervalOption("1 Minute", 60), + new CheckIntervalOption("30 Minutes", 1800), + new CheckIntervalOption("1 Hour", 3600), + new CheckIntervalOption("6 Hours", 21600), + new CheckIntervalOption("12 Hours", 43200), + new CheckIntervalOption("24 Hours", 86400), + ]; public AppSettings() { @@ -21,7 +33,19 @@ public partial class AppSettings : ObservableObject if (args.PropertyName == nameof(SettingsDirty)) return; + if (args.PropertyName == nameof(SelectedOption)) + _checkInterval = SelectedOption?.Interval ?? 30; + SettingsDirty = true; }; } -} \ No newline at end of file + + public void UpdateInterval() + { + int[] intervals = [30, 60, 1800, 3600, 21600, 43200, 86400]; + var i = intervals.IndexOf(CheckInterval); + SelectedOption = CheckIntervalOptions[i]; + } +} + +public record CheckIntervalOption(string Label, int Interval); \ No newline at end of file From 829aa55c9fc542d39644710c1e4d7ef112ed00d2 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Sat, 9 Aug 2025 04:18:11 -0500 Subject: [PATCH 2/2] Updated Syncer Updated syncer to new API 0.1.5. Change ID Comparison to string comparison, instead of EqualId() function. Updated RemoveAll() to use string comparison, instead of EqualId() to remove. Added Try Catch retry 1 after delay. This happens when we post multiple copies of the same DB line entry, when it doesn't exist, and is added to the REST Server, while the REST server processes it in one thread, but it isn't updated properly in the new thread, and it fails, cause the item is in the database backend, and fails to process. Solution is to wait for a small delay, before attempting the post request again. If it fails a second time, then there's something majorly wrong. --- FreeTubeSyncer/REST/Syncer.cs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/FreeTubeSyncer/REST/Syncer.cs b/FreeTubeSyncer/REST/Syncer.cs index 0dfddf1..767be9c 100644 --- a/FreeTubeSyncer/REST/Syncer.cs +++ b/FreeTubeSyncer/REST/Syncer.cs @@ -82,7 +82,7 @@ public class Syncer : ISyncer where T : class, IDataModel, new() return false; } - if (res.AppVersion == "0.1.4") + if (res.AppVersion == "0.1.5") { Log.Information("Server Online! {AppVersion}", res.AppVersion); return true; @@ -197,18 +197,34 @@ public class Syncer : ISyncer where T : class, IDataModel, new() if (entry == null) continue; entry.MarshalData(entry.Id(), entryObject); - if (_entries.Any(x => x.EqualId(entry.Id()))) + if (_entries.Any(x => x.Id() == entry.Id())) { - var data = _entries.First(x => x.EqualId(entry.Id())); + var data = _entries.First(x => x.Id() == entry.Id()); if (data.Equals(entry)) continue; Log.Information("Updated File Entry {EntryId} updated for {DbName}", entry.Id(), _dbName); - _entries.RemoveAll(x => x.EqualId(entry.Id())); + _entries.RemoveAll(x => x.Id() == entry.Id()); } else Log.Information("New File Entry {EntryId} for {DbName}", entry.Id(), _dbName); _entries.Add(entry); - await _client.PostJsonAsync(_restEndpoint, entry); + try + { + await _client.PostJsonAsync(_restEndpoint, entry); + } + catch (Exception ex) + { + await Task.Delay(500); + try + { + await _client.PostJsonAsync(_restEndpoint, entry); + } + catch (Exception iex) + { + Log.Error("Failed to sync entry {id} to REST Database.", entry.Id()); + } + } + _lastLineCount = i; } }