using MpcNET.Commands.Database; using MpcNET.Commands.Queue; using MpcNET.Tags; using MpcNET.Types; using MpcNET.Types.Filters; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using System.Windows; namespace unison { class ShuffleHandler { private MPDHandler _mpd; public List _songList { get; } public int AddedSongs = 0; public ShuffleHandler() { _songList = new(); _mpd = (MPDHandler)Application.Current.Properties["mpd"]; } private bool IsOnMainThread() { return Application.Current.Dispatcher.Thread == System.Threading.Thread.CurrentThread; } public async Task GetSongsFromFilter(List filter) { Debug.WriteLine("[GetSongsFromFilterBefore] is on main thread => " + IsOnMainThread()); await Task.Run(async() => { Debug.WriteLine("[GetSongsFromFilterAfter] is on main thread => " + IsOnMainThread()); _songList.Clear(); int song = _mpd.GetStats().Songs; IEnumerable response = await _mpd.SafelySendCommandAsync(new SearchCommand(filter, 0, song + 1)); Debug.WriteLine("got response => " + response.Count()); foreach (IMpdFile file in response) { _songList.Add(file.Path); Debug.WriteLine(file.Path); } }); } public async Task AddToQueueRandom(int SongNumber) { Debug.WriteLine("Add To Queue Random"); await Task.Run(async () => { int AddedSongs = 0; Debug.WriteLine("song to add => " + SongNumber); for (int i = 0; i < SongNumber; i++) { // generate random number int song = new Random().Next(0, _mpd.GetStats().Songs - 1); Debug.WriteLine("song " + song + " - song total " + _mpd.GetStats().Songs); IEnumerable Response = await _mpd.SafelySendCommandAsync(new SearchCommand(new FilterTag(MpdTags.Title, "", FilterOperator.Contains), song, song + 1)); Debug.WriteLine("got response"); await Task.Delay(1); if (Response.Count() > 0) { string filePath = Response.First().Path; _mpd.AddSong(filePath); Debug.WriteLine("song path => " + filePath); if (i == 0) { if (!_mpd.IsPlaying()) _mpd.Play(0); } AddedSongs++; } } }); Debug.WriteLine("Add To Queue Random - finished"); } public async Task AddToQueueFilter(int SongNumber) { Debug.WriteLine("Add To Queue Filter"); await Task.Run(async () => { int AddedSongs = 0; Debug.WriteLine("song to add => " + SongNumber); // more requested songs than available => add everything if (SongNumber > _songList.Count) { foreach (string path in _songList) { await Task.Delay(1); _mpd.AddSong(path); Debug.WriteLine("song path => " + path); AddedSongs++; } } // more available songs than requested => // we add unique indexes until we reach the requested amount else { HashSet SongIndex = new(); Debug.WriteLine("while - before"); while (SongIndex.Count < SongNumber) { int MaxIndex = new Random().Next(0, _songList.Count - 1); SongIndex.Add(MaxIndex); } foreach (int index in SongIndex) _mpd.AddSong(_songList[index]); Debug.WriteLine("while - after"); } }); Debug.WriteLine("Add To Queue Filter - finished"); } } }