using Harmonia.Core.Engine; using Harmonia.Core.Player; using Harmonia.Core.Playlists; using System.Linq; using System.Threading.Tasks; namespace Harmonia.WinUI.Session; public class SessionRestorer( ISessionService sessionService, IPlaylistManager playlistManager, IAudioPlayer audioPlayer) : ISessionRestorer { public async Task RestoreAsync() { RestorePlaylist(); await RestoreAudioPlayerAsync(); } 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 async Task RestoreAudioPlayerAsync() { AudioPlayerState audioPlayerState = sessionService.Session.Player; audioPlayer.Volume = audioPlayerState.Volume; audioPlayer.IsMuted = audioPlayerState.IsMuted; if (string.IsNullOrWhiteSpace(audioPlayerState.PlaylistSongUID)) return; Playlist? playlist = playlistManager.FindPlaylistContaining(audioPlayerState.PlaylistSongUID); if (playlist is null) return; PlaylistSong? playlistSong = playlist.Songs.FirstOrDefault(s => s.UID == audioPlayerState.PlaylistSongUID); if (playlistSong is null) return; await audioPlayer.LoadAsync(playlistSong, PlaybackMode.LoadOnly); if (audioPlayerState.Position > 0 && audioPlayerState.Position <= playlistSong.Song.Length.TotalSeconds) audioPlayer.Position = audioPlayerState.Position; if (audioPlayerState.PlaybackState == AudioPlaybackState.Playing) audioPlayer.Play(); } }