Added application session services, along with initial restore and tracker implementations.
This commit is contained in:
6
Harmonia.WinUI/Session/ISessionRestorer.cs
Normal file
6
Harmonia.WinUI/Session/ISessionRestorer.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Harmonia.WinUI.Session;
|
||||
|
||||
public interface ISessionRestorer
|
||||
{
|
||||
void Restore();
|
||||
}
|
||||
10
Harmonia.WinUI/Session/ISessionService.cs
Normal file
10
Harmonia.WinUI/Session/ISessionService.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Harmonia.WinUI.Session;
|
||||
|
||||
public interface ISessionService
|
||||
{
|
||||
ApplicationSession Session { get; }
|
||||
Task LoadAsync();
|
||||
Task SaveAsync();
|
||||
}
|
||||
6
Harmonia.WinUI/Session/ISessionTracker.cs
Normal file
6
Harmonia.WinUI/Session/ISessionTracker.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Harmonia.WinUI.Session;
|
||||
|
||||
public interface ISessionTracker
|
||||
{
|
||||
void Start();
|
||||
}
|
||||
47
Harmonia.WinUI/Session/JsonSessionService.cs
Normal file
47
Harmonia.WinUI/Session/JsonSessionService.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Harmonia.WinUI.Session;
|
||||
|
||||
public sealed class JsonSessionService : ISessionService
|
||||
{
|
||||
private static readonly JsonSerializerOptions Options = new()
|
||||
{
|
||||
WriteIndented = true
|
||||
};
|
||||
|
||||
private readonly string _filePath = Path.Combine(
|
||||
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||
"Harmonia",
|
||||
"session.json"
|
||||
);
|
||||
|
||||
public ApplicationSession Session { get; private set; } = new();
|
||||
|
||||
public async Task LoadAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (File.Exists(_filePath))
|
||||
{
|
||||
await using var stream = File.OpenRead(_filePath);
|
||||
Session = await JsonSerializer.DeserializeAsync<ApplicationSession>(stream) ?? new();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
Session = new();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SaveAsync()
|
||||
{
|
||||
string directoryName = Path.GetDirectoryName(_filePath)!;
|
||||
Directory.CreateDirectory(directoryName);
|
||||
|
||||
await using var stream = File.Create(_filePath);
|
||||
await JsonSerializer.SerializeAsync(stream, Session, Options);
|
||||
}
|
||||
}
|
||||
55
Harmonia.WinUI/Session/SessionRestorer.cs
Normal file
55
Harmonia.WinUI/Session/SessionRestorer.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using Harmonia.Core.Player;
|
||||
using Harmonia.Core.Playlists;
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace Harmonia.WinUI.Session;
|
||||
|
||||
public class SessionRestorer(
|
||||
ISessionService sessionService,
|
||||
IPlaylistManager playlistManager,
|
||||
IAudioPlayer audioPlayer) : ISessionRestorer
|
||||
{
|
||||
public void Restore()
|
||||
{
|
||||
RestorePlaylist();
|
||||
RestoreAudioPlayer();
|
||||
}
|
||||
|
||||
private void RestorePlaylist()
|
||||
{
|
||||
PlaylistState playlistState = sessionService.Session.Playlist;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(playlistState.OpenPlaylistUID))
|
||||
return;
|
||||
|
||||
Playlist? playlist = playlistManager.Playlists.FirstOrDefault(p => p.UID == playlistState.OpenPlaylistUID);
|
||||
|
||||
if (playlist is null)
|
||||
return;
|
||||
|
||||
playlistManager.CurrentPlaylist = playlist;
|
||||
}
|
||||
|
||||
private void RestoreAudioPlayer()
|
||||
{
|
||||
AudioPlayerState audioPlayerState = sessionService.Session.Player;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(audioPlayerState.PlaylistSongUID))
|
||||
return;
|
||||
|
||||
Playlist? playlist = playlistManager.FindPlaylistContaining(audioPlayerState.PlaylistSongUID);
|
||||
|
||||
if (playlist is null)
|
||||
return;
|
||||
|
||||
PlaylistSong? song = playlist.Songs.FirstOrDefault(s => s.UID == audioPlayerState.PlaylistSongUID);
|
||||
|
||||
if (song is null)
|
||||
return;
|
||||
|
||||
//PlaybackMode playbackMode = audioPlayerState.PlaybackState
|
||||
|
||||
audioPlayer.LoadAsync(song, PlaybackMode.LoadOnly);
|
||||
}
|
||||
}
|
||||
29
Harmonia.WinUI/Session/SessionTracker.cs
Normal file
29
Harmonia.WinUI/Session/SessionTracker.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using Harmonia.Core.Player;
|
||||
using Harmonia.Core.Playlists;
|
||||
using System;
|
||||
|
||||
namespace Harmonia.WinUI.Session;
|
||||
|
||||
public class SessionTracker(
|
||||
ISessionService sessionService,
|
||||
IPlaylistManager playlistManager,
|
||||
IAudioPlayer audioPlayer) : ISessionTracker
|
||||
{
|
||||
public void Start()
|
||||
{
|
||||
playlistManager.CurrentPlaylistChanged += OnCurrentPlaylistChanged;
|
||||
audioPlayer.PlayingSongChanged += OnPlayingSongChanged;
|
||||
}
|
||||
|
||||
private void OnCurrentPlaylistChanged(object? sender, EventArgs e)
|
||||
{
|
||||
PlaylistState playlistState = sessionService.Session.Playlist;
|
||||
playlistState.OpenPlaylistUID = playlistManager.CurrentPlaylist?.UID;
|
||||
}
|
||||
|
||||
private void OnPlayingSongChanged(object? sender, PlayingSongChangedEventArgs e)
|
||||
{
|
||||
AudioPlayerState audioPlayerState = sessionService.Session.Player;
|
||||
audioPlayerState.PlaylistSongUID = e.NewSong?.UID;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user