Skip to content

Commit

Permalink
- minimize to tray
Browse files Browse the repository at this point in the history
- run on system startup. #39
  • Loading branch information
insomniachi committed Jul 15, 2023
1 parent 3926eb4 commit 7e49ed1
Show file tree
Hide file tree
Showing 28 changed files with 308 additions and 78 deletions.
10 changes: 5 additions & 5 deletions Totoro.Core.Tests/Totoro.Core.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
<PackageReference Include="Moq" Version="4.18.4" />
<PackageReference Include="ReactiveUI.Testing" Version="18.4.44" />
<PackageReference Include="ReactiveUI.Testing" Version="19.4.1" />
<PackageReference Include="RichardSzalay.MockHttp" Version="6.0.0" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PackageReference Include="xunit" Version="2.5.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.2.0">
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Expand Down
8 changes: 8 additions & 0 deletions Totoro.Core/Contracts/IConnectivityService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Totoro.Core.Contracts;

public interface IConnectivityService
{
bool IsConnected { get; }
IObservable<Unit> ConnectionLost { get; }
IObservable<Unit> Connected { get; }
}
12 changes: 10 additions & 2 deletions Totoro.Core/Contracts/ISettings.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System.ComponentModel;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging;
using System.ComponentModel;
using Totoro.Core.ViewModels;

namespace Totoro.Core.Contracts;
Expand Down Expand Up @@ -36,6 +36,14 @@ public interface ISettings : INotifyPropertyChanged
bool MediaDetectionEnabled { get; set; }
bool OnlyDetectMediaInLibraryFolders { get; set; }
ObservableCollection<string> LibraryFolders { get; set; }
StartupOptions StartupOptions { get; set; }
}

public class StartupOptions : ReactiveObject
{
[Reactive] public bool MinimizeToTrayOnClose { get; set; } = false;
[Reactive] public bool StartMinimizedToTray { get; set; } = false;
[Reactive] public bool RunOnStartup { get; set; } = false;
}

public class DefaultUrls : ReactiveObject
Expand Down
25 changes: 24 additions & 1 deletion Totoro.Core/Services/AnimeServiceContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
public class AnimeServiceContext : IAnimeServiceContext
{
private readonly ISettings _settings;
private readonly IConnectivityService _connectivityService;
private readonly Dictionary<ListServiceType, IAnimeService> _services;

public AnimeServiceContext(ISettings settings,
IEnumerable<IAnimeService> services)
IEnumerable<IAnimeService> services,
IConnectivityService connectivityService)
{
_settings = settings;
_connectivityService = connectivityService;
_services = services.Any()
? services.ToDictionary(x => x.Type, x => x)
: new();
Expand All @@ -18,21 +21,41 @@ public AnimeServiceContext(ISettings settings,

public IObservable<IEnumerable<AnimeModel>> GetAiringAnime()
{
if (!_connectivityService.IsConnected)
{
return Observable.Return(Enumerable.Empty<AnimeModel>());
}

return _services[_settings.DefaultListService].GetAiringAnime();
}

public IObservable<IEnumerable<AnimeModel>> GetAnime(string name)
{
if(!_connectivityService.IsConnected)
{
return Observable.Return(Enumerable.Empty<AnimeModel>());
}

return _services[_settings.DefaultListService].GetAnime(name);
}

public IObservable<AnimeModel> GetInformation(long id)
{
if (!_connectivityService.IsConnected)
{
return Observable.Return(new AnimeModel());
}

return _services[_settings.DefaultListService].GetInformation(id);
}

public IObservable<IEnumerable<AnimeModel>> GetSeasonalAnime()
{
if (!_connectivityService.IsConnected)
{
return Observable.Return(Enumerable.Empty<AnimeModel>());
}

return _services[_settings.DefaultListService].GetSeasonalAnime();
}
}
10 changes: 8 additions & 2 deletions Totoro.Core/Services/Initalizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public class Initalizer : IInitializer
private readonly IKnownFolders _knownFolders;
private readonly ILocalSettingsService _localSettingsService;
private readonly IRssDownloader _rssDownloader;
private readonly IConnectivityService _connectivityService;
private readonly PluginOptionsStorage _pluginOptionsStorage;
private readonly IUpdateService _updateService;
private readonly IResumePlaybackService _playbackStateStorage;
Expand All @@ -22,12 +23,14 @@ public Initalizer(IPluginManager pluginManager,
ITorrentEngine torrentEngine,
ILocalSettingsService localSettingsService,
IRssDownloader rssDownloader,
IConnectivityService connectivityService,
PluginOptionsStorage pluginOptionsStorage)
{
_pluginManager = pluginManager;
_knownFolders = knownFolders;
_localSettingsService = localSettingsService;
_rssDownloader = rssDownloader;
_connectivityService = connectivityService;
_pluginOptionsStorage = pluginOptionsStorage;
_updateService = updateService;
_playbackStateStorage = playbackStateStorage;
Expand All @@ -39,8 +42,11 @@ public async Task Initialize()
#if RELEASE
await _pluginManager.Initialize(_knownFolders.Plugins);
#endif
await _torrentEngine.TryRestoreState();
await _rssDownloader.Initialize();
if(_connectivityService.IsConnected)
{
await _torrentEngine.TryRestoreState();
await _rssDownloader.Initialize();
}
_pluginOptionsStorage.Initialize();
RemoveObsoleteSettings();
}
Expand Down
21 changes: 19 additions & 2 deletions Totoro.Core/Services/TrackingServiceContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ public class TrackingServiceContext : ITrackingServiceContext
{
private readonly Dictionary<ListServiceType, ITrackingService> _trackers;
private readonly ISettings _settings;
private readonly IConnectivityService _connectivityService;
private readonly Subject<ListServiceType> _authenticatedSubject = new();

public TrackingServiceContext(ISettings settings,
IEnumerable<ITrackingService> trackers)
IEnumerable<ITrackingService> trackers,
IConnectivityService connectivityService)
{
_settings = settings;

_connectivityService = connectivityService;
_trackers = trackers.Any()
? trackers.ToDictionary(x => x.Type, x => x)
: new();
Expand All @@ -23,11 +25,21 @@ public TrackingServiceContext(ISettings settings,
public IObservable<ListServiceType> Authenticated => _authenticatedSubject;
public IObservable<IEnumerable<AnimeModel>> GetAnime()
{
if (!_connectivityService.IsConnected)
{
return Observable.Return(Enumerable.Empty<AnimeModel>());
}

return _trackers[_settings.DefaultListService].GetAnime();
}

public IObservable<IEnumerable<AnimeModel>> GetCurrentlyAiringTrackedAnime()
{
if (!_connectivityService.IsConnected)
{
return Observable.Return(Enumerable.Empty<AnimeModel>());
}

return _trackers[_settings.DefaultListService].GetCurrentlyAiringTrackedAnime();
}

Expand All @@ -39,6 +51,11 @@ public void SetAccessToken(string token, ListServiceType type)

public IObservable<Tracking> Update(long id, Tracking tracking)
{
if (!_connectivityService.IsConnected)
{
return Observable.Return(tracking);
}

return _trackers[_settings.DefaultListService].Update(id, tracking);
}
}
5 changes: 3 additions & 2 deletions Totoro.Core/Services/WindowsUpdateService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,15 @@ public class WindowsUpdateService : ReactiveObject, IUpdateService, IEnableLogge

public WindowsUpdateService(HttpClient httpClient,
ISettings settings,
IKnownFolders knownFolders)
IKnownFolders knownFolders,
IConnectivityService connectivityService)
{
_httpClient = httpClient;
_knownFolders = knownFolders;

_onUpdate = Observable
.Timer(TimeSpan.Zero, TimeSpan.FromHours(1))
.Where(_ => settings.AutoUpdate)
.Where(_ => settings.AutoUpdate && connectivityService.IsConnected)
.ObserveOn(RxApp.TaskpoolScheduler)
.SelectMany(_ => TryGetStreamAsync())
.Where(x => !string.IsNullOrEmpty(x))
Expand Down
1 change: 1 addition & 0 deletions Totoro.Core/Settings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public static class Settings
public static Key<bool> MediaDetectionEnabled { get; } = new("MediaDetectionEnabled", false);
public static Key<bool> OnlyDetectMediaInLibraryFolders { get; } = new("OnlyDetectMediaInLibraryFolders", false);
public static Key<ObservableCollection<string>> LibraryFolders { get; } = new("LibraryFolders", new ObservableCollection<string>());
public static Key<StartupOptions> StartupOptions { get; } = new("StartupOptions", () => new StartupOptions());

public static IEnumerable<string> GetObsoleteKeys()
{
Expand Down
12 changes: 6 additions & 6 deletions Totoro.Core/Totoro.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,24 +26,24 @@

<ItemGroup>
<PackageReference Include="AnitomySharp" Version="0.2.0" />
<PackageReference Include="CliWrap" Version="3.6.3" />
<PackageReference Include="CliWrap" Version="3.6.4" />
<PackageReference Include="FuzzySharp" Version="2.0.2" />
<PackageReference Include="GraphQL.Client" Version="6.0.0" />
<PackageReference Include="GraphQL.Client.Serializer.Newtonsoft" Version="6.0.0" />
<PackageReference Include="Humanizer.Core.uk" Version="2.14.1" />
<PackageReference Include="JikanDotNet" Version="2.6.0" />
<PackageReference Include="JikanDotNet" Version="2.6.3" />
<PackageReference Include="MalApi.V2" Version="2.0.8" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0" />
<PackageReference Include="MonoTorrent" Version="2.0.7" />
<PackageReference Include="ReactiveUI.Fody" Version="18.4.44" />
<PackageReference Include="ReactiveUI.Fody" Version="19.4.1" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="SharpCompress" Version="0.33.0" />
<PackageReference Include="Splat.Microsoft.Extensions.Logging" Version="14.6.8" />
<PackageReference Include="Splat.Microsoft.Extensions.Logging" Version="14.6.37" />
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
<PackageReference Include="Splat.Serilog" Version="14.6.8" />
<PackageReference Include="Splat.Serilog" Version="14.6.37" />
<PackageReference Include="System.ServiceModel.Syndication" Version="7.0.0" />
<PackageReference Include="YoutubeExplode" Version="6.2.14" />
<PackageReference Include="YoutubeExplode" Version="6.2.17" />
<PackageReference Include="DiscordRichPresence" Version="1.1.3.18" />
</ItemGroup>

Expand Down
17 changes: 15 additions & 2 deletions Totoro.Core/ViewModels/DiscoverViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ namespace Totoro.Core.ViewModels;
public class DiscoverViewModel : NavigatableViewModel
{
private readonly INavigationService _navigationService;
private readonly IConnectivityService _connectivityService;
private readonly SourceCache<IAiredAnimeEpisode, string> _episodesCache = new(x => x.Url);
private readonly SourceCache<ICatalogItem, string> _animeSearchResultCache = new(x => x.Url);
private readonly ReadOnlyObservableCollection<IAiredAnimeEpisode> _episodes;
Expand All @@ -15,11 +16,12 @@ public class DiscoverViewModel : NavigatableViewModel

public DiscoverViewModel(IPluginFactory<AnimeProvider> providerFacotory,
ISettings settings,
INavigationService navigationService)
INavigationService navigationService,
IConnectivityService connectivityService)
{
_provider = providerFacotory.CreatePlugin(settings.DefaultProviderType);
_navigationService = navigationService;

_connectivityService = connectivityService;
_episodesCache
.Connect()
.RefCount()
Expand Down Expand Up @@ -69,6 +71,12 @@ public DiscoverViewModel(IPluginFactory<AnimeProvider> providerFacotory,
.Throttle(TimeSpan.FromMilliseconds(200))
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => _animeSearchResultCache.Clear());

connectivityService
.Connected
.Where(_ => !_episodesCache.Items.Any())
.SelectMany(_ => LoadPage(1))
.Subscribe();
}

[Reactive] public int SelectedIndex { get; set; }
Expand All @@ -92,6 +100,11 @@ public DiscoverViewModel(IPluginFactory<AnimeProvider> providerFacotory,

public override Task OnNavigatedTo(IReadOnlyDictionary<string, object> parameters)
{
if(!_connectivityService.IsConnected)
{
return Task.CompletedTask;
}

LoadPage(1).Subscribe(_ => { }, RxApp.DefaultExceptionHandler.OnError);

return Task.CompletedTask;
Expand Down
3 changes: 3 additions & 0 deletions Totoro.Core/ViewModels/SettingsModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public SettingsModel(ILocalSettingsService localSettingsService,
MediaDetectionEnabled = localSettingsService.ReadSetting(Settings.MediaDetectionEnabled);
OnlyDetectMediaInLibraryFolders = localSettingsService.ReadSetting(Settings.OnlyDetectMediaInLibraryFolders);
LibraryFolders = localSettingsService.ReadSetting(Settings.LibraryFolders);
StartupOptions = localSettingsService.ReadSetting(Settings.StartupOptions);

if (UseDiscordRichPresense && !_dRpc.IsInitialized)
{
Expand Down Expand Up @@ -83,6 +84,7 @@ public void ObserveChanges()
.Subscribe(_ => _localSettingsService.SaveSetting(Settings.LibraryFolders, LibraryFolders));

ObserveObject(TorrentSearchOptions, Settings.TorrentSearchOptions);
ObserveObject(StartupOptions, Settings.StartupOptions);
}

private void ObserveObject<T>(T target, Key<T> key)
Expand Down Expand Up @@ -132,6 +134,7 @@ private void ObserveObject<T>(T target, Key<T> key)
[Reactive] public bool MediaDetectionEnabled { get; set; }
[Reactive] public bool OnlyDetectMediaInLibraryFolders { get; set; }
public ObservableCollection<string> LibraryFolders { get; set; }
[Reactive] public StartupOptions StartupOptions { get; set; }
}


Expand Down
18 changes: 14 additions & 4 deletions Totoro.Core/ViewModels/UserListViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ public class UserListViewModel : NavigatableViewModel, IHaveState

public UserListViewModel(ITrackingServiceContext trackingService,
IAnimeServiceContext animeService,
IViewService viewService)
IViewService viewService,
IConnectivityService connectivityService)
{
_trackingService = trackingService;
_viewService = viewService;
Expand Down Expand Up @@ -75,6 +76,11 @@ public UserListViewModel(ITrackingServiceContext trackingService,
.SelectMany(animeService.GetAnime)
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(list => _searchCache.EditDiff(list, (first, second) => first.Id == second.Id));

connectivityService
.Connected
.Subscribe(_ => FetchAnime())
.DisposeWith(Garbage);
}

[Reactive] public bool IsLoading { get; set; }
Expand All @@ -98,9 +104,15 @@ public Task SetInitialState()
return Task.CompletedTask;
}

FetchAnime();

return Task.CompletedTask;
}

private void FetchAnime()
{
IsLoading = true;
_genres.Clear();

_animeCache.Clear();
_trackingService.GetAnime()
.ObserveOn(RxApp.MainThreadScheduler)
Expand All @@ -125,8 +137,6 @@ public Task SetInitialState()
IsLoading = false;
}, RxApp.DefaultExceptionHandler.OnError)
.DisposeWith(Garbage);

return Task.CompletedTask;
}

public void StoreState(IState state)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
<PackageReference Include="xunit" Version="2.5.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.2.0">
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Expand Down
Loading

0 comments on commit 7e49ed1

Please sign in to comment.