private static void DoNowPlayingUpdate() { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Start now-playing update thread"); _nowPlayingUpdateThreadRunning = true; try { while (_nowPlayingUpdateThreadRunning) { if (!ServiceRegistration.IsShuttingDown && Helper.IsNowPlaying()) { ServiceRegistration.Get <ILogger>(false)?.Debug("WifiRemote: Send now-playing"); if (_nowPlayingWasSend) { SendMessageToAllClients.Send(new MessageNowPlayingUpdate(), ref SocketServer.Instance.connectedSockets); } else { SendMessageToAllClients.Send(new MessageNowPlaying(), ref SocketServer.Instance.connectedSockets); _nowPlayingWasSend = true; } } _nowPlayingUpdateThreadSleep.Wait(UPDATE_INTERVAL); } ServiceRegistration.Get <ILogger>(false)?.Debug("WifiRemote: Stop now-playing update thread"); } catch (Exception ex) { ServiceRegistration.Get <ILogger>(false)?.Error("WifiRemote: Now-playing update thread crashed", ex); } }
private static void DoStatusUpdate() { ServiceRegistration.Get <ILogger>().Debug("WifiRemote: Start status update thread"); _statusUpdateThreadRunning = true; try { while (_statusUpdateThreadRunning) { if (!ServiceRegistration.IsShuttingDown) { if (WifiRemotePlugin.MessageStatus.IsChanged()) { ServiceRegistration.Get <ILogger>(false)?.Debug("WifiRemote: Send Status update"); SendMessageToAllClients.Send(WifiRemotePlugin.MessageStatus, ref SocketServer.Instance.connectedSockets); } } _statusUpdateThreadSleep.Wait(UPDATE_INTERVAL); } ServiceRegistration.Get <ILogger>(false)?.Debug("WifiRemote: Stop status update thread"); } catch (Exception ex) { ServiceRegistration.Get <ILogger>(false)?.Error("WifiRemote: Status update thread crashed", ex); } }
public static void OnMessageReceived(SystemMessage message) { // React to player changes PlayerManagerMessaging.MessageType messageType = (PlayerManagerMessaging.MessageType)message.MessageType; IPlayerSlotController psc; switch (messageType) { case PlayerManagerMessaging.MessageType.PlayerResumeState: Logger.Debug("WifiRemote: Player Resume"); //Resume(); break; case PlayerManagerMessaging.MessageType.PlaybackStateChanged: Logger.Debug("WifiRemote: Playback State Changed"); SendMessageToAllClients.Send(WifiRemotePlugin.MessageStatus, ref SocketServer.Instance.connectedSockets); break; case PlayerManagerMessaging.MessageType.PlayerError: Logger.Error("WifiRemote: Player Error"); break; case PlayerManagerMessaging.MessageType.PlayerEnded: case PlayerManagerMessaging.MessageType.PlayerStopped: Logger.Debug("WifiRemote: Player Stopped or Ended"); SendMessageToAllClients.Send(WifiRemotePlugin.MessageStatus, ref SocketServer.Instance.connectedSockets); NowPlayingUpdater.Stop(); break; case PlayerManagerMessaging.MessageType.PlayerStarted: Logger.Debug("WifiRemote: Player Started"); SendMessageToAllClients.Send(WifiRemotePlugin.MessageStatus, ref SocketServer.Instance.connectedSockets); NowPlayingUpdater.Start(); break; case PlayerManagerMessaging.MessageType.VolumeChanged: Logger.Debug("WifiRemote: Volume changed"); SendMessageToAllClients.Send(new MessageVolume(), ref SocketServer.Instance.connectedSockets); break; } }
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); }