public static AlbumList QueryFiles(string query = "")
        {
            try
            {
                string[] allFiles = { };
                MbApi.Library_QueryFilesEx(query, ref allFiles);
                MetaDataType[] fields =
                {
                    MetaDataType.Album,
                    MetaDataType.AlbumArtist,
                    MetaDataType.Artist,
                    MetaDataType.TrackNo,
                    MetaDataType.Rating,
                    MetaDataType.TrackTitle,
                    MetaDataType.RatingLove,
                };

                List <TrackData> allTrackData = new List <TrackData>();

                for (int i = 0; i < allFiles.Length; i++)
                {
                    string[] fileTags = { };
                    MbApi.Library_GetFileTags(allFiles[i], fields, ref fileTags);

                    allTrackData.Add(new TrackData()
                    {
                        FilePath    = allFiles[i],
                        Album       = fileTags[0],
                        AlbumArtist = fileTags[1],
                        Artist      = fileTags[2],
                        TrackNo     = fileTags[3],
                        Rating      = fileTags[4],
                        TrackTitle  = fileTags[5],
                        Loved       = fileTags[6],
                    });
                }

                var GroupedTrackList = allTrackData.GroupBy(t => new { t.Album, t.AlbumArtist }).Select(
                    albm => new AlbumData()
                {
                    Album       = albm.Key.Album,
                    AlbumArtist = albm.Key.AlbumArtist,
                    TrackList   = albm.ToList(),
                }).OrderBy(x => x.Album).ToList();

                AlbumList trackLists = new AlbumList()
                {
                    callback_function = "fileQueryComplete", AlbumLists = GroupedTrackList
                };


                return(trackLists);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        private static void GetSimilarArtists(string value)
        {
            try
            {
                SimilarArtists similarArtistList = new SimilarArtists();
                similarArtistList.Data = MbApi.Library_QuerySimilarArtists(value, 0.2).Split('\u0000');
                similarArtistList.callback_function = "updateSimilarArtistList";

                WsRef.SendMessage(Util.Serialize(similarArtistList));
            }
            catch (Exception) { }
        }
        public static AlbumList GetNowPlaylist()
        {
            string[] allFiles = { };
            MbApi.NowPlayingList_QueryFilesEx("", ref allFiles);
            MetaDataType[] fields =
            {
                MetaDataType.Album,
                MetaDataType.AlbumArtist,
                MetaDataType.Artist,
                MetaDataType.TrackNo,
                MetaDataType.Rating,
                MetaDataType.TrackTitle,
                MetaDataType.RatingLove,
            };


            List <TrackData> allTrackData = new List <TrackData>();

            for (int i = 0; i < allFiles.Length; i++)
            {
                string[] fileTags = { };
                MbApi.Library_GetFileTags(allFiles[i], fields, ref fileTags);

                allTrackData.Add(new TrackData()
                {
                    FilePath    = allFiles[i],
                    Album       = fileTags[0],
                    AlbumArtist = fileTags[1],
                    Artist      = fileTags[2],
                    TrackNo     = fileTags[3],
                    Rating      = fileTags[4],
                    TrackTitle  = fileTags[5],
                    Loved       = fileTags[6],
                });
            }

            var GroupedTrackList = allTrackData.GroupBy(t => new { t.Album, t.AlbumArtist }).Select(
                albm => new AlbumData()
            {
                Album       = albm.Key.Album,
                AlbumArtist = albm.Key.AlbumArtist,
                TrackList   = albm.ToList(),
            }).ToList();

            return(new AlbumList()
            {
                callback_function = "updatePlaylistData", AlbumLists = GroupedTrackList
            });
        }
        /// <summary>
        /// Generates serialized JSON object with Now playing data to send to the browser
        /// </summary>
        /// <param name="isForcedOnce">Should we send the artwork data</param>
        /// <returns>Serialized json data</returns>
        public static string GetNowPlayingData(bool isForcedOnce)
        {
            try
            {
                float currentPos = MbApi.Player_GetPosition();
                float totalTime  = MbApi.NowPlaying_GetDuration();
                float completed  = currentPos / totalTime * 100;

                if (data == null)
                {
                    data = new NowPlayingData();
                }

                string oldHash = Util.CreateMD5(data.CurrentTrackTitle + data.CurrentTrackArtist).ToLower();
                string curHash = Util.CreateMD5(MbApi.NowPlaying_GetFileTag(MetaDataType.TrackTitle) +
                                                MbApi.NowPlaying_GetFileTag(MetaDataType.Artist)).ToLower();
                bool TrackChanged = (curHash != oldHash);

                data.HasTrackChanged              = (TrackChanged || isForcedOnce);
                data.CurrentTrackTitle            = MbApi.NowPlaying_GetFileTag(MetaDataType.TrackTitle);
                data.CurrentTrackArtist           = MbApi.NowPlaying_GetFileTag(MetaDataType.Artist);
                data.CurrentPlayerState           = MbApi.Player_GetPlayState().ToString();
                data.CurrentTrackSize             = totalTime;
                data.CurrentTrackPosition         = currentPos;
                data.CurrentTrackCompleted        = completed;
                data.CurrentTrackSizeReadable     = Util.FormattedMills(totalTime);
                data.CurrentTrackPositionReadable = Util.FormattedMills(currentPos);
                data.CurrentTrackAlbum            = MbApi.NowPlaying_GetFileTag(MetaDataType.Album);
                data.CurrentTrackGenre            = MbApi.NowPlaying_GetFileTag(MetaDataType.Genres);
                data.ArtworkPath   = (TrackChanged || isForcedOnce) ? MbApi.NowPlaying_GetFileUrl() : string.Empty;
                data.CurrentVolume = MbApi.Player_GetVolume();

                var allfile = MbApi.NowPlayingList_QueryGetNextFile();
                data.NextQueueTrack = allfile;

                data.ArtistDataset = (TrackChanged || isForcedOnce) ? GetArtistData(MbApi.NowPlaying_GetFileTag(MetaDataType.Artist)) : new ArtistData();

                data.callback_function = "refreshPlayerControl";

                return(Util.Serialize(data));
            }
            catch (Exception) { }
            return(string.Empty);
        }
        /// <summary>
        /// Calls MusicBee api function depending on the response
        /// </summary>
        /// <param name="response"></param>
        public static void HandleResponse(string response)
        {
            if (response is null)
            {
                return;
            }

            switch (response)
            {
            case "toggleplay":
                MbApi.Player_PlayPause();
                break;

            case "playprev":
                MbApi.Player_PlayPreviousTrack();
                break;

            case "playnext":
                MbApi.Player_PlayNextTrack();
                break;

            case "queryFiles":
                QueryFiles();
                break;

            default:
                break;
            }

            //if the response contains "/" backslash then it contain multiple values
            if (response.Contains("/"))
            {
                //Create an array of responses
                string[] responseArray = response.Split('/');
                if (responseArray.Length == 2)
                {
                    //Array of values that are passed with the request
                    var value = responseArray[1];
                    switch (responseArray[0])
                    {
                    case "settrackpos":
                        SetPlayerTrackPos(float.Parse(value, CultureInfo.InvariantCulture.NumberFormat));
                        break;

                    case "setvol":
                        SetVolume(float.Parse(value, CultureInfo.InvariantCulture.NumberFormat));
                        break;

                    case "getSimilarArtist":
                        GetSimilarArtists(value);
                        break;

                    case "queryFiles":
                        QueryFiles(value);
                        break;

                    default:
                        break;
                    }
                }
            }
        }
 /// <summary>
 /// Sets the MusicBee's volume with the value
 /// </summary>
 /// <param name="value"></param>
 private static void SetVolume(float value)
 {
     //MusicBee uses 0 to 1 volume range so clamp the values
     value = Mathf.Range(value, 0, 1);
     MbApi.Player_SetVolume(value);
 }
 public static void PlayTrack(string url)
 {
     MbApi.NowPlayingList_PlayNow(url);
 }
        private static void SetPlayerTrackPos(float pos)
        {
            int position = Convert.ToInt32(pos / 100 * MbApi.NowPlaying_GetDuration());

            MbApi.Player_SetPosition(position);
        }
 public static Stream GetCurrentArtwork()
 {
     return(GetArtwork(MbApi.NowPlaying_GetFileUrl()));
 }