|
|
|
@ -1,5 +1,4 @@
|
|
|
|
|
using System.IO;
|
|
|
|
|
using MediaBrowser.Common.Events;
|
|
|
|
|
using MediaBrowser.Common.Events;
|
|
|
|
|
using MediaBrowser.Common.Extensions;
|
|
|
|
|
using MediaBrowser.Controller.Configuration;
|
|
|
|
|
using MediaBrowser.Controller.Drawing;
|
|
|
|
@ -229,7 +228,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
return session;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task ReportSessionEnded(Guid sessionId)
|
|
|
|
|
public async Task ReportSessionEnded(string sessionId)
|
|
|
|
|
{
|
|
|
|
|
await _sessionLock.WaitAsync(CancellationToken.None).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
@ -261,50 +260,51 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// Updates the now playing item id.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="session">The session.</param>
|
|
|
|
|
/// <param name="item">The item.</param>
|
|
|
|
|
/// <param name="mediaSourceId">The media version identifier.</param>
|
|
|
|
|
/// <param name="isPaused">if set to <c>true</c> [is paused].</param>
|
|
|
|
|
/// <param name="currentPositionTicks">The current position ticks.</param>
|
|
|
|
|
private void UpdateNowPlayingItem(SessionInfo session, BaseItem item, string mediaSourceId, bool isPaused, long? currentPositionTicks = null)
|
|
|
|
|
/// <param name="info">The information.</param>
|
|
|
|
|
/// <param name="libraryItem">The library item.</param>
|
|
|
|
|
private void UpdateNowPlayingItem(SessionInfo session, PlaybackProgressInfo info, BaseItem libraryItem)
|
|
|
|
|
{
|
|
|
|
|
session.IsPaused = isPaused;
|
|
|
|
|
session.NowPlayingPositionTicks = currentPositionTicks;
|
|
|
|
|
session.NowPlayingItem = item;
|
|
|
|
|
session.LastActivityDate = DateTime.UtcNow;
|
|
|
|
|
session.NowPlayingMediaSourceId = mediaSourceId;
|
|
|
|
|
var runtimeTicks = libraryItem.RunTimeTicks;
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(mediaSourceId))
|
|
|
|
|
if (string.IsNullOrWhiteSpace(info.MediaSourceId))
|
|
|
|
|
{
|
|
|
|
|
session.NowPlayingRunTimeTicks = item.RunTimeTicks;
|
|
|
|
|
info.MediaSourceId = info.ItemId;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
if (!string.Equals(info.ItemId, info.MediaSourceId) &&
|
|
|
|
|
!string.IsNullOrWhiteSpace(info.MediaSourceId))
|
|
|
|
|
{
|
|
|
|
|
var version = _libraryManager.GetItemById(new Guid(mediaSourceId));
|
|
|
|
|
runtimeTicks = _libraryManager.GetItemById(new Guid(info.MediaSourceId)).RunTimeTicks;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
session.NowPlayingRunTimeTicks = version.RunTimeTicks;
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(info.ItemId))
|
|
|
|
|
{
|
|
|
|
|
info.Item = GetItemInfo(libraryItem, runtimeTicks);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
session.PlayState.IsPaused = info.IsPaused;
|
|
|
|
|
session.PlayState.PositionTicks = info.PositionTicks;
|
|
|
|
|
session.NowPlayingItem = info.Item;
|
|
|
|
|
session.LastActivityDate = DateTime.UtcNow;
|
|
|
|
|
session.PlayState.MediaSourceId = info.MediaSourceId;
|
|
|
|
|
|
|
|
|
|
session.PlayState.CanSeek = info.CanSeek;
|
|
|
|
|
|
|
|
|
|
session.PlayState.IsMuted = info.IsMuted;
|
|
|
|
|
session.PlayState.VolumeLevel = info.VolumeLevel;
|
|
|
|
|
session.PlayState.AudioStreamIndex = info.AudioStreamIndex;
|
|
|
|
|
session.PlayState.SubtitleStreamIndex = info.SubtitleStreamIndex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Removes the now playing item id.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="session">The session.</param>
|
|
|
|
|
/// <param name="item">The item.</param>
|
|
|
|
|
private void RemoveNowPlayingItem(SessionInfo session, BaseItem item)
|
|
|
|
|
/// <exception cref="System.ArgumentNullException">item</exception>
|
|
|
|
|
private void RemoveNowPlayingItem(SessionInfo session)
|
|
|
|
|
{
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("item");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (session.NowPlayingItem != null && session.NowPlayingItem.Id == item.Id)
|
|
|
|
|
{
|
|
|
|
|
session.NowPlayingItem = null;
|
|
|
|
|
session.NowPlayingPositionTicks = null;
|
|
|
|
|
session.IsPaused = false;
|
|
|
|
|
session.NowPlayingRunTimeTicks = null;
|
|
|
|
|
session.NowPlayingMediaSourceId = null;
|
|
|
|
|
}
|
|
|
|
|
session.NowPlayingItem = null;
|
|
|
|
|
session.PlayState = new PlayerStateInfo();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string GetSessionKey(string clientType, string appVersion, string deviceId)
|
|
|
|
@ -338,7 +338,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
Client = clientType,
|
|
|
|
|
DeviceId = deviceId,
|
|
|
|
|
ApplicationVersion = appVersion,
|
|
|
|
|
Id = Guid.NewGuid()
|
|
|
|
|
Id = Guid.NewGuid().ToString("N")
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
OnSessionStarted(sessionInfo);
|
|
|
|
@ -402,45 +402,40 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// <param name="info">The info.</param>
|
|
|
|
|
/// <returns>Task.</returns>
|
|
|
|
|
/// <exception cref="System.ArgumentNullException">info</exception>
|
|
|
|
|
public async Task OnPlaybackStart(PlaybackInfo info)
|
|
|
|
|
public async Task OnPlaybackStart(PlaybackStartInfo info)
|
|
|
|
|
{
|
|
|
|
|
if (info == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("info");
|
|
|
|
|
}
|
|
|
|
|
if (info.SessionId == Guid.Empty)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("info");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var session = Sessions.First(i => i.Id.Equals(info.SessionId));
|
|
|
|
|
|
|
|
|
|
var item = info.Item;
|
|
|
|
|
var session = GetSession(info.SessionId);
|
|
|
|
|
|
|
|
|
|
var mediaSourceId = GetMediaSourceId(item, info.MediaSourceId);
|
|
|
|
|
var libraryItem = string.IsNullOrWhiteSpace(info.ItemId)
|
|
|
|
|
? null
|
|
|
|
|
: _libraryManager.GetItemById(new Guid(info.ItemId));
|
|
|
|
|
|
|
|
|
|
UpdateNowPlayingItem(session, item, mediaSourceId, false);
|
|
|
|
|
UpdateNowPlayingItem(session, info, libraryItem);
|
|
|
|
|
|
|
|
|
|
session.CanSeek = info.CanSeek;
|
|
|
|
|
session.QueueableMediaTypes = info.QueueableMediaTypes;
|
|
|
|
|
|
|
|
|
|
session.NowPlayingAudioStreamIndex = info.AudioStreamIndex;
|
|
|
|
|
session.NowPlayingSubtitleStreamIndex = info.SubtitleStreamIndex;
|
|
|
|
|
|
|
|
|
|
var key = item.GetUserDataKey();
|
|
|
|
|
|
|
|
|
|
var users = GetUsers(session);
|
|
|
|
|
|
|
|
|
|
foreach (var user in users)
|
|
|
|
|
if (libraryItem != null)
|
|
|
|
|
{
|
|
|
|
|
await OnPlaybackStart(user.Id, key, item).ConfigureAwait(false);
|
|
|
|
|
var key = libraryItem.GetUserDataKey();
|
|
|
|
|
|
|
|
|
|
foreach (var user in users)
|
|
|
|
|
{
|
|
|
|
|
await OnPlaybackStart(user.Id, key, libraryItem).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Nothing to save here
|
|
|
|
|
// Fire events to inform plugins
|
|
|
|
|
EventHelper.QueueEventIfNotNull(PlaybackStart, this, new PlaybackProgressEventArgs
|
|
|
|
|
{
|
|
|
|
|
Item = item,
|
|
|
|
|
Item = libraryItem,
|
|
|
|
|
Users = users,
|
|
|
|
|
MediaSourceId = info.MediaSourceId
|
|
|
|
|
|
|
|
|
@ -478,44 +473,39 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// <returns>Task.</returns>
|
|
|
|
|
/// <exception cref="System.ArgumentNullException"></exception>
|
|
|
|
|
/// <exception cref="System.ArgumentOutOfRangeException">positionTicks</exception>
|
|
|
|
|
public async Task OnPlaybackProgress(Controller.Session.PlaybackProgressInfo info)
|
|
|
|
|
public async Task OnPlaybackProgress(PlaybackProgressInfo info)
|
|
|
|
|
{
|
|
|
|
|
if (info == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("info");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (info.PositionTicks.HasValue && info.PositionTicks.Value < 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentOutOfRangeException("positionTicks");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var session = Sessions.First(i => i.Id.Equals(info.SessionId));
|
|
|
|
|
|
|
|
|
|
var mediaSourceId = GetMediaSourceId(info.Item, info.MediaSourceId);
|
|
|
|
|
var session = GetSession(info.SessionId);
|
|
|
|
|
|
|
|
|
|
UpdateNowPlayingItem(session, info.Item, mediaSourceId, info.IsPaused, info.PositionTicks);
|
|
|
|
|
var libraryItem = string.IsNullOrWhiteSpace(info.ItemId)
|
|
|
|
|
? null
|
|
|
|
|
: _libraryManager.GetItemById(new Guid(info.ItemId));
|
|
|
|
|
|
|
|
|
|
session.IsMuted = info.IsMuted;
|
|
|
|
|
session.VolumeLevel = info.VolumeLevel;
|
|
|
|
|
session.NowPlayingAudioStreamIndex = info.AudioStreamIndex;
|
|
|
|
|
session.NowPlayingSubtitleStreamIndex = info.SubtitleStreamIndex;
|
|
|
|
|
|
|
|
|
|
var key = info.Item.GetUserDataKey();
|
|
|
|
|
UpdateNowPlayingItem(session, info, libraryItem);
|
|
|
|
|
|
|
|
|
|
var users = GetUsers(session);
|
|
|
|
|
|
|
|
|
|
foreach (var user in users)
|
|
|
|
|
if (libraryItem != null)
|
|
|
|
|
{
|
|
|
|
|
await OnPlaybackProgress(user.Id, key, info.Item, info.PositionTicks).ConfigureAwait(false);
|
|
|
|
|
var key = libraryItem.GetUserDataKey();
|
|
|
|
|
|
|
|
|
|
foreach (var user in users)
|
|
|
|
|
{
|
|
|
|
|
await OnPlaybackProgress(user.Id, key, libraryItem, info.PositionTicks).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EventHelper.QueueEventIfNotNull(PlaybackProgress, this, new PlaybackProgressEventArgs
|
|
|
|
|
{
|
|
|
|
|
Item = info.Item,
|
|
|
|
|
Item = libraryItem,
|
|
|
|
|
Users = users,
|
|
|
|
|
PlaybackPositionTicks = info.PositionTicks,
|
|
|
|
|
MediaSourceId = mediaSourceId
|
|
|
|
|
PlaybackPositionTicks = session.PlayState.PositionTicks,
|
|
|
|
|
MediaSourceId = session.PlayState.MediaSourceId
|
|
|
|
|
|
|
|
|
|
}, _logger);
|
|
|
|
|
}
|
|
|
|
@ -539,70 +529,58 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// <returns>Task.</returns>
|
|
|
|
|
/// <exception cref="System.ArgumentNullException">info</exception>
|
|
|
|
|
/// <exception cref="System.ArgumentOutOfRangeException">positionTicks</exception>
|
|
|
|
|
public async Task OnPlaybackStopped(Controller.Session.PlaybackStopInfo info)
|
|
|
|
|
public async Task OnPlaybackStopped(PlaybackStopInfo info)
|
|
|
|
|
{
|
|
|
|
|
if (info == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentNullException("info");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (info.Item == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("PlaybackStopInfo.Item cannot be null");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (info.SessionId == Guid.Empty)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("PlaybackStopInfo.SessionId cannot be Guid.Empty");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (info.PositionTicks.HasValue && info.PositionTicks.Value < 0)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentOutOfRangeException("positionTicks");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var session = Sessions.First(i => i.Id.Equals(info.SessionId));
|
|
|
|
|
var session = GetSession(info.SessionId);
|
|
|
|
|
|
|
|
|
|
var libraryItem = string.IsNullOrWhiteSpace(info.ItemId)
|
|
|
|
|
? null
|
|
|
|
|
: _libraryManager.GetItemById(new Guid(info.ItemId));
|
|
|
|
|
|
|
|
|
|
RemoveNowPlayingItem(session, info.Item);
|
|
|
|
|
// Normalize
|
|
|
|
|
if (string.IsNullOrWhiteSpace(info.MediaSourceId))
|
|
|
|
|
{
|
|
|
|
|
info.MediaSourceId = info.ItemId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var key = info.Item.GetUserDataKey();
|
|
|
|
|
RemoveNowPlayingItem(session);
|
|
|
|
|
|
|
|
|
|
var users = GetUsers(session);
|
|
|
|
|
|
|
|
|
|
var playedToCompletion = false;
|
|
|
|
|
foreach (var user in users)
|
|
|
|
|
|
|
|
|
|
if (libraryItem != null)
|
|
|
|
|
{
|
|
|
|
|
playedToCompletion = await OnPlaybackStopped(user.Id, key, info.Item, info.PositionTicks).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
var key = libraryItem.GetUserDataKey();
|
|
|
|
|
|
|
|
|
|
var mediaSourceId = GetMediaSourceId(info.Item, info.MediaSourceId);
|
|
|
|
|
foreach (var user in users)
|
|
|
|
|
{
|
|
|
|
|
playedToCompletion = await OnPlaybackStopped(user.Id, key, libraryItem, info.PositionTicks).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EventHelper.QueueEventIfNotNull(PlaybackStopped, this, new PlaybackStopEventArgs
|
|
|
|
|
{
|
|
|
|
|
Item = info.Item,
|
|
|
|
|
Item = libraryItem,
|
|
|
|
|
Users = users,
|
|
|
|
|
PlaybackPositionTicks = info.PositionTicks,
|
|
|
|
|
PlayedToCompletion = playedToCompletion,
|
|
|
|
|
MediaSourceId = mediaSourceId
|
|
|
|
|
MediaSourceId = info.MediaSourceId
|
|
|
|
|
|
|
|
|
|
}, _logger);
|
|
|
|
|
|
|
|
|
|
await SendPlaybackStoppedNotification(session, CancellationToken.None).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string GetMediaSourceId(BaseItem item, string reportedMediaSourceId)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrWhiteSpace(reportedMediaSourceId))
|
|
|
|
|
{
|
|
|
|
|
if (item is Video || item is Audio)
|
|
|
|
|
{
|
|
|
|
|
reportedMediaSourceId = item.Id.ToString("N");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return reportedMediaSourceId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task<bool> OnPlaybackStopped(Guid userId, string userDataKey, BaseItem item, long? positionTicks)
|
|
|
|
|
{
|
|
|
|
|
var data = _userDataRepository.GetUserData(userId, userDataKey);
|
|
|
|
@ -691,9 +669,9 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// <param name="sessionId">The session identifier.</param>
|
|
|
|
|
/// <returns>SessionInfo.</returns>
|
|
|
|
|
/// <exception cref="ResourceNotFoundException"></exception>
|
|
|
|
|
private SessionInfo GetSession(Guid sessionId)
|
|
|
|
|
private SessionInfo GetSession(string sessionId)
|
|
|
|
|
{
|
|
|
|
|
var session = Sessions.First(i => i.Id.Equals(sessionId));
|
|
|
|
|
var session = Sessions.First(i => string.Equals(i.Id, sessionId));
|
|
|
|
|
|
|
|
|
|
if (session == null)
|
|
|
|
|
{
|
|
|
|
@ -709,7 +687,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// <param name="sessionId">The session id.</param>
|
|
|
|
|
/// <returns>SessionInfo.</returns>
|
|
|
|
|
/// <exception cref="ResourceNotFoundException"></exception>
|
|
|
|
|
private SessionInfo GetSessionForRemoteControl(Guid sessionId)
|
|
|
|
|
private SessionInfo GetSessionForRemoteControl(string sessionId)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSession(sessionId);
|
|
|
|
|
|
|
|
|
@ -721,7 +699,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
return session;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task SendMessageCommand(Guid controllingSessionId, Guid sessionId, MessageCommand command, CancellationToken cancellationToken)
|
|
|
|
|
public Task SendMessageCommand(string controllingSessionId, string sessionId, MessageCommand command, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSessionForRemoteControl(sessionId);
|
|
|
|
|
|
|
|
|
@ -731,7 +709,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
return session.SessionController.SendMessageCommand(command, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task SendGeneralCommand(Guid controllingSessionId, Guid sessionId, GeneralCommand command, CancellationToken cancellationToken)
|
|
|
|
|
public Task SendGeneralCommand(string controllingSessionId, string sessionId, GeneralCommand command, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSessionForRemoteControl(sessionId);
|
|
|
|
|
|
|
|
|
@ -741,7 +719,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
return session.SessionController.SendGeneralCommand(command, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task SendPlayCommand(Guid controllingSessionId, Guid sessionId, PlayRequest command, CancellationToken cancellationToken)
|
|
|
|
|
public Task SendPlayCommand(string controllingSessionId, string sessionId, PlayRequest command, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSessionForRemoteControl(sessionId);
|
|
|
|
|
|
|
|
|
@ -861,7 +839,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
return new BaseItem[] { };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task SendBrowseCommand(Guid controllingSessionId, Guid sessionId, BrowseRequest command, CancellationToken cancellationToken)
|
|
|
|
|
public Task SendBrowseCommand(string controllingSessionId, string sessionId, BrowseRequest command, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var generalCommand = new GeneralCommand
|
|
|
|
|
{
|
|
|
|
@ -876,15 +854,10 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
return SendGeneralCommand(controllingSessionId, sessionId, generalCommand, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task SendPlaystateCommand(Guid controllingSessionId, Guid sessionId, PlaystateRequest command, CancellationToken cancellationToken)
|
|
|
|
|
public Task SendPlaystateCommand(string controllingSessionId, string sessionId, PlaystateRequest command, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSessionForRemoteControl(sessionId);
|
|
|
|
|
|
|
|
|
|
if (command.Command == PlaystateCommand.Seek && !session.CanSeek)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException(string.Format("Session {0} is unable to seek.", session.Id));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var controllingSession = GetSession(controllingSessionId);
|
|
|
|
|
AssertCanControl(session, controllingSession);
|
|
|
|
|
if (controllingSession.UserId.HasValue)
|
|
|
|
@ -1052,7 +1025,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// <param name="userId">The user identifier.</param>
|
|
|
|
|
/// <exception cref="System.UnauthorizedAccessException">Cannot modify additional users without authenticating first.</exception>
|
|
|
|
|
/// <exception cref="System.ArgumentException">The requested user is already the primary user of the session.</exception>
|
|
|
|
|
public void AddAdditionalUser(Guid sessionId, Guid userId)
|
|
|
|
|
public void AddAdditionalUser(string sessionId, Guid userId)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSession(sessionId);
|
|
|
|
|
|
|
|
|
@ -1085,7 +1058,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// <param name="userId">The user identifier.</param>
|
|
|
|
|
/// <exception cref="System.UnauthorizedAccessException">Cannot modify additional users without authenticating first.</exception>
|
|
|
|
|
/// <exception cref="System.ArgumentException">The requested user is already the primary user of the session.</exception>
|
|
|
|
|
public void RemoveAdditionalUser(Guid sessionId, Guid userId)
|
|
|
|
|
public void RemoveAdditionalUser(string sessionId, Guid userId)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSession(sessionId);
|
|
|
|
|
|
|
|
|
@ -1136,7 +1109,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sessionId">The session identifier.</param>
|
|
|
|
|
/// <param name="capabilities">The capabilities.</param>
|
|
|
|
|
public void ReportCapabilities(Guid sessionId, SessionCapabilities capabilities)
|
|
|
|
|
public void ReportCapabilities(string sessionId, SessionCapabilities capabilities)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSession(sessionId);
|
|
|
|
|
|
|
|
|
@ -1151,33 +1124,26 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
Client = session.Client,
|
|
|
|
|
DeviceId = session.DeviceId,
|
|
|
|
|
DeviceName = session.DeviceName,
|
|
|
|
|
Id = session.Id.ToString("N"),
|
|
|
|
|
Id = session.Id,
|
|
|
|
|
LastActivityDate = session.LastActivityDate,
|
|
|
|
|
NowPlayingPositionTicks = session.NowPlayingPositionTicks,
|
|
|
|
|
NowPlayingPositionTicks = session.PlayState.PositionTicks,
|
|
|
|
|
SupportsRemoteControl = session.SupportsRemoteControl,
|
|
|
|
|
IsPaused = session.IsPaused,
|
|
|
|
|
IsMuted = session.IsMuted,
|
|
|
|
|
IsPaused = session.PlayState.IsPaused,
|
|
|
|
|
IsMuted = session.PlayState.IsMuted,
|
|
|
|
|
NowViewingContext = session.NowViewingContext,
|
|
|
|
|
NowViewingItemId = session.NowViewingItemId,
|
|
|
|
|
NowViewingItemName = session.NowViewingItemName,
|
|
|
|
|
NowViewingItemType = session.NowViewingItemType,
|
|
|
|
|
NowViewingItem = session.NowViewingItem,
|
|
|
|
|
ApplicationVersion = session.ApplicationVersion,
|
|
|
|
|
CanSeek = session.CanSeek,
|
|
|
|
|
CanSeek = session.PlayState.CanSeek,
|
|
|
|
|
QueueableMediaTypes = session.QueueableMediaTypes,
|
|
|
|
|
PlayableMediaTypes = session.PlayableMediaTypes,
|
|
|
|
|
RemoteEndPoint = session.RemoteEndPoint,
|
|
|
|
|
AdditionalUsers = session.AdditionalUsers,
|
|
|
|
|
SupportedCommands = session.SupportedCommands,
|
|
|
|
|
NowPlayingAudioStreamIndex = session.NowPlayingAudioStreamIndex,
|
|
|
|
|
NowPlayingSubtitleStreamIndex = session.NowPlayingSubtitleStreamIndex,
|
|
|
|
|
UserName = session.UserName,
|
|
|
|
|
VolumeLevel = session.VolumeLevel
|
|
|
|
|
};
|
|
|
|
|
NowPlayingItem = session.NowPlayingItem,
|
|
|
|
|
|
|
|
|
|
if (session.NowPlayingItem != null)
|
|
|
|
|
{
|
|
|
|
|
dto.NowPlayingItem = GetNowPlayingInfo(session.NowPlayingItem, session.NowPlayingMediaSourceId, session.NowPlayingRunTimeTicks);
|
|
|
|
|
}
|
|
|
|
|
PlayState = session.PlayState
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (session.UserId.HasValue)
|
|
|
|
|
{
|
|
|
|
@ -1198,11 +1164,10 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
/// Converts a BaseItem to a BaseItemInfo
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item">The item.</param>
|
|
|
|
|
/// <param name="mediaSourceId">The media version identifier.</param>
|
|
|
|
|
/// <param name="nowPlayingRuntimeTicks">The now playing runtime ticks.</param>
|
|
|
|
|
/// <param name="runtimeTicks">The now playing runtime ticks.</param>
|
|
|
|
|
/// <returns>BaseItemInfo.</returns>
|
|
|
|
|
/// <exception cref="System.ArgumentNullException">item</exception>
|
|
|
|
|
private BaseItemInfo GetNowPlayingInfo(BaseItem item, string mediaSourceId, long? nowPlayingRuntimeTicks)
|
|
|
|
|
private BaseItemInfo GetItemInfo(BaseItem item, long? runtimeTicks)
|
|
|
|
|
{
|
|
|
|
|
if (item == null)
|
|
|
|
|
{
|
|
|
|
@ -1215,8 +1180,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
Name = item.Name,
|
|
|
|
|
MediaType = item.MediaType,
|
|
|
|
|
Type = item.GetClientTypeName(),
|
|
|
|
|
RunTimeTicks = nowPlayingRuntimeTicks,
|
|
|
|
|
MediaSourceId = mediaSourceId,
|
|
|
|
|
RunTimeTicks = runtimeTicks,
|
|
|
|
|
IndexNumber = item.IndexNumber,
|
|
|
|
|
ParentIndexNumber = item.ParentIndexNumber,
|
|
|
|
|
PremiereDate = item.PremiereDate,
|
|
|
|
@ -1287,7 +1251,7 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
info.Artists.Add(musicVideo.Artist);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var backropItem = item.HasImage(ImageType.Backdrop) ? item : null;
|
|
|
|
|
|
|
|
|
|
var thumbItem = item.HasImage(ImageType.Thumb) ? item : null;
|
|
|
|
@ -1360,5 +1324,22 @@ namespace MediaBrowser.Server.Implementations.Session
|
|
|
|
|
{
|
|
|
|
|
return _dtoService.GetDtoId(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ReportNowViewingItem(string sessionId, string itemId, string context)
|
|
|
|
|
{
|
|
|
|
|
var item = _libraryManager.GetItemById(new Guid(itemId));
|
|
|
|
|
|
|
|
|
|
var info = GetItemInfo(item, item.RunTimeTicks);
|
|
|
|
|
|
|
|
|
|
ReportNowViewingItem(sessionId, info, context);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ReportNowViewingItem(string sessionId, BaseItemInfo item, string context)
|
|
|
|
|
{
|
|
|
|
|
var session = GetSession(sessionId);
|
|
|
|
|
|
|
|
|
|
session.NowViewingItem = item;
|
|
|
|
|
session.NowViewingContext = context;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|