diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-05-18 15:58:42 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-05-18 15:58:42 -0400 |
| commit | 3ccecd3ca3a1640f15ffae70914a8ad0f5a1cb99 (patch) | |
| tree | 737ee22469a54e14e4f4fa497a3216578b2d0983 /MediaBrowser.Server.Implementations | |
| parent | ca5989cb17b324ee481b92ddf3cd1ea47af85cbe (diff) | |
channel fixes
Diffstat (limited to 'MediaBrowser.Server.Implementations')
5 files changed, 119 insertions, 61 deletions
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index cfa642add..538e6a0fd 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -98,7 +98,7 @@ namespace MediaBrowser.Server.Implementations.Channels { all = all.Take(query.Limit.Value).ToList(); } - + // Get everything var fields = Enum.GetNames(typeof(ItemFields)) .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) @@ -156,6 +156,23 @@ namespace MediaBrowser.Server.Implementations.Channels progress.Report(100); } + public Task<IEnumerable<ChannelMediaInfo>> GetChannelItemMediaSources(string id, CancellationToken cancellationToken) + { + var item = (IChannelMediaItem)_libraryManager.GetItemById(id); + + var channelGuid = new Guid(item.ChannelId); + var channel = _channelEntities.First(i => i.Id == channelGuid); + + var requiresCallback = channel as IRequiresMediaInfoCallback; + + if (requiresCallback != null) + { + return requiresCallback.GetChannelItemMediaInfo(item.ExternalId, cancellationToken); + } + + return Task.FromResult<IEnumerable<ChannelMediaInfo>>(item.ChannelMediaSources); + } + private async Task<Channel> GetChannel(IChannel channelInfo, CancellationToken cancellationToken) { var path = Path.Combine(_config.ApplicationPaths.ItemsByNamePath, "channels", _fileSystem.GetValidFilename(channelInfo.Name)); @@ -303,10 +320,16 @@ namespace MediaBrowser.Server.Implementations.Channels var query = new InternalChannelItemQuery { - User = user, - CategoryId = categoryId + User = user }; + if (!string.IsNullOrWhiteSpace(categoryId)) + { + var categoryItem = (IChannelItem)_libraryManager.GetItemById(new Guid(categoryId)); + + query.CategoryId = categoryItem.ExternalId; + } + var result = await channel.GetChannelItems(query, cancellationToken).ConfigureAwait(false); CacheResponse(result, cachePath); @@ -380,7 +403,7 @@ namespace MediaBrowser.Server.Implementations.Channels private string GetIdToHash(string externalId) { // Increment this as needed to force new downloads - return externalId + "4"; + return externalId + "7"; } private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, string internalChannnelId, CancellationToken cancellationToken) @@ -434,10 +457,6 @@ namespace MediaBrowser.Server.Implementations.Channels item.Id = id; item.RunTimeTicks = info.RunTimeTicks; - var mediaSource = info.MediaSources.FirstOrDefault(); - - item.Path = mediaSource == null ? null : mediaSource.Path; - if (isNew) { item.Name = info.Name; @@ -464,12 +483,22 @@ namespace MediaBrowser.Server.Implementations.Channels channelItem.ChannelId = internalChannnelId; channelItem.ChannelItemType = info.Type; + if (isNew) + { + channelItem.Tags = info.Tags; + } + var channelMediaItem = item as IChannelMediaItem; if (channelMediaItem != null) { channelMediaItem.IsInfiniteStream = info.IsInfiniteStream; channelMediaItem.ContentType = info.ContentType; + channelMediaItem.ChannelMediaSources = info.MediaSources; + + var mediaSource = info.MediaSources.FirstOrDefault(); + + item.Path = mediaSource == null ? null : mediaSource.Path; } if (isNew) diff --git a/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs b/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs index 236963b9b..0b0f21e2c 100644 --- a/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs +++ b/MediaBrowser.Server.Implementations/Session/HttpSessionController.cs @@ -1,5 +1,8 @@ -using MediaBrowser.Common.Net; -using MediaBrowser.Controller; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using System.Net; +using MediaBrowser.Common.Net; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Net; @@ -16,23 +19,18 @@ namespace MediaBrowser.Server.Implementations.Session { private readonly IHttpClient _httpClient; private readonly IJsonSerializer _json; - private readonly IServerApplicationHost _appHost; public SessionInfo Session { get; private set; } - //var postUrl = string.Format("http://{0}/mediabrowser/message", session.RemoteEndPoint); - private readonly string _postUrl; - public HttpSessionController(IHttpClient httpClient, - IJsonSerializer json, - IServerApplicationHost appHost, - SessionInfo session, + public HttpSessionController(IHttpClient httpClient, + IJsonSerializer json, + SessionInfo session, string postUrl) { _httpClient = httpClient; _json = json; - _appHost = appHost; Session = session; _postUrl = postUrl; } @@ -63,6 +61,21 @@ namespace MediaBrowser.Server.Implementations.Session }); } + private Task SendMessage(string name, CancellationToken cancellationToken) + { + return SendMessage(name, new NameValueCollection(), cancellationToken); + } + + private Task SendMessage(string name, NameValueCollection args, CancellationToken cancellationToken) + { + return SendMessage(new WebSocketMessage<string> + { + MessageType = name, + Data = string.Empty + + }, cancellationToken); + } + public Task SendSessionEndedNotification(SessionInfoDto sessionInfo, CancellationToken cancellationToken) { return Task.FromResult(true); @@ -80,22 +93,25 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendPlayCommand(PlayRequest command, CancellationToken cancellationToken) { - return SendMessage(new WebSocketMessage<PlayRequest> - { - MessageType = "Play", - Data = command + return Task.FromResult(true); + //return SendMessage(new WebSocketMessage<PlayRequest> + //{ + // MessageType = "Play", + // Data = command - }, cancellationToken); + //}, cancellationToken); } public Task SendPlaystateCommand(PlaystateRequest command, CancellationToken cancellationToken) { - return SendMessage(new WebSocketMessage<PlaystateRequest> + var args = new Dictionary<string, string>(); + + if (command.Command == PlaystateCommand.Seek) { - MessageType = "Playstate", - Data = command - }, cancellationToken); + } + + return SendMessage(command.Command.ToString(), cancellationToken); } public Task SendLibraryUpdateInfo(LibraryUpdateInfo info, CancellationToken cancellationToken) @@ -103,14 +119,9 @@ namespace MediaBrowser.Server.Implementations.Session return Task.FromResult(true); } - public Task SendRestartRequiredNotification(CancellationToken cancellationToken) + public Task SendRestartRequiredNotification(SystemInfo info, CancellationToken cancellationToken) { - return SendMessage(new WebSocketMessage<SystemInfo> - { - MessageType = "RestartRequired", - Data = _appHost.GetSystemInfo() - - }, cancellationToken); + return SendMessage("RestartRequired", cancellationToken); } public Task SendUserDataChangeInfo(UserDataChangeInfo info, CancellationToken cancellationToken) @@ -120,22 +131,12 @@ namespace MediaBrowser.Server.Implementations.Session public Task SendServerShutdownNotification(CancellationToken cancellationToken) { - return SendMessage(new WebSocketMessage<string> - { - MessageType = "ServerShuttingDown", - Data = string.Empty - - }, cancellationToken); + return SendMessage("ServerShuttingDown", cancellationToken); } public Task SendServerRestartNotification(CancellationToken cancellationToken) { - return SendMessage(new WebSocketMessage<string> - { - MessageType = "ServerRestarting", - Data = string.Empty - - }, cancellationToken); + return SendMessage("ServerRestarting", cancellationToken); } public Task SendGeneralCommand(GeneralCommand command, CancellationToken cancellationToken) @@ -147,5 +148,13 @@ namespace MediaBrowser.Server.Implementations.Session }, cancellationToken); } + + private string ToQueryString(Dictionary<string, string> nvc) + { + var array = (from item in nvc + select string.Format("{0}={1}", WebUtility.UrlEncode(item.Key), WebUtility.UrlEncode(item.Value))) + .ToArray(); + return "?" + string.Join("&", array); + } } } diff --git a/MediaBrowser.Server.Implementations/Session/SessionManager.cs b/MediaBrowser.Server.Implementations/Session/SessionManager.cs index cfa7cef67..d78fae87b 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionManager.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionManager.cs @@ -1,6 +1,7 @@ -using System.Globalization; -using MediaBrowser.Common.Events; +using MediaBrowser.Common.Events; using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Dto; @@ -14,10 +15,12 @@ using MediaBrowser.Controller.Session; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Library; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Session; using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -51,6 +54,10 @@ namespace MediaBrowser.Server.Implementations.Session private readonly IImageProcessor _imageProcessor; private readonly IItemRepository _itemRepo; + private readonly IHttpClient _httpClient; + private readonly IJsonSerializer _jsonSerializer; + private readonly IServerApplicationHost _appHost; + /// <summary> /// Gets or sets the configuration manager. /// </summary> @@ -93,7 +100,7 @@ namespace MediaBrowser.Server.Implementations.Session /// <param name="logger">The logger.</param> /// <param name="userRepository">The user repository.</param> /// <param name="libraryManager">The library manager.</param> - public SessionManager(IUserDataManager userDataRepository, IServerConfigurationManager configurationManager, ILogger logger, IUserRepository userRepository, ILibraryManager libraryManager, IUserManager userManager, IMusicManager musicManager, IDtoService dtoService, IImageProcessor imageProcessor, IItemRepository itemRepo) + public SessionManager(IUserDataManager userDataRepository, IServerConfigurationManager configurationManager, ILogger logger, IUserRepository userRepository, ILibraryManager libraryManager, IUserManager userManager, IMusicManager musicManager, IDtoService dtoService, IImageProcessor imageProcessor, IItemRepository itemRepo, IJsonSerializer jsonSerializer, IServerApplicationHost appHost, IHttpClient httpClient) { _userDataRepository = userDataRepository; _configurationManager = configurationManager; @@ -105,6 +112,9 @@ namespace MediaBrowser.Server.Implementations.Session _dtoService = dtoService; _imageProcessor = imageProcessor; _itemRepo = itemRepo; + _jsonSerializer = jsonSerializer; + _appHost = appHost; + _httpClient = httpClient; } /// <summary> @@ -908,11 +918,13 @@ namespace MediaBrowser.Server.Implementations.Session { var sessions = Sessions.Where(i => i.IsActive && i.SessionController != null).ToList(); + var info = _appHost.GetSystemInfo(); + var tasks = sessions.Select(session => Task.Run(async () => { try { - await session.SessionController.SendRestartRequiredNotification(cancellationToken).ConfigureAwait(false); + await session.SessionController.SendRestartRequiredNotification(info, cancellationToken).ConfigureAwait(false); } catch (Exception ex) { @@ -1135,6 +1147,18 @@ namespace MediaBrowser.Server.Implementations.Session session.PlayableMediaTypes = capabilities.PlayableMediaTypes; session.SupportedCommands = capabilities.SupportedCommands; + if (!string.IsNullOrWhiteSpace(capabilities.MessageCallbackUrl)) + { + var postUrl = string.Format("http://{0}{1}", session.RemoteEndPoint, capabilities.MessageCallbackUrl); + + var controller = session.SessionController as HttpSessionController; + + if (controller == null) + { + session.SessionController = new HttpSessionController(_httpClient, _jsonSerializer, session, postUrl); + } + } + EventHelper.FireEventIfNotNull(CapabilitiesChanged, this, new SessionEventArgs { SessionInfo = session diff --git a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs index 1a042ede6..365845f41 100644 --- a/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/MediaBrowser.Server.Implementations/Session/SessionWebSocketListener.cs @@ -35,19 +35,17 @@ namespace MediaBrowser.Server.Implementations.Session /// The _dto service /// </summary> private readonly IJsonSerializer _json; - private readonly IServerApplicationHost _appHost; /// <summary> /// Initializes a new instance of the <see cref="SessionWebSocketListener" /> class. /// </summary> /// <param name="sessionManager">The session manager.</param> /// <param name="logManager">The log manager.</param> - /// <param name="appHost">The application host.</param> - public SessionWebSocketListener(ISessionManager sessionManager, ILogManager logManager, IServerApplicationHost appHost, IJsonSerializer json) + /// <param name="json">The json.</param> + public SessionWebSocketListener(ISessionManager sessionManager, ILogManager logManager, IJsonSerializer json) { _sessionManager = sessionManager; _logger = logManager.GetLogger(GetType().Name); - _appHost = appHost; _json = json; } @@ -138,7 +136,7 @@ namespace MediaBrowser.Server.Implementations.Session if (controller == null) { - controller = new WebSocketController(session, _appHost, _logger, _sessionManager); + controller = new WebSocketController(session, _logger, _sessionManager); } controller.AddWebSocket(message.Connection); diff --git a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs index 05eef611f..5fc28e81b 100644 --- a/MediaBrowser.Server.Implementations/Session/WebSocketController.cs +++ b/MediaBrowser.Server.Implementations/Session/WebSocketController.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Net; -using MediaBrowser.Controller; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; @@ -19,15 +18,13 @@ namespace MediaBrowser.Server.Implementations.Session public SessionInfo Session { get; private set; } public IReadOnlyList<IWebSocketConnection> Sockets { get; private set; } - private readonly IServerApplicationHost _appHost; private readonly ILogger _logger; private readonly ISessionManager _sessionManager; - public WebSocketController(SessionInfo session, IServerApplicationHost appHost, ILogger logger, ISessionManager sessionManager) + public WebSocketController(SessionInfo session, ILogger logger, ISessionManager sessionManager) { Session = session; - _appHost = appHost; _logger = logger; _sessionManager = sessionManager; Sockets = new List<IWebSocketConnection>(); @@ -121,14 +118,15 @@ namespace MediaBrowser.Server.Implementations.Session /// <summary> /// Sends the restart required message. /// </summary> + /// <param name="info">The information.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>Task.</returns> - public Task SendRestartRequiredNotification(CancellationToken cancellationToken) + public Task SendRestartRequiredNotification(SystemInfo info, CancellationToken cancellationToken) { return SendMessages(new WebSocketMessage<SystemInfo> { MessageType = "RestartRequired", - Data = _appHost.GetSystemInfo() + Data = info }, cancellationToken); } |
