diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Session/SessionManager.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Session/SessionManager.cs | 148 |
1 files changed, 137 insertions, 11 deletions
diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index 6452d5ac7..6f0a71c8c 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -8,6 +8,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Persistence; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Entities; @@ -444,6 +445,8 @@ namespace MediaBrowser.Server.Implementations.Session MediaSourceId = info.MediaSourceId }, _logger); + + await SendPlaybackStartNotification(session, CancellationToken.None).ConfigureAwait(false); } /// <summary> @@ -583,6 +586,8 @@ namespace MediaBrowser.Server.Implementations.Session MediaSourceId = mediaSourceId }, _logger); + + await SendPlaybackStoppedNotification(session, CancellationToken.None).ConfigureAwait(false); } private string GetMediaSourceId(BaseItem item, string reportedMediaSourceId) @@ -858,12 +863,17 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendBrowseCommand(Guid controllingSessionId, Guid sessionId, BrowseRequest command, CancellationToken cancellationToken) { - var session = GetSessionForRemoteControl(sessionId); + var generalCommand = new GeneralCommand + { + Name = GeneralCommandType.DisplayContent.ToString() + }; - var controllingSession = GetSession(controllingSessionId); - AssertCanControl(session, controllingSession); + generalCommand.Arguments["Context"] = command.Context; + generalCommand.Arguments["ItemId"] = command.ItemId; + generalCommand.Arguments["ItemName"] = command.ItemName; + generalCommand.Arguments["ItemType"] = command.ItemType; - return session.SessionController.SendBrowseCommand(command, cancellationToken); + return SendGeneralCommand(controllingSessionId, sessionId, generalCommand, cancellationToken); } public Task SendPlaystateCommand(Guid controllingSessionId, Guid sessionId, PlaystateRequest command, CancellationToken cancellationToken) @@ -972,7 +982,6 @@ namespace MediaBrowser.Server.Implementations.Session return Task.WhenAll(tasks); } - public Task SendSessionEndedNotification(SessionInfo sessionInfo, CancellationToken cancellationToken) { var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null).ToList(); @@ -994,6 +1003,48 @@ namespace MediaBrowser.Server.Implementations.Session return Task.WhenAll(tasks); } + public Task SendPlaybackStartNotification(SessionInfo sessionInfo, CancellationToken cancellationToken) + { + var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null).ToList(); + var dto = GetSessionInfoDto(sessionInfo); + + var tasks = sessions.Select(session => Task.Run(async () => + { + try + { + await session.SessionController.SendPlaybackStartNotification(dto, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error in SendPlaybackStartNotification.", ex); + } + + }, cancellationToken)); + + return Task.WhenAll(tasks); + } + + public Task SendPlaybackStoppedNotification(SessionInfo sessionInfo, CancellationToken cancellationToken) + { + var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null).ToList(); + var dto = GetSessionInfoDto(sessionInfo); + + var tasks = sessions.Select(session => Task.Run(async () => + { + try + { + await session.SessionController.SendPlaybackStoppedNotification(dto, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error in SendPlaybackStoppedNotification.", ex); + } + + }, cancellationToken)); + + return Task.WhenAll(tasks); + } + /// <summary> /// Adds the additional user. /// </summary> @@ -1131,6 +1182,13 @@ namespace MediaBrowser.Server.Implementations.Session if (session.UserId.HasValue) { dto.UserId = session.UserId.Value.ToString("N"); + + var user = _userManager.GetUserById(session.UserId.Value); + + if (user != null) + { + dto.UserPrimaryImageTag = GetImageCacheTag(user, ImageType.Primary); + } } return dto; @@ -1158,19 +1216,84 @@ namespace MediaBrowser.Server.Implementations.Session MediaType = item.MediaType, Type = item.GetClientTypeName(), RunTimeTicks = nowPlayingRuntimeTicks, - MediaSourceId = mediaSourceId + MediaSourceId = mediaSourceId, + IndexNumber = item.IndexNumber, + ParentIndexNumber = item.ParentIndexNumber, + PremiereDate = item.PremiereDate, + ProductionYear = item.ProductionYear }; info.PrimaryImageTag = GetImageCacheTag(item, ImageType.Primary); + if (info.PrimaryImageTag.HasValue) + { + info.PrimaryImageItemId = GetDtoId(item); + } + + var episode = item as Episode; + if (episode != null) + { + info.IndexNumberEnd = episode.IndexNumberEnd; + } + + var hasSeries = item as IHasSeries; + if (hasSeries != null) + { + info.SeriesName = hasSeries.SeriesName; + } + + var recording = item as ILiveTvRecording; + if (recording != null && recording.RecordingInfo != null) + { + if (recording.RecordingInfo.IsSeries) + { + info.Name = recording.RecordingInfo.EpisodeTitle; + info.SeriesName = recording.RecordingInfo.Name; + + if (string.IsNullOrWhiteSpace(info.Name)) + { + info.Name = recording.RecordingInfo.Name; + } + } + } + + var audio = item as Audio; + if (audio != null) + { + info.Album = audio.Album; + info.Artists = audio.Artists; + + if (!info.PrimaryImageTag.HasValue) + { + var album = audio.Parents.OfType<MusicAlbum>().FirstOrDefault(); + + if (album != null && album.HasImage(ImageType.Primary)) + { + info.PrimaryImageTag = GetImageCacheTag(album, ImageType.Primary); + if (info.PrimaryImageTag.HasValue) + { + info.PrimaryImageItemId = GetDtoId(album); + } + } + } + } + + var musicVideo = item as MusicVideo; + if (musicVideo != null) + { + info.Album = musicVideo.Album; + if (!string.IsNullOrWhiteSpace(musicVideo.Artist)) + { + info.Artists.Add(musicVideo.Artist); + } + } + var backropItem = item.HasImage(ImageType.Backdrop) ? item : null; var thumbItem = item.HasImage(ImageType.Thumb) ? item : null; if (thumbItem == null) { - var episode = item as Episode; - if (episode != null) { var series = episode.Series; @@ -1184,8 +1307,6 @@ namespace MediaBrowser.Server.Implementations.Session if (backropItem == null) { - var episode = item as Episode; - if (episode != null) { var series = episode.Series; @@ -1197,6 +1318,11 @@ namespace MediaBrowser.Server.Implementations.Session } } + if (backropItem == null) + { + backropItem = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Backdrop)); + } + if (thumbItem == null) { thumbItem = item.Parents.FirstOrDefault(i => i.HasImage(ImageType.Thumb)); @@ -1208,7 +1334,7 @@ namespace MediaBrowser.Server.Implementations.Session info.ThumbItemId = GetDtoId(thumbItem); } - if (thumbItem != null) + if (backropItem != null) { info.BackdropImageTag = GetImageCacheTag(backropItem, ImageType.Backdrop); info.BackdropItemId = GetDtoId(backropItem); |
