/// <summary> /// Send a "You need to authenticate yourself." error followed by the /// welcome message. /// </summary> /// <param name="socket"></param> private void TellClientToReAuthenticate(AsyncSocket socket) { MessageAuthenticationResponse response = new MessageAuthenticationResponse(false); response.ErrorMessage = "You need to authenticate yourself."; SendMessageToClient.Send(response, socket, true); SendMessageToClient.Send(_welcomeMessage, socket, true); }
public static Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { JArray array = GetMessageValue <JArray>(message, "Properties"); if (array != null) { var client = SocketServer.Instance.connectedSockets.Single(x => x == sender).GetRemoteClient(); foreach (JValue v in array) { String propString = (string)v.Value; ServiceRegistration.Get <ILogger>().Info("WifiRemote: Property: {0}", propString); client.Properties.Add(propString); } List <Property> properties = new List <Property>(); foreach (String s in client.Properties) { // TODO: Implement?: //"#Play.Current.Title", //"#Play.Current.File", //"#Play.Current.Thumb", //"#Play.Current.Plot", //"#Play.Current.PlotOutline", //"#Play.Current.Channel", //"#Play.Current.Genre", //"#Play.Current.Title", //"#Play.Current.Artist", //"#Play.Current.Album", //"#Play.Current.Track", //"#Play.Current.Year", //"#TV.View.channel", //"#TV.View.thumb", //"#TV.View.start", //"#TV.View.stop", //"#TV.View.remaining", //"#TV.View.genre", //"#TV.View.title", //"#TV.View.description", //"#TV.Next.start", //"#TV.Next.stop", //"#TV.Next.title", //"#TV.Next.description" //String value = GUIPropertyManager.GetProperty(s); //if (value != null && !value.Equals("") && CheckProperty(s)) //{ //properties.Add(new Property(s, value)); //} } MessageProperties propertiesMessage = new MessageProperties(); propertiesMessage.Tags = properties; SendMessageToClient.Send(propertiesMessage, sender); } return(Task.FromResult(true)); }
public static async Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { string action = GetMessageValue <string>(message, "Action"); var client = sender.GetRemoteClient(); if (!string.IsNullOrEmpty(action)) { string search = GetMessageValue <string>(message, "Search"); int count = GetMessageValue <int>(message, "Count", 10); int offset = GetMessageValue <int>(message, "Offset"); string recordingName = GetMessageValue <string>(message, "RecordingName"); string id = GetMessageValue <string>(message, "RecordingId"); int startPos = GetMessageValue <int>(message, "StartPosition"); // Search for recordings if (action.Equals("recordingsearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <RecordingInfo>(client, search, Convert.ToUInt32(count), null, Helper.GetRecordingsByRecordingSearchAsync); SendMessageToClient.Send(new MessageRecordings { Recordings = list }, sender, true); } // Show recording list else if (action.Equals("recordinglist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <RecordingInfo>(client, null, Convert.ToUInt32(offset), Convert.ToUInt32(count), Helper.GetRecordingsByRecordingSearchAsync); SendMessageToClient.Send(new MessageRecordings { Recordings = list }, sender, true); } // Show details for this recording else if (action.Equals("recordingdetails", StringComparison.InvariantCultureIgnoreCase)) { // TODO: implementation possible? } // Play a recording else if (action.Equals("playrecording", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Recording: RecordingName: {0}, RecordingId: {1}, StartPos: {2}", recordingName, id, startPos); var mediaItemGuid = await GetIdFromNameAsync(client, recordingName, id, Helper.GetRecordingByRecordingNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Recording: Couldn't convert RecordingId '{0} to Guid", id); return(false); } await Helper.PlayMediaItemAsync(mediaItemGuid.Value, startPos); } } return(true); }
public static async Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { string action = GetMessageValue <string>(message, "Action"); var client = sender.GetRemoteClient(); if (!string.IsNullOrEmpty(action)) { string search = GetMessageValue <string>(message, "Search"); int count = GetMessageValue <int>(message, "Count", 10); int offset = GetMessageValue <int>(message, "Offset"); string imagePath = GetMessageValue <string>(message, "ImagePath"); string id = GetMessageValue <string>(message, "ImageId"); // Search for image if (action.Equals("imagesearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <ImageInfo>(client, search, Convert.ToUInt32(count), null, Helper.GetImagesByImageSearchAsync); SendMessageToClient.Send(new MessageImages { Images = list }, sender, true); } // Show image list else if (action.Equals("imagelist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <ImageInfo>(client, null, Convert.ToUInt32(count), Convert.ToUInt32(offset), Helper.GetImagesByImageSearchAsync); SendMessageToClient.Send(new MessageImages { Images = list }, sender, true); } else // Show image if (action.Equals("playimage", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Image: ImageId: {0}, ImagePath: {1}, ", id, imagePath); var mediaItemGuid = await GetIdFromNameAsync(client, imagePath, id, Helper.GetMediaItemByFileNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Image: Couldn't convert ImageId '{0} to Guid", id); return(false); } await Helper.PlayMediaItemAsync(mediaItemGuid.Value, 0); } } return(true); }
/// <summary> /// Send the current screenshot to the client as byte array /// </summary> private static void SendScreenshotToClient(AsyncSocket sender, int width, ImageHelperError error) { MessageScreenshot screenshot = new MessageScreenshot(); if (error != null) { screenshot.Error = error; } else { screenshot.Screenshot = _imageHelper.resizedScreenshot(width); } SendMessageToClient.Send(screenshot, sender); }
private void SendAuthenticationResponse(AsyncSocket socket, bool _success) { MessageAuthenticationResponse authResponse = new MessageAuthenticationResponse(_success); if (!_success) { authResponse.ErrorMessage = "Login failed"; } else { Logger.Debug("WifiRemote: Client identified: " + socket.GetRemoteClient().ToString()); string key = GetRandomMD5(); authResponse.AutologinKey = key; _loginTokens.Add(new AutoLoginToken(key, socket.GetRemoteClient())); } SendMessageToClient.Send(authResponse, socket, true); }
public static Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { MessagePlugins msg = new MessagePlugins(); msg.Plugins = new List <PluginEntry>(); foreach (var plugin in ServiceRegistration.Get <IPluginManager>().AvailablePlugins) { msg.Plugins.Add(new PluginEntry { Id = plugin.Key.ToString(), Name = plugin.Value.Metadata.Name, Version = plugin.Value.Metadata.PluginVersion }); } SendMessageToClient.Send(msg, sender, true); return(Task.FromResult(true)); }
public static async Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { string action = GetMessageValue <string>(message, "Action"); var client = sender.GetRemoteClient(); if (!string.IsNullOrEmpty(action)) { string search = GetMessageValue <string>(message, "Search"); int count = GetMessageValue <int>(message, "Count", 10); int offset = GetMessageValue <int>(message, "Offset"); int id = GetMessageValue <int>(message, "ScheduleId"); // Search for schedule if (action.Equals("schedulesearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetSchedulesAsync(); SendMessageToClient.Send(new MessageSchedules { Schedules = list.Where(p => p.Name.Contains(search)).OrderBy(p => p.StartTime).Select(p => new ScheduleInfo(p)).ToList() }, sender, true); } // Show schedule list else if (action.Equals("schedulelist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetSchedulesAsync(); SendMessageToClient.Send(new MessageSchedules { Schedules = list.OrderBy(p => p.StartTime).Select(p => new ScheduleInfo(p)).ToList() }, sender, true); } // Show details for this schedule else if (action.Equals("scheduledetails", StringComparison.InvariantCultureIgnoreCase)) { // TODO: implementation possible? } // Delete schedule else if (action.Equals("deleteschedule", StringComparison.InvariantCultureIgnoreCase)) { await RemoveSchedulesAsync(id); } } return(true); }
/// <summary> /// A client connected. /// </summary> /// <param name="sender"></param> /// <param name="newSocket"></param> private void ListenSocket_DidAccept(AsyncSocket sender, AsyncSocket newSocket) { // Subsribe to worker socket events newSocket.DidRead += NewSocket_DidRead; newSocket.DidWrite += NewSocket_DidWrite; newSocket.WillClose += NewSocket_WillClose; newSocket.DidClose += NewSocket_DidClose; newSocket.SetRemoteClient(new RemoteClient()); // Store worker socket in client list lock (connectedSockets) { connectedSockets.Add(newSocket); } // Send welcome message to client Logger.Debug("WifiRemote: Client connected, sending welcome msg."); SendMessageToClient.Send(_welcomeMessage, newSocket, true); }
public static async Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender, bool isTV) { string action = GetMessageValue <string>(message, "Action"); var client = sender.GetRemoteClient(); if (!string.IsNullOrEmpty(action)) { int channelGroupId = GetMessageValue <int>(message, "ChannelGroupId"); int channelId = GetMessageValue <int>(message, "ChannelId"); string search = GetMessageValue <string>(message, "Search"); int hours = GetMessageValue <int>(message, "Hours", 1); int count = GetMessageValue <int>(message, "Count", 10); int offset = GetMessageValue <int>(message, "Offset"); bool startFullscreen = GetMessageValue <bool>(message, "StartFullscreen", true); // Show channel group list if (action.Equals("grouplist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetChannelGroupsAsync(isTV); SendMessageToClient.Send(new MessageChannelGroups { ChannelGroups = list.Select(g => new ChannelGroupInfo(g)).ToList() }, sender, true); } // Search group EPG else if (action.Equals("groupepgsearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetEpgAsync(channelGroupId, hours, isTV); SendMessageToClient.Send(new MessagePrograms { Programs = list.Where(p => p.Title.Contains(search)).OrderBy(p => p.StartTime).Select(p => new ProgramInfo(p)).ToList() }, sender, true); } // Show group EPG else if (action.Equals("groupepglist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetEpgAsync(channelGroupId, hours, isTV); SendMessageToClient.Send(new MessagePrograms { Programs = list.OrderBy(p => p.StartTime).Select(p => new ProgramInfo(p)).ToList() }, sender, true); } // Search for channel else if (action.Equals("channelsearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetChannelsAsync(channelGroupId, isTV); SendMessageToClient.Send(new MessageChannels { Channels = list.Where(c => c.Name.StartsWith(search)).OrderBy(c => c.Name).Select(c => new ChannelInfo(c)).ToList() }, sender, true); } // Show channel list else if (action.Equals("channellist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetChannelsAsync(channelGroupId, isTV); SendMessageToClient.Send(new MessageChannels { Channels = list.OrderBy(c => c.Name).Skip(offset).Take(count).Select(c => new ChannelInfo(c)).ToList() }, sender, true); } //Search channel EPG else if (action.Equals("channelepgsearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <VideoInfo>(client, search, Convert.ToUInt32(count), null, Helper.GetVideosByVideoSearchAsync); SendMessageToClient.Send(new MessageVideos { Videos = list }, sender, true); } // Show channel EPG else if (action.Equals("channelepglist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetChannelEpgAsync(channelId, hours, isTV); SendMessageToClient.Send(new MessagePrograms { Programs = list.Where(p => p.Title.Contains(search)).OrderBy(p => p.StartTime).Select(p => new ProgramInfo(p)).ToList() }, sender, true); } // Show details for this channel else if (action.Equals("channeldetails", StringComparison.InvariantCultureIgnoreCase)) { // TODO: implementation possible? } // Play a channel else if (action.Equals("playchannel", StringComparison.InvariantCultureIgnoreCase)) { return(await PlayChannelAsync(channelId)); } } return(true); }
public static Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { SendMessageToClient.Send(new MessageNowPlaying(), sender); return(Task.FromResult(true)); }
public static async Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { string action = GetMessageValue <string>(message, "Action"); var client = sender.GetRemoteClient(); if (!string.IsNullOrEmpty(action)) { string search = GetMessageValue <string>(message, "Search"); int offset = GetMessageValue <int>(message, "Offset"); int count = GetMessageValue <int>(message, "Count", 10); string seriesName = GetMessageValue <string>(message, "SeriesName"); int seasonNum = GetMessageValue <int>(message, "SeasonNumber"); string id = GetMessageValue <string>(message, "SeriesId"); int episodeNum = GetMessageValue <int>(message, "EpisodeNumber"); int startPos = GetMessageValue <int>(message, "StartPosition"); bool onlyUnwatched = GetMessageValue <bool>(message, "OnlyUnwatchedEpisodes"); // Search for series if (action.Equals("seriessearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <SeriesShowInfo>(client, search, Convert.ToUInt32(count), null, Helper.GetSeriesBySeriesSearchAsync); SendMessageToClient.Send(new MessageSeries { Series = list }, sender, true); } // Show series list else if (action.Equals("serieslist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <SeriesShowInfo>(client, null, Convert.ToUInt32(count), Convert.ToUInt32(offset), Helper.GetSeriesBySeriesSearchAsync); SendMessageToClient.Send(new MessageSeries { Series = list }, sender, true); } // Show season list for series else if (action.Equals("seasonlist", StringComparison.InvariantCultureIgnoreCase)) { var mediaItemGuid = await GetIdFromNameAsync(client, seriesName, id, Helper.GetSeriesBySeriesNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: List Seasons: Couldn't convert SeriesId '{0} to Guid", id); return(false); } var list = await Helper.GetSeasonsBySeriesIdAsync(client.UserId, mediaItemGuid.Value); SendMessageToClient.Send(new MessageSeasons { Seasons = list.Select(i => new SeriesSeasonInfo(i)).ToList() }, sender, true); } // Show episode list for series season else if (action.Equals("episodelist", StringComparison.InvariantCultureIgnoreCase)) { var mediaItemGuid = await GetIdFromNameAsync(client, seriesName, id, Helper.GetSeriesBySeriesNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: List Episodes: Couldn't convert SeriesId '{0} to Guid", id); return(false); } var list = await Helper.GetEpisodesBySeriesSeasonAsync(client.UserId, mediaItemGuid.Value, seasonNum); SendMessageToClient.Send(new MessageEpisodes { Episodes = list.Select(i => new SeriesEpisodeInfo(i)).ToList() }, sender, true); } // Show movie details for this episode else if (action.Equals("episodetails", StringComparison.InvariantCultureIgnoreCase)) { // TODO: implementation possible? } // Play a episode else if (action.Equals("playepisode", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Episode: SeriesName: {0}, SeriesId: {1}, SeasonNumber: {2}, EpisodeNumber: {3}, StartPos: {4}", seriesName, id, seasonNum, episodeNum, startPos); var mediaItemGuid = await GetIdFromNameAsync(client, seriesName, id, Helper.GetSeriesBySeriesNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Episode: Couldn't convert SeriesId '{0} to Guid", id); return(false); } var episode = await Helper.GetEpisodeBySeriesEpisodeAsync(client.UserId, mediaItemGuid.Value, seasonNum, episodeNum); if (episode == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Episode: Couldn't find episode"); return(false); } await Helper.PlayMediaItemAsync(episode.MediaItemId, startPos); } else if (action.Equals("playunwatchedepisode", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Episode: SeriesName: {0}, SeriesId: {1}", seriesName, id); var mediaItemGuid = await GetIdFromNameAsync(client, seriesName, id, Helper.GetSeriesBySeriesNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Episode: Couldn't convert SeriesId '{0} to Guid", id); return(false); } var episodes = await Helper.GetEpisodesBySeriesIdAsync(client.UserId, mediaItemGuid.Value); if (!(episodes?.Count > 0)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Episode: Couldn't find episodes"); return(false); } var episode = episodes.FirstOrDefault(e => Convert.ToInt32(e.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") < 100); if (episode == null) { episode = episodes.LastOrDefault(e => Convert.ToInt32(e.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") == 100); } if (episode == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Episode: Couldn't find episodes"); return(false); } await Helper.PlayMediaItemAsync(episode.MediaItemId, 0); } else if (action.Equals("playrandomepisode", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Episode: SeriesName: {0}, SeriesId: {1}", seriesName, id); var mediaItemGuid = await GetIdFromNameAsync(client, seriesName, id, Helper.GetSeriesBySeriesNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Episode: Couldn't convert SeriesId '{0} to Guid", id); return(false); } var episodes = await Helper.GetEpisodesBySeriesIdAsync(client.UserId, mediaItemGuid.Value); if (!(episodes?.Count > 0)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Episode: Couldn't find episodes"); return(false); } var episodeList = episodes?.ToList(); var episodeIndex = new Random().Next(0, episodeList.Count - 1); await Helper.PlayMediaItemAsync(episodeList[episodeIndex].MediaItemId, 0); } else if (action.Equals("playseason", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Season: SeriesName: {0}, SeriesId: {1}, SeasonNumber: {2}, OnlyUnwatchedEpisodes: {3}", seriesName, id, seasonNum, onlyUnwatched); var mediaItemGuid = await GetIdFromNameAsync(client, seriesName, id, Helper.GetSeriesBySeriesNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Season: Couldn't convert SeriesId '{0} to Guid", id); return(false); } var items = await Helper.GetEpisodesBySeriesSeasonAsync(client.UserId, mediaItemGuid.Value, seasonNum); IEnumerable <MediaItem> episodes = null; if (onlyUnwatched) { episodes = items.Where(e => Convert.ToInt32(e.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") < 100); } else { episodes = items; } if (!(episodes?.Count() > 0)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Season: Couldn't find any episodes"); return(false); } PlayItemsModel.CheckQueryPlayAction(() => episodes, UI.Presentation.Players.AVType.Video); } else if (action.Equals("playseries", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Series: SeriesName: {0}, SeriesId: {1}, OnlyUnwatchedEpisodes: {2}", seriesName, id, onlyUnwatched); var mediaItemGuid = await GetIdFromNameAsync(client, seriesName, id, Helper.GetSeriesBySeriesNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Series: Couldn't convert SeriesId '{0} to Guid", id); return(false); } var items = await Helper.GetEpisodesBySeriesIdAsync(client.UserId, mediaItemGuid.Value); IEnumerable <MediaItem> episodes = null; if (onlyUnwatched) { episodes = items.Where(e => Convert.ToInt32(e.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") < 100); } else { episodes = items; } if (!(episodes?.Count() > 0)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Series: Couldn't find any episodes"); return(false); } PlayItemsModel.CheckQueryPlayAction(() => episodes, UI.Presentation.Players.AVType.Video); } } return(true); }
public static async Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { string imagePath = GetMessageValue <string>(message, "ImagePath"); string userTag = GetMessageValue <string>(message, "UserTag"); int maxWidth = GetMessageValue <int>(message, "MaximumWidth"); int maxHeight = GetMessageValue <int>(message, "MaximumHeight"); string id = GetMessageValue <string>(message, "ImageId"); var client = sender.GetRemoteClient(); ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Get Image: UserTag: {0}, ImageId: {1}, ImagePath: {2}, MaximumWidth: {3}, MaximumHeight: {4}", userTag, id, imagePath, maxWidth, maxHeight); if (!string.IsNullOrEmpty(imagePath) && string.IsNullOrEmpty(id)) { var item = await Helper.GetMediaItemByFileNameAsync(client.UserId, imagePath); id = item?.MediaItemId.ToString(); } if (!Guid.TryParse(id, out Guid mediaItemGuid)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Get Image: Couldn't convert ImageId {0} to Guid", id); return(false); } MessageImage msg = new MessageImage(); var mediaItem = await Helper.GetMediaItemByIdAsync(client.UserId, mediaItemGuid); Image image = null; IResourceLocator locator = mediaItem.GetResourceLocator(); using (IResourceAccessor ra = locator.CreateAccessor()) { IFileSystemResourceAccessor fsra = ra as IFileSystemResourceAccessor; if (fsra == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Get Image: Couldn't read image {0}", id); return(false); } using (Stream stream = fsra.OpenRead()) { image = Image.FromStream(stream); } } if ((maxWidth > 0 && image.Width > maxWidth) || (maxHeight > 0 && image.Height > maxHeight)) { int height = image.Height; int width = image.Width; if (maxHeight > 0 && height > maxHeight) { float ratio = (float)height / (float)maxHeight; width = Convert.ToInt32((float)width / ratio); } if (maxWidth > 0 && width > maxWidth) { width = maxWidth; } var newImage = ImageHelper.ResizedImage(image, width); image.Dispose(); image = newImage; } byte[] data = ImageHelper.ImageToByteArray(image, System.Drawing.Imaging.ImageFormat.Jpeg); image?.Dispose(); msg.ImagePath = mediaItem.ToString(); msg.UserTag = userTag; msg.Image = Convert.ToBase64String(data); SendMessageToClient.Send(msg, sender); return(true); }
public static async Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { string action = GetMessageValue <string>(message, "Action"); var client = sender.GetRemoteClient(); if (!string.IsNullOrEmpty(action)) { string search = GetMessageValue <string>(message, "Search"); int count = GetMessageValue <int>(message, "Count", 10); int offset = GetMessageValue <int>(message, "Offset"); string albumName = GetMessageValue <string>(message, "AlbumName"); string id = GetMessageValue <string>(message, "AlbumId"); int discNum = GetMessageValue <int>(message, "DiscNumber"); int trackNum = GetMessageValue <int>(message, "TrackNumber"); int startPos = GetMessageValue <int>(message, "StartPosition"); bool onlyUnwatched = GetMessageValue <bool>(message, "OnlyUnplayedTracks"); // Search for album if (action.Equals("albumsearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <MusicAlbumInfo>(client, search, Convert.ToUInt32(count), null, Helper.GetAlbumsByAlbumSearchAsync); SendMessageToClient.Send(new MessageAlbums { Albums = list }, sender, true); } // Show album list else if (action.Equals("albumlist", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <MusicAlbumInfo>(client, null, Convert.ToUInt32(count), Convert.ToUInt32(offset), Helper.GetAlbumsByAlbumSearchAsync); SendMessageToClient.Send(new MessageAlbums { Albums = list }, sender, true); } // Search for track if (action.Equals("tracksearch", StringComparison.InvariantCultureIgnoreCase)) { var list = await GetItemListAsync <MusicInfo>(client, search, Convert.ToUInt32(count), null, Helper.GetTracksByTrackSearchAsync); SendMessageToClient.Send(new MessageMusic { Music = list }, sender, true); } // Show track list for album else if (action.Equals("tracklist", StringComparison.InvariantCultureIgnoreCase)) { var mediaItemGuid = await GetIdFromNameAsync(client, albumName, id, Helper.GetAlbumByAlbumNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: List Tracks: Couldn't convert AlbumId '{0} to Guid", id); return(false); } var list = await Helper.GetTracksByAlbumIdAsync(client.UserId, mediaItemGuid.Value); SendMessageToClient.Send(new MessageMusic { Music = list.Select(i => new MusicInfo(i)).ToList() }, sender, true); } // Show track details for this track else if (action.Equals("tracktails", StringComparison.InvariantCultureIgnoreCase)) { // TODO: implementation possible? } // Play a track else if (action.Equals("playtrack", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Track: AlbumName: {0}, AlbumId: {1}, DiscNumber: {2}, TrackNumber: {3}, StartPos: {4}", albumName, id, discNum, trackNum, startPos); var mediaItemGuid = await GetIdFromNameAsync(client, albumName, id, Helper.GetAlbumByAlbumNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Track: Couldn't convert AlbumId '{0} to Guid", id); return(false); } var episode = await Helper.GetTrackByAlbumTrackAsync(client.UserId, mediaItemGuid.Value, discNum, trackNum); if (!(episode?.Count > 0)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Track: Couldn't find track"); return(false); } await Helper.PlayMediaItemAsync(episode.First().MediaItemId, startPos); } else if (action.Equals("playunplayedtrack", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote Play Track: AlbumName: {0}, AlbumId: {1}", albumName, id); var mediaItemGuid = await GetIdFromNameAsync(client, albumName, id, Helper.GetAlbumByAlbumNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Track: Couldn't convert AlbumId '{0} to Guid", id); return(false); } var tracks = await Helper.GetTracksByAlbumIdAsync(client.UserId, mediaItemGuid.Value); if (!(tracks?.Count > 0)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Track: Couldn't find track"); return(false); } var track = tracks.FirstOrDefault(e => Convert.ToInt32(e.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") < 100); if (track == null) { track = tracks.LastOrDefault(e => Convert.ToInt32(e.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") == 100); } if (track == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Track: Couldn't find tracks"); return(false); } await Helper.PlayMediaItemAsync(track.MediaItemId, 0); } else if (action.Equals("playrandomtrack", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Track: AlbumName: {0}, AlbumId: {1}", albumName, id); var mediaItemGuid = await GetIdFromNameAsync(client, albumName, id, Helper.GetAlbumByAlbumNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Track: Couldn't convert AlbumId '{0} to Guid", id); return(false); } var tracks = await Helper.GetTracksByAlbumIdAsync(client.UserId, mediaItemGuid.Value); if (!(tracks?.Count > 0)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Track: Couldn't find tracks"); return(false); } var trackList = tracks?.ToList(); var episodeIndex = new Random().Next(0, trackList.Count - 1); await Helper.PlayMediaItemAsync(trackList[episodeIndex].MediaItemId, 0); } else if (action.Equals("playalbum", StringComparison.InvariantCultureIgnoreCase)) { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Play Album: AlbumName: {0}, AlbumId: {1}, OnlyUnplayedTracks: {2}", albumName, id, onlyUnwatched); var mediaItemGuid = await GetIdFromNameAsync(client, albumName, id, Helper.GetAlbumByAlbumNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Album: Couldn't convert AlbumId '{0} to Guid", id); return(false); } var items = await Helper.GetTracksByAlbumIdAsync(client.UserId, mediaItemGuid.Value); IEnumerable <MediaItem> tracks = null; if (onlyUnwatched) { tracks = items.Where(e => Convert.ToInt32(e.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") < 100); } else { tracks = items; } if (!(tracks?.Count() > 0)) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Play Album: Couldn't find any tracks"); return(false); } PlayItemsModel.CheckQueryPlayAction(() => tracks, UI.Presentation.Players.AVType.Audio); } } return(true); }
public static async Task <bool> ParseAsync(JObject message, SocketServer server, AsyncSocket sender) { string action = GetMessageValue <string>(message, "Action"); string playlistType = GetMessageValue <string>(message, "PlaylistType", "music"); bool autoPlay = GetMessageValue <bool>(message, "AutoPlay"); int index = GetMessageValue <int>(message, "Index"); var playList = ServiceRegistration.Get <IPlayerContextManager>().CurrentPlayerContext.Playlist; var client = sender.GetRemoteClient(); if (action.Equals("new", StringComparison.InvariantCultureIgnoreCase) || action.Equals("append", StringComparison.InvariantCultureIgnoreCase)) { //new playlist or append to playlist int insertIndex = GetMessageValue <int>(message, "InsertIndex"); bool shuffle = GetMessageValue <bool>(message, "Shuffle"); // Add items from JSON or SQL JArray array = GetMessageValue <JArray>(message, "PlaylistItems"); if (array != null) { if (action.Equals("new", StringComparison.InvariantCultureIgnoreCase)) { playList.Clear(); } int idx = insertIndex; if (array != null) { playList.StartBatchUpdate(); // Add items from JSON foreach (JObject o in array) { string fileName = GetMessageValue <string>(o, "FileName"); string id = GetMessageValue <string>(o, "FileId"); var mediaItemGuid = await GetIdFromNameAsync(client, fileName, id, Helper.GetMediaItemByFileNameAsync); if (mediaItemGuid == null) { ServiceRegistration.Get <ILogger>().Error("WifiRemote: Playlist: Couldn't convert FileId '{0} to Guid", id); return(false); } MediaItem item = await Helper.GetMediaItemByIdAsync(client.UserId, mediaItemGuid.Value); if (item == null) { ServiceRegistration.Get <ILogger>().Warn("WifiRemote: Playlist: Not media item found"); continue; } playList.Insert(idx, item); idx++; } playList.EndBatchUpdate(); playList.PlayMode = PlayMode.Continuous; if (shuffle) { playList.PlayMode = PlayMode.Shuffle; } } if (autoPlay) { playList.ItemListIndex = 0; ServiceRegistration.Get <IPlayerContextManager>().CurrentPlayerContext.Play(); } } } else if (action.Equals("load", StringComparison.InvariantCultureIgnoreCase)) { //load a playlist string playlistName = GetMessageValue <string>(message, "PlayListName"); string playlistId = GetMessageValue <string>(message, "PlaylistId"); bool shuffle = GetMessageValue <bool>(message, "Shuffle"); if (string.IsNullOrEmpty(playlistId)) { List <PlaylistInformationData> playLists = ServerPlaylists.GetPlaylists().ToList(); playlistId = playLists.FirstOrDefault(p => p.Name == playlistName)?.PlaylistId.ToString(); } if (Guid.TryParse(playlistId, out Guid id)) { var data = await Helper.LoadPlayListAsync(id); LastLoadedPlayList = data.Name; playList.StartBatchUpdate(); playList.Clear(); foreach (var item in data.Items) { playList.Add(item); } playList.EndBatchUpdate(); if (autoPlay) { playList.ItemListIndex = 0; ServiceRegistration.Get <IPlayerContextManager>().CurrentPlayerContext.Play(); } } } else if (action.Equals("get", StringComparison.InvariantCultureIgnoreCase)) { //get all playlist items of the currently active playlist IList <MediaItem> items = playList.ItemList; MessagePlaylistDetails returnPlaylist = new MessagePlaylistDetails { PlaylistName = LastLoadedPlayList ?? "Play list", PlaylistRepeat = playList.RepeatMode != RepeatMode.None, PlaylistItems = new List <PlaylistEntry>() }; foreach (var mediaItem in playList.ItemList) { var ple = new PlaylistEntry { FileId = mediaItem.MediaItemId.ToString(), }; if (mediaItem.Aspects.ContainsKey(VideoAspect.ASPECT_ID)) { if (returnPlaylist.PlaylistType != "video") { if (returnPlaylist.PlaylistType == null) { returnPlaylist.PlaylistType = "video"; } else { continue; } } IList <MultipleMediaItemAspect> videoStreamAspects; MediaItemAspect.TryGetAspects(mediaItem.Aspects, VideoStreamAspect.Metadata, out videoStreamAspects); var mediaAspect = MediaItemAspect.GetAspect(mediaItem.Aspects, MediaAspect.Metadata); var movieAspect = MediaItemAspect.GetAspect(mediaItem.Aspects, MovieAspect.Metadata); var episodeAspect = MediaItemAspect.GetAspect(mediaItem.Aspects, EpisodeAspect.Metadata); TimeSpan duration = TimeSpan.FromSeconds(0); int? setNo = videoStreamAspects?.FirstOrDefault()?.GetAttributeValue <int>(VideoStreamAspect.ATTR_VIDEO_PART_SET); if (setNo.HasValue) { foreach (var stream in videoStreamAspects.Where(s => s.GetAttributeValue <int>(VideoStreamAspect.ATTR_VIDEO_PART_SET) == setNo.Value)) { long?durSecs = stream.GetAttributeValue <long?>(VideoStreamAspect.ATTR_DURATION); if (durSecs.HasValue) { duration.Add(TimeSpan.FromSeconds(durSecs.Value)); } } } ple.MpMediaType = (int)MpMediaTypes.Movie; ple.MpProviderId = (int)MpProviders.MPVideo; ple.MediaType = returnPlaylist.PlaylistType; ple.Name = movieAspect?.GetAttributeValue <string>(MovieAspect.ATTR_MOVIE_NAME) ?? episodeAspect?.GetAttributeValue <string>(EpisodeAspect.ATTR_EPISODE_NAME) ?? mediaAspect.GetAttributeValue <string>(MediaAspect.ATTR_TITLE); ple.Name2 = episodeAspect?.GetAttributeValue <string>(EpisodeAspect.ATTR_SERIES_NAME); ple.Duration = Convert.ToInt32(duration.TotalSeconds); ple.Played = Convert.ToInt32(mediaItem.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") == 100; returnPlaylist.PlaylistItems.Add(ple); } else if (mediaItem.Aspects.ContainsKey(AudioAspect.ASPECT_ID)) { if (returnPlaylist.PlaylistType != "music") { if (returnPlaylist.PlaylistType == null) { returnPlaylist.PlaylistType = "music"; } else { continue; } } var mediaAspect = MediaItemAspect.GetAspect(mediaItem.Aspects, MediaAspect.Metadata); var audioAspect = MediaItemAspect.GetAspect(mediaItem.Aspects, AudioAspect.Metadata); ple.MpMediaType = (int)MpMediaTypes.MusicTrack; ple.MpProviderId = (int)MpProviders.MPMusic; ple.MediaType = returnPlaylist.PlaylistType; ple.Name = audioAspect.GetAttributeValue <string>(AudioAspect.ATTR_TRACKNAME); ple.Name2 = audioAspect.GetAttributeValue <string>(AudioAspect.ATTR_ALBUM); var albumArtists = audioAspect.GetCollectionAttribute <string>(AudioAspect.ATTR_ALBUMARTISTS); if (albumArtists?.Count() > 0) { ple.AlbumArtist = string.Join(", ", albumArtists); } ple.Duration = Convert.ToInt32(audioAspect.GetAttributeValue <long>(AudioAspect.ATTR_DURATION)); ple.Played = Convert.ToInt32(mediaItem.UserData.FirstOrDefault(d => d.Key == UserDataKeysKnown.KEY_PLAY_PERCENTAGE).Value ?? "0") == 100; returnPlaylist.PlaylistItems.Add(ple); } } SendMessageToClient.Send(returnPlaylist, sender, true); } else if (action.Equals("remove", StringComparison.InvariantCultureIgnoreCase)) { //remove an item from the playlist playList.RemoveAt(index); } else if (action.Equals("move", StringComparison.InvariantCultureIgnoreCase)) { //move a playlist item to a new index int oldIndex = GetMessageValue <int>(message, "OldIndex"); int newIndex = GetMessageValue <int>(message, "NewIndex"); var mediaItem = playList.ItemList[oldIndex]; playList.RemoveAt(oldIndex); playList.Insert(newIndex, mediaItem); } else if (action.Equals("play", StringComparison.InvariantCultureIgnoreCase)) { //start playback of a playlist item playList.ItemListIndex = index; ServiceRegistration.Get <IPlayerContextManager>().CurrentPlayerContext.Play(); } else if (action.Equals("clear", StringComparison.InvariantCultureIgnoreCase)) { //clear the playlist playList.Clear(); } else if (action.Equals("list", StringComparison.InvariantCultureIgnoreCase)) { //get a list of all available playlists List <PlaylistInformationData> playLists = ServerPlaylists.GetPlaylists().ToList(); MessagePlaylists returnList = new MessagePlaylists { PlayLists = playLists.Select(x => x.Name).ToList() }; SendMessageToAllClients.Send(returnList, ref SocketServer.Instance.connectedSockets); } else if (action.Equals("save", StringComparison.InvariantCultureIgnoreCase)) { //save the current playlist to file string name = GetMessageValue <string>(message, "PlayListName"); if (name != null) { await Helper.SavePlayListAsync(Guid.NewGuid(), name, playlistType, playList.ItemList.Select(i => i.MediaItemId)); } else { Logger.Warn("WifiRemote: Playlist: Must specify a name to save a playlist"); } } else if (action.Equals("shuffle", StringComparison.InvariantCultureIgnoreCase)) { var playMode = playList.PlayMode == PlayMode.Shuffle ? PlayMode.Continuous : PlayMode.Shuffle; playList.PlayMode = playMode; } else if (action.Equals("repeat", StringComparison.InvariantCultureIgnoreCase)) { Logger.Debug("WifiRemote: Playlist action repeat"); bool repeat = GetMessageValue <bool>(message, "Repeat"); RepeatMode repeatMode; if (repeat) { repeatMode = RepeatMode.All; } else { repeatMode = RepeatMode.None; } playList.RepeatMode = repeatMode; } return(true); }