/// <summary>
        /// Handle an MPTvSeries message received from a client
        /// </summary>
        /// <param name="message">Message</param>
        /// <param name="socketServer">Socket server</param>
        /// <param name="sender">Sender</param>
        internal static void HandleTvSeriesMessage(Newtonsoft.Json.Linq.JObject message, SocketServer socketServer, Deusty.Net.AsyncSocket sender)
        {
            string action = (string)message["Action"];

            if (!string.IsNullOrEmpty(action))
            {
                // A series id is needed for the following actions.
                // If a series id was supplied we use this, otherwise we
                // try to get an id by the series name.
                //
                // If this isn't successful we do nothing.
                int?   seriesId   = (int?)message["SeriesId"];
                string seriesName = (string)message["SeriesName"];
                bool   resume     = (message["AskToResume"] != null) ? (bool)message["AskToResume"] : true;

                // Get series id by show name if no id supplied
                if (seriesId == null && !string.IsNullOrEmpty(seriesName))
                {
                    seriesId = TVSeriesHelper.GetSeriesIdByName(seriesName);
                }

                if (seriesId != null)
                {
                    // Play specific episode of series
                    if (action == "playepisode")
                    {
                        int?season   = (int?)message["SeasonNumber"];
                        int?episode  = (int?)message["EpisodeNumber"];
                        int startPos = (message["StartPosition"] != null) ? (int)message["StartPosition"] : 0;

                        if (season != null && episode != null)
                        {
                            TVSeriesHelper.Play((int)seriesId, (int)season, (int)episode, resume, startPos);
                        }
                    }
                    // Show movie details for this movie
                    else if (action == "seriesdetails")
                    {
                        TVSeriesHelper.ShowSeriesDetails((int)seriesId);
                    }
                    // Play first unwatched or last added episode of a series
                    else if (action == "playunwatchedepisode")
                    {
                        TVSeriesHelper.PlayFirstUnwatchedEpisode((int)seriesId, resume);
                    }
                    // Play random episode of a series
                    else if (action == "playrandomepisode")
                    {
                        TVSeriesHelper.PlayRandomEpisode((int)seriesId, resume);
                    }
                    // Play all episodes of a season
                    else if (action == "playseason")
                    {
                        int? season               = (int?)message["SeasonNumber"];
                        bool onlyUnwatched        = (message["OnlyUnwatchedEpisodes"] != null) ? (bool)message["OnlyUnwatchedEpisodes"] : false;
                        int  startIndex           = (message["StartIndex"] != null) ? (int)message["StartIndex"] : 0;
                        bool switchToPlaylistView = (message["SwitchToPlaylist"] != null) ? (bool)message["SwitchToPlaylist"] : true;
                        bool startAutomatically   = (message["AutoStart"] != null) ? (bool)message["AutoStart"] : true;
                        if (season != null)
                        {
                            TVSeriesHelper.PlaySeason((int)seriesId, (int)season, startAutomatically, startIndex, onlyUnwatched, switchToPlaylistView);
                        }
                    }
                    // Play all episodes of a series
                    else if (action == "playseries")
                    {
                        bool onlyUnwatched        = (message["OnlyUnwatchedEpisodes"] != null) ? (bool)message["OnlyUnwatchedEpisodes"] : false;
                        int  startIndex           = (message["StartIndex"] != null) ? (int)message["StartIndex"] : 0;
                        bool switchToPlaylistView = (message["SwitchToPlaylist"] != null) ? (bool)message["SwitchToPlaylist"] : true;
                        bool startAutomatically   = (message["AutoStart"] != null) ? (bool)message["AutoStart"] : true;

                        TVSeriesHelper.PlaySeries((int)seriesId, startAutomatically, startIndex, onlyUnwatched, switchToPlaylistView);
                    }
                }
            }
        }
        /// <summary>
        /// Show the details of a mediaitem on MediaPortal (without actually starting playback)
        /// </summary>
        /// <param name="itemId"></param>
        /// <param name="mediaType"></param>
        /// <param name="providerId"></param>
        /// <param name="playInfo"></param>
        internal static void ShowMediaItem(string itemId, int mediaType, int providerId, Dictionary <string, string> playInfo)
        {
            try
            {
                MpExtendedProviders  provider = (MpExtendedProviders)providerId;
                MpExtendedMediaTypes type     = (MpExtendedMediaTypes)mediaType;
                switch (provider)
                {
                case MpExtendedProviders.MovingPictures:
                    if (WifiRemote.IsAvailableMovingPictures)
                    {
                        MovingPicturesHelper.ShowMovieDetails(Int32.Parse(playInfo["Id"]));
                    }
                    else
                    {
                        WifiRemote.LogMessage("MovingPictures not installed but required!", WifiRemote.LogType.Error);
                    }
                    break;

                case MpExtendedProviders.MPTvSeries:
                    if (WifiRemote.IsAvailableTVSeries)
                    {
                        if (type == MpExtendedMediaTypes.TVEpisode)
                        {
                            TVSeriesHelper.ShowEpisodeDetails(Int32.Parse(playInfo["ShowId"]), Int32.Parse(playInfo["SeasonIndex"]), Int32.Parse(playInfo["Id"]));
                        }
                        else if (type == MpExtendedMediaTypes.TVSeason)
                        {
                            TVSeriesHelper.ShowSeasonDetails(Int32.Parse(playInfo["ShowId"]), Int32.Parse(playInfo["SeasonIndex"]));
                        }
                        else if (type == MpExtendedMediaTypes.TVShow)
                        {
                            TVSeriesHelper.ShowSeriesDetails(Int32.Parse(playInfo["Id"]));
                        }
                    }
                    else
                    {
                        WifiRemote.LogMessage("MP-TvSeries not installed but required!", WifiRemote.LogType.Error);
                    }
                    break;

                case MpExtendedProviders.MPMusic:
                    if (type == MpExtendedMediaTypes.MusicTrack)
                    {
                        MpMusicHelper.ShowMusicTrackDetails(Int32.Parse(playInfo["Id"]));
                    }
                    else if (type == MpExtendedMediaTypes.MusicAlbum)
                    {
                        MpMusicHelper.ShowAlbumDetails(playInfo["Artist"], playInfo["Album"]);
                    }
                    else if (type == MpExtendedMediaTypes.MusicArtist)
                    {
                        MpMusicHelper.ShowArtistDetails(playInfo["Artist"]);
                    }
                    break;

                case MpExtendedProviders.MPVideo:
                    MpVideosHelper.ShowVideoDetails(Int32.Parse(playInfo["Id"]));
                    break;

                case MpExtendedProviders.MpVideosShare:
                    if (type == MpExtendedMediaTypes.File)
                    {
                        //TODO: fill myvideos db information instead of just playing the file

                        MpVideosHelper.ShowFileDetails(playInfo["Path"]);
                    }
                    else if (type == MpExtendedMediaTypes.Folder)
                    {
                        string[] extensions = playInfo["Extensions"].Split('|');
                        MpVideosHelper.ShowFolderDetails(playInfo["Path"]);
                    }
                    break;

                case MpExtendedProviders.MpMusicShare:
                    if (type == MpExtendedMediaTypes.File)
                    {
                        MpMusicHelper.ShowFileDetails(playInfo["Path"]);
                    }
                    else if (type == MpExtendedMediaTypes.Folder)
                    {
                        MpMusicHelper.ShowFolderDetails(playInfo["Path"]);
                    }
                    break;

                default:
                    //we have no providers (yet) for tv
                    if (type == MpExtendedMediaTypes.Recording)
                    {
                        if (!WifiRemote.IsAvailableTVPlugin)
                        {
                            WifiRemote.LogMessage("No TVPlugin installed: Aborting showrecording", WifiRemote.LogType.Error);
                            return;
                        }

                        MpTvServerHelper.ShowRecordingDetails(Int32.Parse(playInfo["Id"]));
                    }
                    else if (type == MpExtendedMediaTypes.Tv)
                    {
                        if (!WifiRemote.IsAvailableTVPlugin)
                        {
                            WifiRemote.LogMessage("No TVPlugin installed: Aborting showchannel", WifiRemote.LogType.Error);
                            return;
                        }

                        MpTvServerHelper.ShowTvChannelDetails(Int32.Parse(playInfo["Id"]));
                    }
                    else
                    {
                        WifiRemote.LogMessage("Provider not implemented yet", WifiRemote.LogType.Warn);
                    }
                    break;
                }
            }
            catch (Exception ex)
            {
                WifiRemote.LogMessage("Error during show of MediaItem: " + ex.ToString(), WifiRemote.LogType.Error);
            }
        }