aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2017-10-04 14:51:26 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2017-10-04 14:51:26 -0400
commit983b51e0830ece26c1bd8445359fda14f0f99925 (patch)
treeee7db0ab4d28771a719402d65c86c16a931d0c96 /MediaBrowser.Api
parenta5b82cd2ec9b03e949ab79791dc6c0469390c085 (diff)
reduce socket activity
Diffstat (limited to 'MediaBrowser.Api')
-rw-r--r--MediaBrowser.Api/BasePeriodicWebSocketListener.cs327
-rw-r--r--MediaBrowser.Api/Dlna/DlnaServerService.cs2
-rw-r--r--MediaBrowser.Api/MediaBrowser.Api.csproj1
-rw-r--r--MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs1
-rw-r--r--MediaBrowser.Api/System/ActivityLogWebSocketListener.cs1
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs4
6 files changed, 6 insertions, 330 deletions
diff --git a/MediaBrowser.Api/BasePeriodicWebSocketListener.cs b/MediaBrowser.Api/BasePeriodicWebSocketListener.cs
deleted file mode 100644
index c7a9d97ba..000000000
--- a/MediaBrowser.Api/BasePeriodicWebSocketListener.cs
+++ /dev/null
@@ -1,327 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Controller.Net;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Net;
-using MediaBrowser.Model.Threading;
-
-namespace MediaBrowser.Api
-{
- /// <summary>
- /// Starts sending data over a web socket periodically when a message is received, and then stops when a corresponding stop message is received
- /// </summary>
- /// <typeparam name="TReturnDataType">The type of the T return data type.</typeparam>
- /// <typeparam name="TStateType">The type of the T state type.</typeparam>
- public abstract class BasePeriodicWebSocketListener<TReturnDataType, TStateType> : IWebSocketListener, IDisposable
- where TStateType : WebSocketListenerState, new()
- where TReturnDataType : class
- {
- /// <summary>
- /// The _active connections
- /// </summary>
- protected readonly List<Tuple<IWebSocketConnection, CancellationTokenSource, ITimer, TStateType>> ActiveConnections =
- new List<Tuple<IWebSocketConnection, CancellationTokenSource, ITimer, TStateType>>();
-
- /// <summary>
- /// Gets the name.
- /// </summary>
- /// <value>The name.</value>
- protected abstract string Name { get; }
-
- /// <summary>
- /// Gets the data to send.
- /// </summary>
- /// <param name="state">The state.</param>
- /// <returns>Task{`1}.</returns>
- protected abstract Task<TReturnDataType> GetDataToSend(TStateType state);
-
- /// <summary>
- /// The logger
- /// </summary>
- protected ILogger Logger;
-
- protected ITimerFactory TimerFactory { get; private set; }
-
- protected BasePeriodicWebSocketListener(ILogger logger, ITimerFactory timerFactory)
- {
- if (logger == null)
- {
- throw new ArgumentNullException("logger");
- }
-
- Logger = logger;
- TimerFactory = timerFactory;
- }
-
- /// <summary>
- /// The null task result
- /// </summary>
- protected Task NullTaskResult = Task.FromResult(true);
-
- /// <summary>
- /// Processes the message.
- /// </summary>
- /// <param name="message">The message.</param>
- /// <returns>Task.</returns>
- public Task ProcessMessage(WebSocketMessageInfo message)
- {
- if (message == null)
- {
- throw new ArgumentNullException("message");
- }
-
- if (string.Equals(message.MessageType, Name + "Start", StringComparison.OrdinalIgnoreCase))
- {
- Start(message);
- }
-
- if (string.Equals(message.MessageType, Name + "Stop", StringComparison.OrdinalIgnoreCase))
- {
- Stop(message);
- }
-
- return NullTaskResult;
- }
-
- protected readonly CultureInfo UsCulture = new CultureInfo("en-US");
-
- protected virtual bool SendOnTimer
- {
- get
- {
- return true;
- }
- }
-
- protected virtual void ParseMessageParams(string[] values)
- {
-
- }
-
- /// <summary>
- /// Starts sending messages over a web socket
- /// </summary>
- /// <param name="message">The message.</param>
- private void Start(WebSocketMessageInfo message)
- {
- var vals = message.Data.Split(',');
-
- var dueTimeMs = long.Parse(vals[0], UsCulture);
- var periodMs = long.Parse(vals[1], UsCulture);
-
- if (vals.Length > 2)
- {
- ParseMessageParams(vals.Skip(2).ToArray());
- }
-
- var cancellationTokenSource = new CancellationTokenSource();
-
- Logger.Debug("{1} Begin transmitting over websocket to {0}", message.Connection.RemoteEndPoint, GetType().Name);
-
- var timer = SendOnTimer ?
- TimerFactory.Create(TimerCallback, message.Connection, Timeout.Infinite, Timeout.Infinite) :
- null;
-
- var state = new TStateType
- {
- IntervalMs = periodMs,
- InitialDelayMs = dueTimeMs
- };
-
- lock (ActiveConnections)
- {
- ActiveConnections.Add(new Tuple<IWebSocketConnection, CancellationTokenSource, ITimer, TStateType>(message.Connection, cancellationTokenSource, timer, state));
- }
-
- if (timer != null)
- {
- timer.Change(TimeSpan.FromMilliseconds(dueTimeMs), TimeSpan.FromMilliseconds(periodMs));
- }
- }
-
- /// <summary>
- /// Timers the callback.
- /// </summary>
- /// <param name="state">The state.</param>
- private void TimerCallback(object state)
- {
- var connection = (IWebSocketConnection)state;
-
- Tuple<IWebSocketConnection, CancellationTokenSource, ITimer, TStateType> tuple;
-
- lock (ActiveConnections)
- {
- tuple = ActiveConnections.FirstOrDefault(c => c.Item1 == connection);
- }
-
- if (tuple == null)
- {
- return;
- }
-
- if (connection.State != WebSocketState.Open || tuple.Item2.IsCancellationRequested)
- {
- DisposeConnection(tuple);
- return;
- }
-
- SendData(tuple);
- }
-
- protected void SendData(bool force)
- {
- List<Tuple<IWebSocketConnection, CancellationTokenSource, ITimer, TStateType>> tuples;
-
- lock (ActiveConnections)
- {
- tuples = ActiveConnections
- .Where(c =>
- {
- if (c.Item1.State == WebSocketState.Open && !c.Item2.IsCancellationRequested)
- {
- var state = c.Item4;
-
- if (force || (DateTime.UtcNow - state.DateLastSendUtc).TotalMilliseconds >= state.IntervalMs)
- {
- return true;
- }
- }
-
- return false;
- })
- .ToList();
- }
-
- foreach (var tuple in tuples)
- {
- SendData(tuple);
- }
- }
-
- private async void SendData(Tuple<IWebSocketConnection, CancellationTokenSource, ITimer, TStateType> tuple)
- {
- var connection = tuple.Item1;
-
- try
- {
- var state = tuple.Item4;
-
- var data = await GetDataToSend(state).ConfigureAwait(false);
-
- if (data != null)
- {
- await connection.SendAsync(new WebSocketMessage<TReturnDataType>
- {
- MessageType = Name,
- Data = data
-
- }, tuple.Item2.Token).ConfigureAwait(false);
-
- state.DateLastSendUtc = DateTime.UtcNow;
- }
- }
- catch (OperationCanceledException)
- {
- if (tuple.Item2.IsCancellationRequested)
- {
- DisposeConnection(tuple);
- }
- }
- catch (Exception ex)
- {
- Logger.ErrorException("Error sending web socket message {0}", ex, Name);
- DisposeConnection(tuple);
- }
- }
-
- /// <summary>
- /// Stops sending messages over a web socket
- /// </summary>
- /// <param name="message">The message.</param>
- private void Stop(WebSocketMessageInfo message)
- {
- lock (ActiveConnections)
- {
- var connection = ActiveConnections.FirstOrDefault(c => c.Item1 == message.Connection);
-
- if (connection != null)
- {
- DisposeConnection(connection);
- }
- }
- }
-
- /// <summary>
- /// Disposes the connection.
- /// </summary>
- /// <param name="connection">The connection.</param>
- private void DisposeConnection(Tuple<IWebSocketConnection, CancellationTokenSource, ITimer, TStateType> connection)
- {
- Logger.Debug("{1} stop transmitting over websocket to {0}", connection.Item1.RemoteEndPoint, GetType().Name);
-
- var timer = connection.Item3;
-
- if (timer != null)
- {
- try
- {
- timer.Dispose();
- }
- catch (ObjectDisposedException)
- {
-
- }
- }
-
- try
- {
- connection.Item2.Cancel();
- connection.Item2.Dispose();
- }
- catch (ObjectDisposedException)
- {
-
- }
-
- ActiveConnections.Remove(connection);
- }
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- if (dispose)
- {
- lock (ActiveConnections)
- {
- foreach (var connection in ActiveConnections.ToList())
- {
- DisposeConnection(connection);
- }
- }
- }
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
- }
-
- public class WebSocketListenerState
- {
- public DateTime DateLastSendUtc { get; set; }
- public long InitialDelayMs { get; set; }
- public long IntervalMs { get; set; }
- }
-}
diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs
index cbef6e5b3..6a0cea4df 100644
--- a/MediaBrowser.Api/Dlna/DlnaServerService.cs
+++ b/MediaBrowser.Api/Dlna/DlnaServerService.cs
@@ -246,7 +246,7 @@ namespace MediaBrowser.Api.Dlna
if (string.IsNullOrEmpty(notificationType))
{
- return GetSubscriptionResponse(eventManager.RenewEventSubscription(subscriptionId, timeoutString));
+ return GetSubscriptionResponse(eventManager.RenewEventSubscription(subscriptionId, notificationType, timeoutString, callback));
}
return GetSubscriptionResponse(eventManager.CreateEventSubscription(notificationType, timeoutString, callback));
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index ddb187f3d..650306ea6 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -40,7 +40,6 @@
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
- <Compile Include="BasePeriodicWebSocketListener.cs" />
<Compile Include="BrandingService.cs" />
<Compile Include="ChannelService.cs" />
<Compile Include="Devices\DeviceService.cs" />
diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
index ee74ec450..69ce6a385 100644
--- a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
+++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
@@ -4,6 +4,7 @@ using MediaBrowser.Model.Tasks;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Threading;
namespace MediaBrowser.Api.ScheduledTasks
diff --git a/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs b/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs
index c641695dd..793f74571 100644
--- a/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs
+++ b/MediaBrowser.Api/System/ActivityLogWebSocketListener.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
using System.Collections.Generic;
using System.Threading.Tasks;
+using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Threading;
namespace MediaBrowser.Api.System
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 5fe386f1a..1e531ba66 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -117,7 +117,9 @@ namespace MediaBrowser.Api.UserLibrary
IsVirtualItem = false,
CollapseBoxSetItems = false,
EnableTotalRecordCount = request.EnableTotalRecordCount,
- AncestorIds = ancestorIds.ToArray()
+ AncestorIds = ancestorIds.ToArray(),
+ IncludeItemTypes = request.GetIncludeItemTypes(),
+ ExcludeItemTypes = request.GetExcludeItemTypes()
});
var returnItems = _dtoService.GetBaseItemDtos(itemsResult.Items, options, user);