diff options
Diffstat (limited to 'MediaBrowser.Api')
| -rw-r--r-- | MediaBrowser.Api/BasePeriodicWebSocketListener.cs | 327 | ||||
| -rw-r--r-- | MediaBrowser.Api/ChannelService.cs | 10 | ||||
| -rw-r--r-- | MediaBrowser.Api/Devices/DeviceService.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Api/Dlna/DlnaServerService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/Images/ImageService.cs | 30 | ||||
| -rw-r--r-- | MediaBrowser.Api/Images/RemoteImageService.cs | 37 | ||||
| -rw-r--r-- | MediaBrowser.Api/ItemUpdateService.cs | 31 | ||||
| -rw-r--r-- | MediaBrowser.Api/LiveTv/LiveTvService.cs | 31 | ||||
| -rw-r--r-- | MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs | 13 | ||||
| -rw-r--r-- | MediaBrowser.Api/MediaBrowser.Api.csproj | 1 | ||||
| -rw-r--r-- | MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Api/Session/SessionsService.cs | 17 | ||||
| -rw-r--r-- | MediaBrowser.Api/StartupWizardService.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Api/System/ActivityLogWebSocketListener.cs | 1 | ||||
| -rw-r--r-- | MediaBrowser.Api/UserLibrary/ItemsService.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.Api/VideosService.cs | 46 |
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); } } } |
