private void fill(IEnumerable <PlaylistTrack> playlistTracks)
 {
     foreach (var playlistTrack in playlistTracks.OrderBy(pt => pt.TrackNo))
     {
         var playinglistItem = new PlayinglistItemPlaylistTrack(playlistTrack);
         toPlayTracks.Add(playinglistItem);
         _ = new PlayinglistTrack(playlistTrack.Key);
     }
 }
        /// <summary>
        /// Searches playinglistTrack in toPlayTracks and removes it.
        /// </summary>
        public void Remove(PlayinglistTrack playinglistTrack)
        {
            var playlistTrack = playinglistTrack.PlaylistTrack;

            for (int toPlayTracksIndex = 0; toPlayTracksIndex < toPlayTracks.Count; toPlayTracksIndex++)
            {
                var playinglistItem = toPlayTracks[toPlayTracksIndex];
                if (playinglistItem is PlayinglistItemPlaylistTrack playinglistItemPlaylistTrack)
                {
                    if (playinglistItemPlaylistTrack.PlaylistTrack == playlistTrack)
                    {
                        toPlayTracks.RemoveAt(toPlayTracksIndex);
                        return;
                    }
                }
            }
        }
        public Track?GetNext(Random?random)
        {
            Track?next = null;

            if (toPlayTracks.Count > 0)
            {
                var trackIndex      = random?.Next(toPlayTracks.Count) ?? 0;
                var playinglistItem = toPlayTracks[trackIndex];
                toPlayTracks.RemoveAt(trackIndex);
                if (playinglistItem is PlayinglistItemTrack playinglistItemTrack)
                {
                    next = playinglistItemTrack.Track;
                }
                else if (playinglistItem is PlayinglistItemPlaylistTrack playinglistItemPlaylistTrack)
                {
                    if (DC.Data.PlayinglistTracksByPlaylistTrackKey.TryGetValue(playinglistItemPlaylistTrack.PlaylistTrack.Key, out var playinglistTrack))
                    {
                        playinglistTrack.Release();
                        next = playinglistItemPlaylistTrack.PlaylistTrack.Track;
                    }
                    else
                    {
                        //PlayinglistTrack not found, Track might just have been removed from Playlist
                        //search for next existing playinglistItem
                        while (toPlayTracks.Count > 0)
                        {
                            if (trackIndex >= toPlayTracks.Count)
                            {
                                trackIndex = 0;
                            }
                            playinglistItem = toPlayTracks[trackIndex];
                            toPlayTracks.RemoveAt(trackIndex);
                            if (DC.Data.PlayinglistTracksByPlaylistTrackKey.TryGetValue(playinglistItemPlaylistTrack.PlaylistTrack.Key, out playinglistTrack))
                            {
                                playinglistTrack.Release();
                                return(playinglistItemPlaylistTrack.PlaylistTrack.Track);
                            }
                        }
                        System.Diagnostics.Debugger.Break();
                        return(null);
                    }
                }
                else
                {
                    throw new NotSupportedException();
                }
            }

            if (toPlayTracks.Count == 0)
            {
                if (Playlist is null)
                {
                    if (allTracks.Count == 0)
                    {
                        System.Diagnostics.Debugger.Break();
                        return(null);
                    }
                    foreach (var copyTrack in allTracks)
                    {
                        toPlayTracks.Add(copyTrack);
                        if (copyTrack is PlayinglistItemPlaylistTrack playinglistItemPlaylistTrack)
                        {
                            System.Diagnostics.Debugger.Break();//We should never come here, because PlayinglistItemPlaylistTrack are not used when Playlist is null
                            //todo: change allTracks to List<PlayinglistItemTrack>
                            _ = new PlayinglistTrack(playinglistItemPlaylistTrack.PlaylistTrack.Key);
                        }
                    }
                }
                else
                {
                    fill(Playlist.PlaylistTracks);
                    if (toPlayTracks.Count == 0)
                    {
                        //it seems user has deleted all tracks from playlist
                        return(null);
                    }
                }
            }
            if (next is null)
            {
                //toPlayTracks was empty when GetNext() was called. Now toPlayTracks is supposed to be full, unless user deleted
                //all tracks which were in the playlist in the meantime
                System.Diagnostics.Debugger.Break();
                return(null);
            }
            return(next);
        }