Added application session services, along with initial restore and tracker implementations.

This commit is contained in:
2026-08-06 02:11:47 -04:00
parent 75f820ed7b
commit c262ee4caa
13 changed files with 245 additions and 5 deletions

View File

@@ -0,0 +1,6 @@
namespace Harmonia.WinUI.Session;
public interface ISessionRestorer
{
void Restore();
}

View File

@@ -0,0 +1,10 @@
using System.Threading.Tasks;
namespace Harmonia.WinUI.Session;
public interface ISessionService
{
ApplicationSession Session { get; }
Task LoadAsync();
Task SaveAsync();
}

View File

@@ -0,0 +1,6 @@
namespace Harmonia.WinUI.Session;
public interface ISessionTracker
{
void Start();
}

View 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);
}
}

View 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);
}
}

View 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;
}
}