Merge pull request #2363 from dkanada/view

Add session view endpoint
This commit is contained in:
Anthony Lavado 2020-02-11 23:56:47 -05:00 committed by GitHub
commit 00073c162a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 50 additions and 47 deletions

View File

@ -67,17 +67,17 @@ namespace Emby.Server.Implementations.Session
public event EventHandler<GenericEventArgs<AuthenticationResult>> AuthenticationSucceeded; public event EventHandler<GenericEventArgs<AuthenticationResult>> AuthenticationSucceeded;
/// <summary> /// <summary>
/// Occurs when [playback start]. /// Occurs when playback has started.
/// </summary> /// </summary>
public event EventHandler<PlaybackProgressEventArgs> PlaybackStart; public event EventHandler<PlaybackProgressEventArgs> PlaybackStart;
/// <summary> /// <summary>
/// Occurs when [playback progress]. /// Occurs when playback has progressed.
/// </summary> /// </summary>
public event EventHandler<PlaybackProgressEventArgs> PlaybackProgress; public event EventHandler<PlaybackProgressEventArgs> PlaybackProgress;
/// <summary> /// <summary>
/// Occurs when [playback stopped]. /// Occurs when playback has stopped.
/// </summary> /// </summary>
public event EventHandler<PlaybackStopEventArgs> PlaybackStopped; public event EventHandler<PlaybackStopEventArgs> PlaybackStopped;
@ -690,7 +690,7 @@ namespace Emby.Server.Implementations.Session
} }
/// <summary> /// <summary>
/// Used to report playback progress for an item /// Used to report playback progress for an item.
/// </summary> /// </summary>
/// <returns>Task.</returns> /// <returns>Task.</returns>
public async Task OnPlaybackProgress(PlaybackProgressInfo info, bool isAutomated) public async Task OnPlaybackProgress(PlaybackProgressInfo info, bool isAutomated)
@ -1383,20 +1383,16 @@ namespace Emby.Server.Implementations.Session
user = _userManager.GetUserByName(request.Username); user = _userManager.GetUserByName(request.Username);
} }
if (user != null)
{
// TODO: Move this to userManager?
if (!string.IsNullOrEmpty(request.DeviceId)
&& !_deviceManager.CanAccessDevice(user, request.DeviceId))
{
throw new SecurityException("User is not allowed access from this device.");
}
}
if (user == null) if (user == null)
{ {
AuthenticationFailed?.Invoke(this, new GenericEventArgs<AuthenticationRequest>(request)); AuthenticationFailed?.Invoke(this, new GenericEventArgs<AuthenticationRequest>(request));
throw new SecurityException("Invalid user or password entered."); throw new SecurityException("Invalid username or password entered.");
}
if (!string.IsNullOrEmpty(request.DeviceId)
&& !_deviceManager.CanAccessDevice(user, request.DeviceId))
{
throw new SecurityException("User is not allowed access from this device.");
} }
if (enforcePassword) if (enforcePassword)
@ -1439,14 +1435,13 @@ namespace Emby.Server.Implementations.Session
DeviceId = deviceId, DeviceId = deviceId,
UserId = user.Id, UserId = user.Id,
Limit = 1 Limit = 1
}).Items.FirstOrDefault(); }).Items.FirstOrDefault();
var allExistingForDevice = _authRepo.Get(new AuthenticationInfoQuery var allExistingForDevice = _authRepo.Get(
{ new AuthenticationInfoQuery
DeviceId = deviceId {
DeviceId = deviceId
}).Items; }).Items;
foreach (var auth in allExistingForDevice) foreach (var auth in allExistingForDevice)
{ {
@ -1503,7 +1498,6 @@ namespace Emby.Server.Implementations.Session
{ {
Limit = 1, Limit = 1,
AccessToken = accessToken AccessToken = accessToken
}).Items.FirstOrDefault(); }).Items.FirstOrDefault();
if (existing != null) if (existing != null)
@ -1696,23 +1690,24 @@ namespace Emby.Server.Implementations.Session
throw new ArgumentNullException(nameof(itemId)); throw new ArgumentNullException(nameof(itemId));
} }
//var item = _libraryManager.GetItemById(new Guid(itemId)); var item = _libraryManager.GetItemById(new Guid(itemId));
//var info = GetItemInfo(item, null, null); var info = GetItemInfo(item, null);
//ReportNowViewingItem(sessionId, info); ReportNowViewingItem(sessionId, info);
} }
public void ReportNowViewingItem(string sessionId, BaseItemDto item) public void ReportNowViewingItem(string sessionId, BaseItemDto item)
{ {
//var session = GetSession(sessionId); var session = GetSession(sessionId);
//session.NowViewingItem = item; session.NowViewingItem = item;
} }
public void ReportTranscodingInfo(string deviceId, TranscodingInfo info) public void ReportTranscodingInfo(string deviceId, TranscodingInfo info)
{ {
var session = Sessions.FirstOrDefault(i => string.Equals(i.DeviceId, deviceId)); var session = Sessions.FirstOrDefault(i =>
string.Equals(i.DeviceId, deviceId, StringComparison.OrdinalIgnoreCase));
if (session != null) if (session != null)
{ {
@ -1727,8 +1722,9 @@ namespace Emby.Server.Implementations.Session
public SessionInfo GetSession(string deviceId, string client, string version) public SessionInfo GetSession(string deviceId, string client, string version)
{ {
return Sessions.FirstOrDefault(i => string.Equals(i.DeviceId, deviceId) && return Sessions.FirstOrDefault(i =>
string.Equals(i.Client, client)); string.Equals(i.DeviceId, deviceId, StringComparison.OrdinalIgnoreCase)
&& string.Equals(i.Client, client, StringComparison.OrdinalIgnoreCase));
} }
public SessionInfo GetSessionByAuthenticationToken(AuthenticationInfo info, string deviceId, string remoteEndpoint, string appVersion) public SessionInfo GetSessionByAuthenticationToken(AuthenticationInfo info, string deviceId, string remoteEndpoint, string appVersion)

View File

@ -230,6 +230,17 @@ namespace MediaBrowser.Api.Session
public string Id { get; set; } public string Id { get; set; }
} }
[Route("/Sessions/Viewing", "POST", Summary = "Reports that a session is viewing an item")]
[Authenticated]
public class ReportViewing : IReturnVoid
{
[ApiMember(Name = "SessionId", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
public string SessionId { get; set; }
[ApiMember(Name = "ItemId", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string ItemId { get; set; }
}
[Route("/Sessions/Logout", "POST", Summary = "Reports that a session has ended")] [Route("/Sessions/Logout", "POST", Summary = "Reports that a session has ended")]
[Authenticated] [Authenticated]
public class ReportSessionEnded : IReturnVoid public class ReportSessionEnded : IReturnVoid
@ -276,7 +287,7 @@ namespace MediaBrowser.Api.Session
public class SessionsService : BaseApiService public class SessionsService : BaseApiService
{ {
/// <summary> /// <summary>
/// The _session manager. /// The session manager.
/// </summary> /// </summary>
private readonly ISessionManager _sessionManager; private readonly ISessionManager _sessionManager;
@ -438,14 +449,12 @@ namespace MediaBrowser.Api.Session
public Task Post(SendSystemCommand request) public Task Post(SendSystemCommand request)
{ {
var name = request.Command; var name = request.Command;
if (Enum.TryParse(name, true, out GeneralCommandType commandType)) if (Enum.TryParse(name, true, out GeneralCommandType commandType))
{ {
name = commandType.ToString(); name = commandType.ToString();
} }
var currentSession = GetSession(_sessionContext); var currentSession = GetSession(_sessionContext);
var command = new GeneralCommand var command = new GeneralCommand
{ {
Name = name, Name = name,
@ -518,16 +527,13 @@ namespace MediaBrowser.Api.Session
{ {
request.Id = GetSession(_sessionContext).Id; request.Id = GetSession(_sessionContext).Id;
} }
_sessionManager.ReportCapabilities(request.Id, new ClientCapabilities _sessionManager.ReportCapabilities(request.Id, new ClientCapabilities
{ {
PlayableMediaTypes = SplitValue(request.PlayableMediaTypes, ','), PlayableMediaTypes = SplitValue(request.PlayableMediaTypes, ','),
SupportedCommands = SplitValue(request.SupportedCommands, ','), SupportedCommands = SplitValue(request.SupportedCommands, ','),
SupportsMediaControl = request.SupportsMediaControl, SupportsMediaControl = request.SupportsMediaControl,
SupportsSync = request.SupportsSync, SupportsSync = request.SupportsSync,
SupportsPersistentIdentifier = request.SupportsPersistentIdentifier SupportsPersistentIdentifier = request.SupportsPersistentIdentifier
}); });
} }
@ -538,7 +544,15 @@ namespace MediaBrowser.Api.Session
{ {
request.Id = GetSession(_sessionContext).Id; request.Id = GetSession(_sessionContext).Id;
} }
_sessionManager.ReportCapabilities(request.Id, request); _sessionManager.ReportCapabilities(request.Id, request);
} }
public void Post(ReportViewing request)
{
request.SessionId = GetSession(_sessionContext).Id;
_sessionManager.ReportNowViewingItem(request.SessionId, request.ItemId);
}
} }
} }

View File

@ -103,10 +103,6 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "MediaSourceId", Description = "The id of the MediaSource", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] [ApiMember(Name = "MediaSourceId", Description = "The id of the MediaSource", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")]
public string MediaSourceId { get; set; } public string MediaSourceId { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this <see cref="UpdateUserItemRating" /> is likes.
/// </summary>
/// <value><c>true</c> if likes; otherwise, <c>false</c>.</value>
[ApiMember(Name = "CanSeek", Description = "Indicates if the client can seek", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "POST")] [ApiMember(Name = "CanSeek", Description = "Indicates if the client can seek", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "POST")]
public bool CanSeek { get; set; } public bool CanSeek { get; set; }

View File

@ -240,7 +240,7 @@ namespace MediaBrowser.Api
public class UserService : BaseApiService public class UserService : BaseApiService
{ {
/// <summary> /// <summary>
/// The _user manager /// The user manager.
/// </summary> /// </summary>
private readonly IUserManager _userManager; private readonly IUserManager _userManager;
private readonly ISessionManager _sessionMananger; private readonly ISessionManager _sessionMananger;

View File

@ -107,6 +107,8 @@ namespace MediaBrowser.Controller.Session
public BaseItem FullNowPlayingItem { get; set; } public BaseItem FullNowPlayingItem { get; set; }
public BaseItemDto NowViewingItem { get; set; }
/// <summary> /// <summary>
/// Gets or sets the device id. /// Gets or sets the device id.
/// </summary> /// </summary>
@ -239,11 +241,6 @@ namespace MediaBrowser.Controller.Session
SessionControllers = controllers.ToArray(); SessionControllers = controllers.ToArray();
} }
public bool ContainsUser(string userId)
{
return ContainsUser(new Guid(userId));
}
public bool ContainsUser(Guid userId) public bool ContainsUser(Guid userId)
{ {
if (UserId.Equals(userId)) if (UserId.Equals(userId))