diff options
Diffstat (limited to 'MediaBrowser.Api/SessionsService.cs')
| -rw-r--r-- | MediaBrowser.Api/SessionsService.cs | 64 |
1 files changed, 59 insertions, 5 deletions
diff --git a/MediaBrowser.Api/SessionsService.cs b/MediaBrowser.Api/SessionsService.cs index 590fd6f06..271e5bbd6 100644 --- a/MediaBrowser.Api/SessionsService.cs +++ b/MediaBrowser.Api/SessionsService.cs @@ -1,9 +1,13 @@ -using MediaBrowser.Controller.Dto; +using MediaBrowser.Common.Extensions; +using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Session; +using MediaBrowser.Model.Net; using MediaBrowser.Model.Session; using ServiceStack.ServiceHost; +using System; using System.Collections.Generic; using System.Linq; +using System.Threading; namespace MediaBrowser.Api { @@ -14,11 +18,39 @@ namespace MediaBrowser.Api [Api(("Gets a list of sessions"))] public class GetSessions : IReturn<List<SessionInfoDto>> { + [ApiMember(Name = "SupportsRemoteControl", Description = "Optional. Filter by sessions that can be remote controlled.", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "GET")] + public bool? SupportsRemoteControl { get; set; } + } + + [Route("/Sessions/{Id}/Viewing", "POST")] + [Api(("Instructs a session to browse to an item or view"))] + public class BrowseTo : IReturnVoid + { + [ApiMember(Name = "Id", Description = "Session Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "POST")] + public Guid Id { get; set; } + /// <summary> - /// Gets or sets a value indicating whether this instance is recent. + /// Artist, Genre, Studio, Person, or any kind of BaseItem /// </summary> - /// <value><c>true</c> if this instance is recent; otherwise, <c>false</c>.</value> - public bool IsRecent { get; set; } + /// <value>The type of the item.</value> + [ApiMember(Name = "ItemType", Description = "Only required if the item is an Artist, Genre, Studio, or Person.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + public string ItemType { get; set; } + + /// <summary> + /// Artist name, genre name, item Id, etc + /// </summary> + /// <value>The item identifier.</value> + [ApiMember(Name = "ItemIdentifier", Description = "The Id of the item, unless it is an Artist, Genre, Studio, or Person, in which case it should be the name.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "POST")] + public string ItemIdentifier { get; set; } + + /// <summary> + /// Gets or sets the context (Movies, Music, TvShows, etc) + /// Applicable to genres, studios and persons only because the context of items and artists can be inferred. + /// This is optional to supply and clients are free to ignore it. + /// </summary> + /// <value>The context.</value> + [ApiMember(Name = "Context", Description = "The navigation context for the client (movies, music, tvshows, games etc). This is optional to supply and clients are free to ignore it.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")] + public string Context { get; set; } } /// <summary> @@ -47,9 +79,31 @@ namespace MediaBrowser.Api /// <returns>System.Object.</returns> public object Get(GetSessions request) { - var result = request.IsRecent ? _sessionManager.RecentConnections : _sessionManager.AllConnections; + var result = _sessionManager.Sessions.Where(i => i.IsActive); + + if (request.SupportsRemoteControl.HasValue) + { + result = result.Where(i => i.IsActive == request.SupportsRemoteControl.Value); + } return ToOptimizedResult(result.Select(SessionInfoDtoBuilder.GetSessionInfoDto).ToList()); } + + public void Post(BrowseTo request) + { + var session = _sessionManager.Sessions.FirstOrDefault(i => i.Id == request.Id); + + if (session == null) + { + throw new ResourceNotFoundException(string.Format("Session {0} not found.", request.Id)); + } + + session.WebSocket.SendAsync(new WebSocketMessage<BrowseTo> + { + MessageType = "Browse", + Data = request + + }, CancellationToken.None); + } } } |
