aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api')
-rw-r--r--MediaBrowser.Api/BasePeriodicWebSocketListener.cs327
-rw-r--r--MediaBrowser.Api/ChannelService.cs10
-rw-r--r--MediaBrowser.Api/Devices/DeviceService.cs8
-rw-r--r--MediaBrowser.Api/Dlna/DlnaServerService.cs2
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs30
-rw-r--r--MediaBrowser.Api/Images/RemoteImageService.cs37
-rw-r--r--MediaBrowser.Api/ItemUpdateService.cs31
-rw-r--r--MediaBrowser.Api/LiveTv/LiveTvService.cs31
-rw-r--r--MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs13
-rw-r--r--MediaBrowser.Api/MediaBrowser.Api.csproj1
-rw-r--r--MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs1
-rw-r--r--MediaBrowser.Api/Session/SessionsService.cs17
-rw-r--r--MediaBrowser.Api/StartupWizardService.cs1
-rw-r--r--MediaBrowser.Api/System/ActivityLogWebSocketListener.cs1
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs4
-rw-r--r--MediaBrowser.Api/VideosService.cs46
16 files changed, 105 insertions, 455 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/ChannelService.cs b/MediaBrowser.Api/ChannelService.cs
index d64bf7ec7..2e8eb9e07 100644
--- a/MediaBrowser.Api/ChannelService.cs
+++ b/MediaBrowser.Api/ChannelService.cs
@@ -101,7 +101,7 @@ namespace MediaBrowser.Api
[ApiMember(Name = "Fields", Description = "Optional. Specify additional fields of information to return in the output. This allows multiple, comma delimeted. Options: Budget, Chapters, DateCreated, Genres, HomePageUrl, IndexOptions, MediaStreams, Overview, ParentId, Path, People, ProviderIds, PrimaryImageAspectRatio, Revenue, SortName, Studios, Taglines", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string Fields { get; set; }
-
+
/// <summary>
/// Gets the filters.
/// </summary>
@@ -160,7 +160,7 @@ namespace MediaBrowser.Api
[ApiMember(Name = "ChannelIds", Description = "Optional. Specify one or more channel id's, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)]
public string ChannelIds { get; set; }
-
+
/// <summary>
/// Gets the filters.
/// </summary>
@@ -177,7 +177,7 @@ namespace MediaBrowser.Api
return val.Split(',').Select(v => (ItemFilter)Enum.Parse(typeof(ItemFilter), v, true));
}
}
-
+
[Route("/Channels/Folder", "GET", Summary = "Gets the users channel folder, along with configured images")]
public class GetChannelFolder : IReturn<BaseItemDto>
{
@@ -209,9 +209,9 @@ namespace MediaBrowser.Api
return ToOptimizedResult(result);
}
- public async Task<object> Get(GetChannelFolder request)
+ public object Get(GetChannelFolder request)
{
- return ToOptimizedResult(await _channelManager.GetChannelFolder(request.UserId, CancellationToken.None).ConfigureAwait(false));
+ return ToOptimizedResult(_channelManager.GetChannelFolder(request.UserId, CancellationToken.None));
}
public async Task<object> Get(GetChannels request)
diff --git a/MediaBrowser.Api/Devices/DeviceService.cs b/MediaBrowser.Api/Devices/DeviceService.cs
index 012f0ddb2..c375e272a 100644
--- a/MediaBrowser.Api/Devices/DeviceService.cs
+++ b/MediaBrowser.Api/Devices/DeviceService.cs
@@ -85,13 +85,11 @@ namespace MediaBrowser.Api.Devices
public void Post(PostDeviceOptions request)
{
- var task = _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions
+ _deviceManager.UpdateDeviceInfo(request.Id, new DeviceOptions
{
CustomName = request.CustomName,
CameraUploadPath = request.CameraUploadPath
});
-
- Task.WaitAll(task);
}
public object Get(GetDeviceInfo request)
@@ -116,9 +114,7 @@ namespace MediaBrowser.Api.Devices
public void Delete(DeleteDevice request)
{
- var task = _deviceManager.DeleteDevice(request.Id);
-
- Task.WaitAll(task);
+ _deviceManager.DeleteDevice(request.Id);
}
public void Post(PostCameraUpload request)
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/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index f8481517d..2b8ac1a66 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -315,7 +315,7 @@ namespace MediaBrowser.Api.Images
return list;
}
- private ImageInfo GetImageInfo(IHasMetadata item, ItemImageInfo info, int? imageIndex)
+ private ImageInfo GetImageInfo(BaseItem item, ItemImageInfo info, int? imageIndex)
{
try
{
@@ -330,11 +330,17 @@ namespace MediaBrowser.Api.Images
var fileInfo = _fileSystem.GetFileInfo(info.Path);
length = fileInfo.Length;
- var size = _imageProcessor.GetImageSize(info, true);
+ var size = _imageProcessor.GetImageSize(item, info, true, true);
width = Convert.ToInt32(size.Width);
height = Convert.ToInt32(size.Height);
+ if (width <= 0 || height <= 0)
+ {
+ width = null;
+ height = null;
+ }
+
}
}
catch
@@ -471,9 +477,7 @@ namespace MediaBrowser.Api.Images
var item = _userManager.GetUserById(userId);
- var task = item.DeleteImage(request.Type, request.Index ?? 0);
-
- Task.WaitAll(task);
+ item.DeleteImage(request.Type, request.Index ?? 0);
}
/// <summary>
@@ -484,9 +488,7 @@ namespace MediaBrowser.Api.Images
{
var item = _libraryManager.GetItemById(request.Id);
- var task = item.DeleteImage(request.Type, request.Index ?? 0);
-
- Task.WaitAll(task);
+ item.DeleteImage(request.Type, request.Index ?? 0);
}
/// <summary>
@@ -497,9 +499,7 @@ namespace MediaBrowser.Api.Images
{
var item = _libraryManager.GetItemById(request.Id);
- var task = UpdateItemIndex(item, request.Type, request.Index, request.NewIndex);
-
- Task.WaitAll(task);
+ UpdateItemIndex(item, request.Type, request.Index, request.NewIndex);
}
/// <summary>
@@ -510,9 +510,9 @@ namespace MediaBrowser.Api.Images
/// <param name="currentIndex">Index of the current.</param>
/// <param name="newIndex">The new index.</param>
/// <returns>Task.</returns>
- private Task UpdateItemIndex(IHasMetadata item, ImageType type, int currentIndex, int newIndex)
+ private void UpdateItemIndex(IHasMetadata item, ImageType type, int currentIndex, int newIndex)
{
- return item.SwapImages(type, currentIndex, newIndex);
+ item.SwapImages(type, currentIndex, newIndex);
}
/// <summary>
@@ -558,7 +558,7 @@ namespace MediaBrowser.Api.Images
var supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.GetSupportedEnhancers(item, request.Type) : new List<IImageEnhancer>();
- var cropwhitespace = request.Type == ImageType.Logo ||
+ var cropwhitespace = request.Type == ImageType.Logo ||
request.Type == ImageType.Art
|| (request.Type == ImageType.Primary && item is LiveTvChannel);
@@ -733,7 +733,7 @@ namespace MediaBrowser.Api.Images
await _providerManager.SaveImage(entity, memoryStream, mimeType, imageType, null, CancellationToken.None).ConfigureAwait(false);
- await entity.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false);
+ entity.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None);
}
}
}
diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs
index 3512a526b..4782d76df 100644
--- a/MediaBrowser.Api/Images/RemoteImageService.cs
+++ b/MediaBrowser.Api/Images/RemoteImageService.cs
@@ -84,7 +84,7 @@ namespace MediaBrowser.Api.Images
}
[Route("/Items/{Id}/RemoteImages/Download", "POST", Summary = "Downloads a remote image for an item")]
- [Authenticated(Roles="Admin")]
+ [Authenticated(Roles = "Admin")]
public class DownloadRemoteImage : BaseDownloadRemoteImage
{
/// <summary>
@@ -207,7 +207,7 @@ namespace MediaBrowser.Api.Images
{
await _providerManager.SaveImage(item, request.ImageUrl, request.Type, null, CancellationToken.None).ConfigureAwait(false);
- await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false);
+ item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None);
}
/// <summary>
@@ -232,9 +232,9 @@ namespace MediaBrowser.Api.Images
contentPath = _fileSystem.ReadAllText(pointerCachePath);
if (_fileSystem.FileExists(contentPath))
- {
- return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false);
- }
+ {
+ return await ResultFactory.GetStaticFileResult(Request, contentPath).ConfigureAwait(false);
+ }
}
catch (FileNotFoundException)
{
@@ -262,28 +262,29 @@ namespace MediaBrowser.Api.Images
/// <returns>Task.</returns>
private async Task DownloadImage(string url, Guid urlHash, string pointerCachePath)
{
- var result = await _httpClient.GetResponse(new HttpRequestOptions
+ using (var result = await _httpClient.GetResponse(new HttpRequestOptions
{
Url = url,
BufferContent = false
- }).ConfigureAwait(false);
-
- var ext = result.ContentType.Split('/').Last();
+ }).ConfigureAwait(false))
+ {
+ var ext = result.ContentType.Split('/').Last();
- var fullCachePath = GetFullCachePath(urlHash + "." + ext);
+ var fullCachePath = GetFullCachePath(urlHash + "." + ext);
- _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath));
- using (var stream = result.Content)
- {
- using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
+ _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath));
+ using (var stream = result.Content)
{
- await stream.CopyToAsync(filestream).ConfigureAwait(false);
+ using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true))
+ {
+ await stream.CopyToAsync(filestream).ConfigureAwait(false);
+ }
}
- }
- _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath));
- _fileSystem.WriteAllText(pointerCachePath, fullCachePath);
+ _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath));
+ _fileSystem.WriteAllText(pointerCachePath, fullCachePath);
+ }
}
/// <summary>
diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs
index 53a67ff71..a55741d7d 100644
--- a/MediaBrowser.Api/ItemUpdateService.cs
+++ b/MediaBrowser.Api/ItemUpdateService.cs
@@ -124,24 +124,24 @@ namespace MediaBrowser.Api
{
list.Add(new NameValuePair
{
- Name = "FolderTypeInherit",
+ Name = "Inherit",
Value = ""
});
}
list.Add(new NameValuePair
{
- Name = "FolderTypeMovies",
+ Name = "Movies",
Value = "movies"
});
list.Add(new NameValuePair
{
- Name = "FolderTypeMusic",
+ Name = "Music",
Value = "music"
});
list.Add(new NameValuePair
{
- Name = "FolderTypeTvShows",
+ Name = "Shows",
Value = "tvshows"
});
@@ -149,29 +149,29 @@ namespace MediaBrowser.Api
{
list.Add(new NameValuePair
{
- Name = "FolderTypeBooks",
+ Name = "Books",
Value = "books"
});
list.Add(new NameValuePair
{
- Name = "FolderTypeGames",
+ Name = "Games",
Value = "games"
});
}
list.Add(new NameValuePair
{
- Name = "FolderTypeHomeVideos",
+ Name = "HomeVideos",
Value = "homevideos"
});
list.Add(new NameValuePair
{
- Name = "FolderTypeMusicVideos",
+ Name = "MusicVideos",
Value = "musicvideos"
});
list.Add(new NameValuePair
{
- Name = "FolderTypePhotos",
+ Name = "Photos",
Value = "photos"
});
@@ -179,7 +179,7 @@ namespace MediaBrowser.Api
{
list.Add(new NameValuePair
{
- Name = "FolderTypeMixed",
+ Name = "MixedContent",
Value = ""
});
}
@@ -194,13 +194,6 @@ namespace MediaBrowser.Api
public void Post(UpdateItem request)
{
- var task = UpdateItem(request);
-
- Task.WaitAll(task);
- }
-
- private async Task UpdateItem(UpdateItem request)
- {
var item = _libraryManager.GetItemById(request.ItemId);
var newLockData = request.LockData ?? false;
@@ -216,7 +209,7 @@ namespace MediaBrowser.Api
item.OnMetadataChanged();
- await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None);
if (isLockedChanged && item.IsFolder)
{
@@ -225,7 +218,7 @@ namespace MediaBrowser.Api
foreach (var child in folder.GetRecursiveChildren())
{
child.IsLocked = newLockData;
- await child.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ child.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None);
}
}
}
diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs
index 36bcee913..703c96e0c 100644
--- a/MediaBrowser.Api/LiveTv/LiveTvService.cs
+++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs
@@ -734,7 +734,7 @@ namespace MediaBrowser.Api.LiveTv
outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType(path);
- return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, Logger, _environment, CancellationToken.None)
+ return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, Logger, _environment)
{
AllowEndOfFile = false
};
@@ -753,7 +753,7 @@ namespace MediaBrowser.Api.LiveTv
outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType("file." + request.Container);
- return new ProgressiveFileCopier(directStreamProvider, outputHeaders, Logger, _environment, CancellationToken.None)
+ return new ProgressiveFileCopier(directStreamProvider, outputHeaders, Logger, _environment)
{
AllowEndOfFile = false
};
@@ -892,11 +892,11 @@ namespace MediaBrowser.Api.LiveTv
return ToOptimizedSerializedResultUsingCache(info);
}
- public async Task<object> Get(GetChannels request)
+ public object Get(GetChannels request)
{
var options = GetDtoOptions(_authContext, request);
- var channelResult = await _liveTvManager.GetInternalChannels(new LiveTvChannelQuery
+ var channelResult = _liveTvManager.GetInternalChannels(new LiveTvChannelQuery
{
ChannelType = request.Type,
UserId = request.UserId,
@@ -915,7 +915,7 @@ namespace MediaBrowser.Api.LiveTv
SortOrder = request.SortOrder ?? SortOrder.Ascending,
AddCurrentProgram = request.AddCurrentProgram
- }, options, CancellationToken.None).ConfigureAwait(false);
+ }, options, CancellationToken.None);
var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(request.UserId);
@@ -947,9 +947,9 @@ namespace MediaBrowser.Api.LiveTv
public object Get(GetChannel request)
{
- var user = string.IsNullOrWhiteSpace(request.UserId) ? null : _userManager.GetUserById(request.UserId);
+ var user = _userManager.GetUserById(request.UserId);
- var item = _libraryManager.GetItemById(request.Id);
+ var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id);
var dtoOptions = GetDtoOptions(_authContext, request);
@@ -958,9 +958,9 @@ namespace MediaBrowser.Api.LiveTv
return ToOptimizedSerializedResultUsingCache(result);
}
- public async Task<object> Get(GetLiveTvFolder request)
+ public object Get(GetLiveTvFolder request)
{
- return ToOptimizedResult(await _liveTvManager.GetLiveTvFolder(request.UserId, CancellationToken.None).ConfigureAwait(false));
+ return ToOptimizedResult(_liveTvManager.GetLiveTvFolder(request.UserId, CancellationToken.None));
}
public async Task<object> Get(GetPrograms request)
@@ -1020,7 +1020,7 @@ namespace MediaBrowser.Api.LiveTv
return ToOptimizedResult(result);
}
- public async Task<object> Get(GetRecommendedPrograms request)
+ public object Get(GetRecommendedPrograms request)
{
var query = new RecommendedProgramQuery
{
@@ -1036,7 +1036,7 @@ namespace MediaBrowser.Api.LiveTv
EnableTotalRecordCount = request.EnableTotalRecordCount
};
- var result = await _liveTvManager.GetRecommendedPrograms(query, GetDtoOptions(_authContext, request), CancellationToken.None).ConfigureAwait(false);
+ var result = _liveTvManager.GetRecommendedPrograms(query, GetDtoOptions(_authContext, request), CancellationToken.None);
return ToOptimizedResult(result);
}
@@ -1098,12 +1098,13 @@ namespace MediaBrowser.Api.LiveTv
public async Task<object> Get(GetRecording request)
{
- var user = string.IsNullOrEmpty(request.UserId) ? null : _userManager.GetUserById(request.UserId);
+ var user = _userManager.GetUserById(request.UserId);
- var options = new DtoOptions();
- options.DeviceId = _authContext.GetAuthorizationInfo(Request).DeviceId;
+ var item = string.IsNullOrEmpty(request.Id) ? user.RootFolder : _libraryManager.GetItemById(request.Id);
- var result = await _liveTvManager.GetRecording(request.Id, options, CancellationToken.None, user).ConfigureAwait(false);
+ var dtoOptions = GetDtoOptions(_authContext, request);
+
+ var result = _dtoService.GetBaseItemDto(item, dtoOptions, user);
return ToOptimizedSerializedResultUsingCache(result);
}
diff --git a/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs b/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs
index 9ce109fc4..74293ccd9 100644
--- a/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs
+++ b/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs
@@ -16,7 +16,6 @@ namespace MediaBrowser.Api.LiveTv
private readonly IFileSystem _fileSystem;
private readonly ILogger _logger;
private readonly string _path;
- private readonly CancellationToken _cancellationToken;
private readonly Dictionary<string, string> _outputHeaders;
const int StreamCopyToBufferSize = 81920;
@@ -28,22 +27,20 @@ namespace MediaBrowser.Api.LiveTv
private readonly IDirectStreamProvider _directStreamProvider;
private readonly IEnvironmentInfo _environment;
- public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary<string, string> outputHeaders, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken)
+ public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary<string, string> outputHeaders, ILogger logger, IEnvironmentInfo environment)
{
_fileSystem = fileSystem;
_path = path;
_outputHeaders = outputHeaders;
_logger = logger;
- _cancellationToken = cancellationToken;
_environment = environment;
}
- public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary<string, string> outputHeaders, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken)
+ public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary<string, string> outputHeaders, ILogger logger, IEnvironmentInfo environment)
{
_directStreamProvider = directStreamProvider;
_outputHeaders = outputHeaders;
_logger = logger;
- _cancellationToken = cancellationToken;
_environment = environment;
}
@@ -69,8 +66,6 @@ namespace MediaBrowser.Api.LiveTv
public async Task WriteToAsync(Stream outputStream, CancellationToken cancellationToken)
{
- cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _cancellationToken).Token;
-
if (_directStreamProvider != null)
{
await _directStreamProvider.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false);
@@ -89,7 +84,9 @@ namespace MediaBrowser.Api.LiveTv
inputStream.Position = StartPosition;
}
- while (eofCount < 20 || !AllowEndOfFile)
+ var emptyReadLimit = AllowEndOfFile ? 20 : 100;
+
+ while (eofCount < emptyReadLimit)
{
int bytesRead;
if (allowAsyncFileRead)
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/Session/SessionsService.cs b/MediaBrowser.Api/Session/SessionsService.cs
index 8f54b591e..e961f9d51 100644
--- a/MediaBrowser.Api/Session/SessionsService.cs
+++ b/MediaBrowser.Api/Session/SessionsService.cs
@@ -10,6 +10,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.Services;
+using MediaBrowser.Controller;
namespace MediaBrowser.Api.Session
{
@@ -293,15 +294,9 @@ namespace MediaBrowser.Api.Session
private readonly IAuthenticationRepository _authRepo;
private readonly IDeviceManager _deviceManager;
private readonly ISessionContext _sessionContext;
+ private IServerApplicationHost _appHost;
- /// <summary>
- /// Initializes a new instance of the <see cref="SessionsService" /> class.
- /// </summary>
- /// <param name="sessionManager">The session manager.</param>
- /// <param name="userManager">The user manager.</param>
- /// <param name="authContext">The authentication context.</param>
- /// <param name="authRepo">The authentication repo.</param>
- public SessionsService(ISessionManager sessionManager, IUserManager userManager, IAuthorizationContext authContext, IAuthenticationRepository authRepo, IDeviceManager deviceManager, ISessionContext sessionContext)
+ public SessionsService(ISessionManager sessionManager, IServerApplicationHost appHost, IUserManager userManager, IAuthorizationContext authContext, IAuthenticationRepository authRepo, IDeviceManager deviceManager, ISessionContext sessionContext)
{
_sessionManager = sessionManager;
_userManager = userManager;
@@ -309,6 +304,7 @@ namespace MediaBrowser.Api.Session
_authRepo = authRepo;
_deviceManager = deviceManager;
_sessionContext = sessionContext;
+ _appHost = appHost;
}
public void Delete(RevokeKey request)
@@ -324,7 +320,10 @@ namespace MediaBrowser.Api.Session
AppName = request.App,
IsActive = true,
AccessToken = Guid.NewGuid().ToString("N"),
- DateCreated = DateTime.UtcNow
+ DateCreated = DateTime.UtcNow,
+ DeviceId = _appHost.SystemId,
+ DeviceName = _appHost.FriendlyName,
+ AppVersion = _appHost.ApplicationVersion.ToString()
}, CancellationToken.None);
}
diff --git a/MediaBrowser.Api/StartupWizardService.cs b/MediaBrowser.Api/StartupWizardService.cs
index 22f1f3b62..52a5e444f 100644
--- a/MediaBrowser.Api/StartupWizardService.cs
+++ b/MediaBrowser.Api/StartupWizardService.cs
@@ -95,6 +95,7 @@ namespace MediaBrowser.Api
config.EnableSimpleArtistDetection = true;
config.EnableNormalizedItemByNameIds = true;
config.DisableLiveTvChannelUserDataName = true;
+ config.EnableNewOmdbSupport = true;
}
public void Post(UpdateStartupConfiguration request)
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);
diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs
index 3bd0497f7..3f840dbfa 100644
--- a/MediaBrowser.Api/VideosService.cs
+++ b/MediaBrowser.Api/VideosService.cs
@@ -110,35 +110,21 @@ namespace MediaBrowser.Api
public void Delete(DeleteAlternateSources request)
{
- var task = DeleteAsync(request);
-
- Task.WaitAll(task);
- }
-
- public async Task DeleteAsync(DeleteAlternateSources request)
- {
var video = (Video)_libraryManager.GetItemById(request.Id);
foreach (var link in video.GetLinkedAlternateVersions())
{
link.PrimaryVersionId = null;
- await link.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ link.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None);
}
video.LinkedAlternateVersions = Video.EmptyLinkedChildArray;
- await video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ video.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None);
}
public void Post(MergeVersions request)
{
- var task = PostAsync(request);
-
- Task.WaitAll(task);
- }
-
- public async Task PostAsync(MergeVersions request)
- {
var items = request.Ids.Split(',')
.Select(i => _libraryManager.GetItemById(i))
.OfType<Video>()
@@ -162,19 +148,19 @@ namespace MediaBrowser.Api
if (primaryVersion == null)
{
primaryVersion = items.OrderBy(i =>
- {
- if (i.Video3DFormat.HasValue)
{
- return 1;
- }
-
- if (i.VideoType != Model.Entities.VideoType.VideoFile)
- {
- return 1;
- }
-
- return 0;
- })
+ if (i.Video3DFormat.HasValue)
+ {
+ return 1;
+ }
+
+ if (i.VideoType != Model.Entities.VideoType.VideoFile)
+ {
+ return 1;
+ }
+
+ return 0;
+ })
.ThenByDescending(i =>
{
var stream = i.GetDefaultVideoStream();
@@ -190,7 +176,7 @@ namespace MediaBrowser.Api
{
item.PrimaryVersionId = primaryVersion.Id.ToString("N");
- await item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ item.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None);
list.Add(new LinkedChild
{
@@ -201,7 +187,7 @@ namespace MediaBrowser.Api
primaryVersion.LinkedAlternateVersions = list.ToArray();
- await primaryVersion.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false);
+ primaryVersion.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None);
}
}
}