Files
harmonia/Harmonia.WinUI/Session/SessionRestorer.cs

71 lines
2.0 KiB
C#

using Harmonia.Core.Engine;
using Harmonia.Core.Player;
using Harmonia.Core.Playlists;
using System;
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;
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;
switch (audioPlayerState.PlaybackState)
{
case AudioPlaybackState.Playing:
audioPlayer.Play();
break;
case AudioPlaybackState.Paused:
audioPlayer.Pause();
break;
case AudioPlaybackState.Stopped:
audioPlayer.Stop();
break;
}
}
}