diff --git a/Emby.Dlna/Eventing/EventManager.cs b/Emby.Dlna/Eventing/EventManager.cs index 0516585ae0..99ba74f327 100644 --- a/Emby.Dlna/Eventing/EventManager.cs +++ b/Emby.Dlna/Eventing/EventManager.cs @@ -26,9 +26,11 @@ namespace Emby.Dlna.Eventing _logger = logger; } - public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string requestedTimeoutString) + public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string requestedTimeoutString, string callbackUrl) { - var subscription = GetSubscription(subscriptionId, true); + var subscription = GetSubscription(subscriptionId, false); + + int timeoutSeconds; // Remove logging for now because some devices are sending this very frequently // TODO re-enable with dlna debug logging setting @@ -37,10 +39,18 @@ namespace Emby.Dlna.Eventing // timeout, // subscription.CallbackUrl); - subscription.TimeoutSeconds = ParseTimeout(requestedTimeoutString) ?? 300; - subscription.SubscriptionTime = DateTime.UtcNow; + if (subscription != null) + { + subscription.TimeoutSeconds = ParseTimeout(requestedTimeoutString) ?? 300; + timeoutSeconds = subscription.TimeoutSeconds; + subscription.SubscriptionTime = DateTime.UtcNow; + } + else + { + timeoutSeconds = 300; + } - return GetEventSubscriptionResponse(subscriptionId, requestedTimeoutString, subscription.TimeoutSeconds); + return GetEventSubscriptionResponse(subscriptionId, requestedTimeoutString, timeoutSeconds); } public EventSubscriptionResponse CreateEventSubscription(string notificationType, string requestedTimeoutString, string callbackUrl) diff --git a/Emby.Dlna/Service/BaseService.cs b/Emby.Dlna/Service/BaseService.cs index ddc37da095..bc7f01d974 100644 --- a/Emby.Dlna/Service/BaseService.cs +++ b/Emby.Dlna/Service/BaseService.cs @@ -24,9 +24,9 @@ namespace Emby.Dlna.Service return EventManager.CancelEventSubscription(subscriptionId); } - public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string timeoutString) + public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string timeoutString, string callbackUrl) { - return EventManager.RenewEventSubscription(subscriptionId, timeoutString); + return EventManager.RenewEventSubscription(subscriptionId, notificationType, timeoutString, callbackUrl); } public EventSubscriptionResponse CreateEventSubscription(string notificationType, string timeoutString, string callbackUrl) diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs index d3950929d4..0036d19708 100644 --- a/Emby.Server.Implementations/Channels/ChannelManager.cs +++ b/Emby.Server.Implementations/Channels/ChannelManager.cs @@ -373,7 +373,7 @@ namespace Emby.Server.Implementations.Channels private async Task GetChannel(IChannel channelInfo, CancellationToken cancellationToken) { - var parentFolder = await GetInternalChannelFolder(cancellationToken).ConfigureAwait(false); + var parentFolder = GetInternalChannelFolder(cancellationToken); var parentFolderId = parentFolder.Id; var id = GetInternalChannelId(channelInfo.Name); @@ -434,7 +434,7 @@ namespace Emby.Server.Implementations.Channels } else if (forceUpdate) { - await item.UpdateToRepository(ItemUpdateType.None, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.None, cancellationToken); } await item.RefreshMetadata(new MetadataRefreshOptions(_fileSystem), cancellationToken); @@ -655,14 +655,12 @@ namespace Emby.Server.Implementations.Channels // Avoid implicitly captured closure var token = cancellationToken; - var itemTasks = items.Select(i => + var internalItems = items.Select(i => { var channelProvider = i.Item1; var internalChannelId = GetInternalChannelId(channelProvider.Name); return GetChannelItemEntity(i.Item2, channelProvider, internalChannelId, token); - }); - - var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false); + }).ToArray(); internalItems = ApplyFilters(internalItems, query.Filters, user).ToArray(); RefreshIfNeeded(internalItems); @@ -802,14 +800,12 @@ namespace Emby.Server.Implementations.Channels // Avoid implicitly captured closure var token = cancellationToken; - var itemTasks = items.Select(i => + var internalItems = items.Select(i => { var channelProvider = i.Item1; var internalChannelId = GetInternalChannelId(channelProvider.Name); return GetChannelItemEntity(i.Item2, channelProvider, internalChannelId, token); - }); - - var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false); + }).ToArray(); return new QueryResult { @@ -955,9 +951,7 @@ namespace Emby.Server.Implementations.Channels var providerTotalRecordCount = providerLimit.HasValue ? itemsResult.TotalRecordCount : null; - var tasks = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, cancellationToken)); - - var internalItems = await Task.WhenAll(tasks).ConfigureAwait(false); + var internalItems = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, cancellationToken)).ToArray(); if (user != null) { @@ -1234,7 +1228,7 @@ namespace Emby.Server.Implementations.Channels return item; } - private async Task GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken) + private BaseItem GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, Guid internalChannelId, CancellationToken cancellationToken) { BaseItem item; bool isNew; @@ -1399,7 +1393,7 @@ namespace Emby.Server.Implementations.Channels } else if (forceUpdate) { - await item.UpdateToRepository(ItemUpdateType.None, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.None, cancellationToken); } SaveMediaSources(item, info.MediaSources); @@ -1542,20 +1536,20 @@ namespace Emby.Server.Implementations.Channels return items; } - public async Task GetChannelFolder(string userId, CancellationToken cancellationToken) + public BaseItemDto GetChannelFolder(string userId, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(userId) ? null : _userManager.GetUserById(userId); - var folder = await GetInternalChannelFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalChannelFolder(cancellationToken); return _dtoService.GetBaseItemDto(folder, new DtoOptions(), user); } - public async Task GetInternalChannelFolder(CancellationToken cancellationToken) + public Folder GetInternalChannelFolder(CancellationToken cancellationToken) { var name = _localization.GetLocalizedString("ViewTypeChannels"); - return await _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken).ConfigureAwait(false); + return _libraryManager.GetNamedView(name, "channels", "zz_" + name, cancellationToken); } } diff --git a/Emby.Server.Implementations/Collections/CollectionManager.cs b/Emby.Server.Implementations/Collections/CollectionManager.cs index 2e884e729c..c8e947fd7d 100644 --- a/Emby.Server.Implementations/Collections/CollectionManager.cs +++ b/Emby.Server.Implementations/Collections/CollectionManager.cs @@ -203,7 +203,7 @@ namespace Emby.Server.Implementations.Collections collection.UpdateRatingToContent(); - await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(collection.Id, refreshOptions, RefreshPriority.High); @@ -262,7 +262,7 @@ namespace Emby.Server.Implementations.Collections collection.UpdateRatingToContent(); - await collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + collection.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(collection.Id, new MetadataRefreshOptions(_fileSystem), RefreshPriority.High); EventHelper.FireEventIfNotNull(ItemsRemovedFromCollection, this, new CollectionModifiedEventArgs diff --git a/Emby.Server.Implementations/IO/FileRefresher.cs b/Emby.Server.Implementations/IO/FileRefresher.cs index 315bee103e..85b8bddd28 100644 --- a/Emby.Server.Implementations/IO/FileRefresher.cs +++ b/Emby.Server.Implementations/IO/FileRefresher.cs @@ -154,20 +154,13 @@ namespace Emby.Server.Implementations.IO .DistinctBy(i => i.Id) .ToList(); - //foreach (var p in paths) - //{ - // Logger.Info(p + " reports change."); - //} - - // If the root folder changed, run the library task so the user can see it - if (itemsToRefresh.Any(i => i is AggregateFolder)) - { - LibraryManager.ValidateMediaLibrary(new SimpleProgress(), CancellationToken.None); - return; - } - foreach (var item in itemsToRefresh) { + if (item is AggregateFolder) + { + continue; + } + Logger.Info(item.Name + " (" + item.Path + ") will be refreshed."); try diff --git a/Emby.Server.Implementations/IO/ManagedFileSystem.cs b/Emby.Server.Implementations/IO/ManagedFileSystem.cs index 0d85a977c5..125d9e980f 100644 --- a/Emby.Server.Implementations/IO/ManagedFileSystem.cs +++ b/Emby.Server.Implementations/IO/ManagedFileSystem.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Text; @@ -24,12 +25,14 @@ namespace Emby.Server.Implementations.IO private string _tempPath; private SharpCifsFileSystem _sharpCifsFileSystem; + private IEnvironmentInfo _environmentInfo; public ManagedFileSystem(ILogger logger, IEnvironmentInfo environmentInfo, string tempPath) { Logger = logger; _supportsAsyncFileStreams = true; _tempPath = tempPath; + _environmentInfo = environmentInfo; // On Linux, this needs to be true or symbolic links are ignored EnableFileSystemRequestConcat = environmentInfo.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows && @@ -1051,7 +1054,25 @@ namespace Emby.Server.Implementations.IO public virtual void SetExecutable(string path) { + if (_environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.OSX) + { + RunProcess("chmod", "+x \"" + path + "\"", GetDirectoryName(path)); + } + } + private void RunProcess(string path, string args, string workingDirectory) + { + using (var process = Process.Start(new ProcessStartInfo + { + Arguments = args, + FileName = path, + CreateNoWindow = true, + WorkingDirectory = workingDirectory, + WindowStyle = ProcessWindowStyle.Normal + })) + { + process.WaitForExit(); + } } } } diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 85b91ac25a..a7b85ad428 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -738,8 +738,7 @@ namespace Emby.Server.Implementations.Library if (folder.ParentId != rootFolder.Id) { folder.ParentId = rootFolder.Id; - var task = folder.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); - Task.WaitAll(task); + folder.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); } rootFolder.AddVirtualChild(folder); @@ -1834,12 +1833,12 @@ namespace Emby.Server.Implementations.Library /// The update reason. /// The cancellation token. /// Task. - public async Task UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken) + public void UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken) { var locationType = item.LocationType; if (locationType != LocationType.Remote && locationType != LocationType.Virtual) { - await _providerManagerFactory().SaveMetadata(item, updateReason).ConfigureAwait(false); + _providerManagerFactory().SaveMetadata(item, updateReason); } item.DateLastSaved = DateTime.UtcNow; @@ -2053,7 +2052,7 @@ namespace Emby.Server.Implementations.Library return GetNamedView(user, name, null, viewType, sortName, cancellationToken); } - public async Task GetNamedView(string name, + public UserView GetNamedView(string name, string viewType, string sortName, CancellationToken cancellationToken) @@ -2100,7 +2099,7 @@ namespace Emby.Server.Implementations.Library if (refresh) { - await item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); _providerManagerFactory().QueueRefresh(item.Id, new MetadataRefreshOptions(_fileSystem) { // Not sure why this is necessary but need to figure it out @@ -2241,7 +2240,7 @@ namespace Emby.Server.Implementations.Library return item; } - public async Task GetNamedView(string name, + public UserView GetNamedView(string name, string parentId, string viewType, string sortName, @@ -2294,7 +2293,7 @@ namespace Emby.Server.Implementations.Library if (!string.Equals(viewType, item.ViewType, StringComparison.OrdinalIgnoreCase)) { item.ViewType = viewType; - await item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken); } var refresh = isNew || DateTime.UtcNow - item.DateLastRefreshed >= _viewRefreshInterval; @@ -2822,7 +2821,7 @@ namespace Emby.Server.Implementations.Library await _providerManagerFactory().SaveImage(item, url, image.Type, imageIndex, CancellationToken.None).ConfigureAwait(false); - await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); return item.GetImageInfo(image.Type, imageIndex); } @@ -2838,7 +2837,7 @@ namespace Emby.Server.Implementations.Library // Remove this image to prevent it from retrying over and over item.RemoveImage(image); - await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); throw new InvalidOperationException(); } diff --git a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs index 757e67eb49..4830da8fcf 100644 --- a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs +++ b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs @@ -54,7 +54,7 @@ namespace Emby.Server.Implementations.Library { cancellationToken.ThrowIfCancellationRequested(); - await AssignTrailers(item, trailers).ConfigureAwait(false); + AssignTrailers(item, trailers); numComplete++; double percent = numComplete; @@ -65,7 +65,7 @@ namespace Emby.Server.Implementations.Library progress.Report(100); } - private async Task AssignTrailers(IHasTrailers item, IEnumerable channelTrailers) + private void AssignTrailers(IHasTrailers item, IEnumerable channelTrailers) { if (item is Game) { @@ -98,8 +98,7 @@ namespace Emby.Server.Implementations.Library item.RemoteTrailerIds = trailerIds; var baseItem = (BaseItem)item; - await baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None) - .ConfigureAwait(false); + baseItem.UpdateToRepository(ItemUpdateType.MetadataImport, CancellationToken.None); } } } diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs index cd12647540..82f42c7455 100644 --- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs @@ -147,7 +147,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies Items = videos }; - var isInMixedFolder = resolverResult.Count > 1; + var isInMixedFolder = resolverResult.Count > 1 || (parent != null && parent.IsTopParent); foreach (var video in resolverResult) { diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs index 8c93772915..4ee0f553f3 100644 --- a/Emby.Server.Implementations/Library/UserViewManager.cs +++ b/Emby.Server.Implementations/Library/UserViewManager.cs @@ -102,7 +102,7 @@ namespace Emby.Server.Implementations.Library if (_config.Configuration.EnableFolderView) { var name = _localizationManager.GetLocalizedString("ViewType" + CollectionType.Folders); - list.Add(await _libraryManager.GetNamedView(name, CollectionType.Folders, string.Empty, cancellationToken).ConfigureAwait(false)); + list.Add(_libraryManager.GetNamedView(name, CollectionType.Folders, string.Empty, cancellationToken)); } if (query.IncludeExternalContent) @@ -117,7 +117,7 @@ namespace Emby.Server.Implementations.Library if (_config.Configuration.EnableChannelView && channels.Length > 0) { - list.Add(await _channelManager.GetInternalChannelFolder(cancellationToken).ConfigureAwait(false)); + list.Add(_channelManager.GetInternalChannelFolder(cancellationToken)); } else { @@ -126,7 +126,7 @@ namespace Emby.Server.Implementations.Library if (_liveTvManager.GetEnabledUsers().Select(i => i.Id.ToString("N")).Contains(query.UserId)) { - list.Add(await _liveTvManager.GetInternalLiveTvFolder(CancellationToken.None).ConfigureAwait(false)); + list.Add(_liveTvManager.GetInternalLiveTvFolder(CancellationToken.None)); } } @@ -158,14 +158,14 @@ namespace Emby.Server.Implementations.Library .ToArray(); } - public Task GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken) + public UserView GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken) { var uniqueId = parentId + "subview" + type; return _libraryManager.GetNamedView(name, parentId, type, sortName, uniqueId, cancellationToken); } - public Task GetUserSubView(string parentId, string type, string sortName, CancellationToken cancellationToken) + public UserView GetUserSubView(string parentId, string type, string sortName, CancellationToken cancellationToken) { var name = _localizationManager.GetLocalizedString("ViewType" + type); diff --git a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs index 857afa3781..ec2704aa08 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvManager.cs @@ -173,11 +173,11 @@ namespace Emby.Server.Implementations.LiveTv } } - public async Task> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken) + public QueryResult GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); var internalQuery = new InternalItemsQuery(user) { @@ -565,7 +565,7 @@ namespace Emby.Server.Implementations.LiveTv } else if (forceUpdate) { - await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken); } await item.RefreshMetadata(new MetadataRefreshOptions(_fileSystem) @@ -760,7 +760,7 @@ namespace Emby.Server.Implementations.LiveTv return new Tuple(item, isNew, isUpdated); } - private async Task CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken) + private Guid CreateRecordingRecord(RecordingInfo info, string serviceName, Guid parentFolderId, CancellationToken cancellationToken) { var isNew = false; @@ -892,7 +892,7 @@ namespace Emby.Server.Implementations.LiveTv else if (dataChanged || info.DateLastUpdated > recording.DateLastSaved || statusChanged) { metadataRefreshMode = MetadataRefreshMode.FullRefresh; - await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken); } if (info.Status != RecordingStatus.InProgress) @@ -928,7 +928,7 @@ namespace Emby.Server.Implementations.LiveTv { var user = string.IsNullOrEmpty(query.UserId) ? null : _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); if (query.OrderBy.Length == 0) { @@ -1007,11 +1007,11 @@ namespace Emby.Server.Implementations.LiveTv return result; } - public async Task> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) + public QueryResult GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) { var user = _userManager.GetUserById(query.UserId); - var topFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var topFolder = GetInternalLiveTvFolder(cancellationToken); var internalQuery = new InternalItemsQuery(user) { @@ -1072,11 +1072,11 @@ namespace Emby.Server.Implementations.LiveTv return result; } - public async Task> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) + public QueryResult GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken) { RemoveFields(options); - var internalResult = await GetRecommendedProgramsInternal(query, options, cancellationToken).ConfigureAwait(false); + var internalResult = GetRecommendedProgramsInternal(query, options, cancellationToken); var user = _userManager.GetUserById(query.UserId); @@ -1302,7 +1302,7 @@ namespace Emby.Server.Implementations.LiveTv var list = new List(); var numComplete = 0; - var parentFolder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var parentFolder = GetInternalLiveTvFolder(cancellationToken); var parentFolderId = parentFolder.Id; foreach (var channelInfo in allChannelsList) @@ -1425,7 +1425,7 @@ namespace Emby.Server.Implementations.LiveTv // TODO: Do this in bulk foreach (var program in updatedPrograms) { - await _libraryManager.UpdateItem(program, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + _libraryManager.UpdateItem(program, ItemUpdateType.MetadataImport, cancellationToken); } currentChannel.IsMovie = isMovie; @@ -1434,7 +1434,7 @@ namespace Emby.Server.Implementations.LiveTv currentChannel.IsKids = isKids; currentChannel.IsSeries = iSSeries; - await currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false); + currentChannel.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken); } catch (OperationCanceledException) { @@ -1549,9 +1549,8 @@ namespace Emby.Server.Implementations.LiveTv var results = await Task.WhenAll(tasks).ConfigureAwait(false); - var recordingTasks = results.SelectMany(i => i.ToList()).Select(i => CreateRecordingRecord(i.Item1, i.Item2.Name, internalLiveTvFolderId, cancellationToken)); - - var idList = await Task.WhenAll(recordingTasks).ConfigureAwait(false); + var idList = results.SelectMany(i => i.ToList()).Select(i => CreateRecordingRecord(i.Item1, i.Item2.Name, internalLiveTvFolderId, cancellationToken)) + .ToArray(); await CleanDatabaseInternal(idList, new[] { typeof(LiveTvVideoRecording).Name, typeof(LiveTvAudioRecording).Name }, new SimpleProgress(), cancellationToken).ConfigureAwait(false); @@ -1726,7 +1725,7 @@ namespace Emby.Server.Implementations.LiveTv return new QueryResult(); } - var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalLiveTvFolder(cancellationToken); // TODO: Figure out how to merge emby recordings + service recordings if (_services.Length == 1) @@ -2143,18 +2142,6 @@ namespace Emby.Server.Implementations.LiveTv }; } - public Task OnRecordingFileDeleted(BaseItem recording) - { - var service = GetService(recording); - - if (service is EmbyTV.EmbyTV) - { - return service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None); - } - - return Task.FromResult(true); - } - public async Task DeleteRecording(string recordingId) { var recording = await GetInternalRecording(recordingId, CancellationToken.None).ConfigureAwait(false); @@ -2171,13 +2158,17 @@ namespace Emby.Server.Implementations.LiveTv { var service = GetService(recording.ServiceName); - try - { - await service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None).ConfigureAwait(false); - } - catch (ResourceNotFoundException) + if (service != null) { + // handle the service being uninstalled and the item hanging around in the database + try + { + await service.DeleteRecordingAsync(GetItemExternalId(recording), CancellationToken.None).ConfigureAwait(false); + } + catch (ResourceNotFoundException) + { + } } _lastRecordingRefreshTime = DateTime.MinValue; @@ -2387,7 +2378,7 @@ namespace Emby.Server.Implementations.LiveTv MinEndDate = now, Limit = channelIds.Length, OrderBy = new[] { new Tuple(ItemSortBy.StartDate, SortOrder.Ascending) }, - TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Result.Id.ToString("N") }, + TopParentIds = new[] { GetInternalLiveTvFolder(CancellationToken.None).Id.ToString("N") }, DtoOptions = options }) : new List(); @@ -2910,11 +2901,11 @@ namespace Emby.Server.Implementations.LiveTv return service.ResetTuner(parts[1], cancellationToken); } - public async Task GetLiveTvFolder(string userId, CancellationToken cancellationToken) + public BaseItemDto GetLiveTvFolder(string userId, CancellationToken cancellationToken) { var user = string.IsNullOrEmpty(userId) ? null : _userManager.GetUserById(userId); - var folder = await GetInternalLiveTvFolder(cancellationToken).ConfigureAwait(false); + var folder = GetInternalLiveTvFolder(cancellationToken); return _dtoService.GetBaseItemDto(folder, new DtoOptions(), user); } @@ -2930,10 +2921,10 @@ namespace Emby.Server.Implementations.LiveTv options.Fields = fields.ToArray(fields.Count); } - public async Task GetInternalLiveTvFolder(CancellationToken cancellationToken) + public Folder GetInternalLiveTvFolder(CancellationToken cancellationToken) { var name = _localization.GetLocalizedString("ViewTypeLiveTV"); - return await _libraryManager.GetNamedView(name, CollectionType.LiveTv, name, cancellationToken).ConfigureAwait(false); + return _libraryManager.GetNamedView(name, CollectionType.LiveTv, name, cancellationToken); } public async Task SaveTunerHost(TunerHostInfo info, bool dataSourceChanged = true) diff --git a/Emby.Server.Implementations/Playlists/PlaylistManager.cs b/Emby.Server.Implementations/Playlists/PlaylistManager.cs index 87832e7dda..f268e9c0c1 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistManager.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistManager.cs @@ -209,7 +209,7 @@ namespace Emby.Server.Implementations.Playlists newList.AddRange(list); playlist.LinkedChildren = newList.ToArray(newList.Count); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(_fileSystem) { @@ -237,7 +237,7 @@ namespace Emby.Server.Implementations.Playlists .Select(i => i.Item1) .ToArray(); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); _providerManager.QueueRefresh(playlist.Id, new MetadataRefreshOptions(_fileSystem) { @@ -281,7 +281,7 @@ namespace Emby.Server.Implementations.Playlists playlist.LinkedChildren = newList.ToArray(newList.Count); - await playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None).ConfigureAwait(false); + playlist.UpdateToRepository(ItemUpdateType.MetadataEdit, CancellationToken.None); } public Folder GetPlaylistsFolder(string userId) diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs index 1804630403..772f2338ac 100644 --- a/Emby.Server.Implementations/Updates/InstallationManager.cs +++ b/Emby.Server.Implementations/Updates/InstallationManager.cs @@ -442,11 +442,6 @@ namespace Emby.Server.Implementations.Updates /// Task{IEnumerable{PackageVersionInfo}}. public async Task> GetAvailablePluginUpdates(Version applicationVersion, bool withAutoUpdateEnabled, CancellationToken cancellationToken) { - if (!_config.CommonConfiguration.EnableAutoUpdate) - { - return new PackageVersionInfo[] { }; - } - var catalog = await GetAvailablePackagesWithoutRegistrationInfo(cancellationToken).ConfigureAwait(false); var systemUpdateLevel = GetSystemUpdateLevel(); diff --git a/MediaBrowser.Api/ChannelService.cs b/MediaBrowser.Api/ChannelService.cs index d64bf7ec77..2e8eb9e07d 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; } - + /// /// Gets the filters. /// @@ -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; } - + /// /// Gets the filters. /// @@ -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 { @@ -209,9 +209,9 @@ namespace MediaBrowser.Api return ToOptimizedResult(result); } - public async Task 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 Get(GetChannels request) diff --git a/MediaBrowser.Api/Dlna/DlnaServerService.cs b/MediaBrowser.Api/Dlna/DlnaServerService.cs index cbef6e5b3b..6a0cea4df9 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 f8481517db..72e4fe224b 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -471,9 +471,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); } /// @@ -484,9 +482,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); } /// @@ -497,9 +493,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); } /// @@ -510,9 +504,9 @@ namespace MediaBrowser.Api.Images /// Index of the current. /// The new index. /// Task. - 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); } /// @@ -558,7 +552,7 @@ namespace MediaBrowser.Api.Images var supportedImageEnhancers = request.EnableImageEnhancers ? _imageProcessor.GetSupportedEnhancers(item, request.Type) : new List(); - 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 +727,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 3512a526ba..413762a5cb 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 { /// @@ -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); } /// @@ -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) { @@ -273,7 +273,7 @@ namespace MediaBrowser.Api.Images var fullCachePath = GetFullCachePath(urlHash + "." + ext); - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath)); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(fullCachePath)); using (var stream = result.Content) { using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read, true)) @@ -282,7 +282,7 @@ namespace MediaBrowser.Api.Images } } - _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath)); + _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(pointerCachePath)); _fileSystem.WriteAllText(pointerCachePath, fullCachePath); } diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 53a67ff712..90cf2d1d1e 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -193,13 +193,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); @@ -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 36bcee913f..f46c3e50f6 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -892,11 +892,11 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedSerializedResultUsingCache(info); } - public async Task 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); @@ -958,9 +958,9 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedSerializedResultUsingCache(result); } - public async Task 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 Get(GetPrograms request) @@ -1020,7 +1020,7 @@ namespace MediaBrowser.Api.LiveTv return ToOptimizedResult(result); } - public async Task 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); } diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index ddb187f3d9..650306ea60 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -40,7 +40,6 @@ Properties\SharedVersion.cs - diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs index ee74ec450c..69ce6a385d 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 c641695dd8..793f745713 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 5fe386f1ab..1e531ba664 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 3bd0497f7e..3f840dbfa3 100644 --- a/MediaBrowser.Api/VideosService.cs +++ b/MediaBrowser.Api/VideosService.cs @@ -109,13 +109,6 @@ 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); @@ -123,21 +116,14 @@ namespace MediaBrowser.Api { 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)) @@ -162,19 +148,19 @@ namespace MediaBrowser.Api if (primaryVersion == null) { primaryVersion = items.OrderBy(i => - { - if (i.Video3DFormat.HasValue) { - return 1; - } + if (i.Video3DFormat.HasValue) + { + return 1; + } - if (i.VideoType != Model.Entities.VideoType.VideoFile) - { - return 1; - } + if (i.VideoType != Model.Entities.VideoType.VideoFile) + { + return 1; + } - return 0; - }) + 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); } } } diff --git a/MediaBrowser.Controller/Channels/IChannelManager.cs b/MediaBrowser.Controller/Channels/IChannelManager.cs index 46e55a21ce..37fc892b36 100644 --- a/MediaBrowser.Controller/Channels/IChannelManager.cs +++ b/MediaBrowser.Controller/Channels/IChannelManager.cs @@ -117,14 +117,13 @@ namespace MediaBrowser.Controller.Channels /// /// The cancellation token. /// BaseItemDto. - Task GetInternalChannelFolder(CancellationToken cancellationToken); + Folder GetInternalChannelFolder(CancellationToken cancellationToken); /// /// Gets the channel folder. /// /// The user identifier. /// The cancellation token. - /// BaseItemDto. - Task GetChannelFolder(string userId, CancellationToken cancellationToken); + BaseItemDto GetChannelFolder(string userId, CancellationToken cancellationToken); } } diff --git a/MediaBrowser.Controller/Dlna/IEventManager.cs b/MediaBrowser.Controller/Dlna/IEventManager.cs index 8c91bd889d..3af357a174 100644 --- a/MediaBrowser.Controller/Dlna/IEventManager.cs +++ b/MediaBrowser.Controller/Dlna/IEventManager.cs @@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Dlna /// /// Renews the event subscription. /// - EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string requestedTimeoutString); + EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string requestedTimeoutString, string callbackUrl); /// /// Creates the event subscription. diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 502ba6c60e..46c037a44d 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1281,8 +1281,8 @@ namespace MediaBrowser.Controller.Entities { var subOptions = new MetadataRefreshOptions(options); - if (!i.ExtraType.HasValue || - i.ExtraType.Value != Model.Entities.ExtraType.ThemeSong || + if (!i.ExtraType.HasValue || + i.ExtraType.Value != Model.Entities.ExtraType.ThemeSong || i.OwnerId != ownerId || i.ParentId != Guid.Empty) { @@ -1356,14 +1356,20 @@ namespace MediaBrowser.Controller.Entities internal virtual bool IsValidFromResolver(BaseItem newItem) { - var current = this; + return true; + } - if (current.IsInMixedFolder != newItem.IsInMixedFolder) + internal virtual ItemUpdateType UpdateFromResolvedItem(BaseItem newItem) + { + var updateType = ItemUpdateType.None; + + if (IsInMixedFolder != newItem.IsInMixedFolder) { - return false; + IsInMixedFolder = newItem.IsInMixedFolder; + updateType |= ItemUpdateType.MetadataImport; } - return true; + return updateType; } public void AfterMetadataRefresh() @@ -1966,14 +1972,14 @@ namespace MediaBrowser.Controller.Entities /// The type. /// The index. /// Task. - public Task DeleteImage(ImageType type, int index) + public void DeleteImage(ImageType type, int index) { var info = GetImageInfo(type, index); if (info == null) { // Nothing to do - return Task.FromResult(true); + return; } // Remove it from the item @@ -1984,7 +1990,7 @@ namespace MediaBrowser.Controller.Entities FileSystem.DeleteFile(info.Path); } - return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); + UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } public void RemoveImage(ItemImageInfo image) @@ -1997,9 +2003,9 @@ namespace MediaBrowser.Controller.Entities ImageInfos = ImageInfos.Except(deletedImages).ToArray(); } - public virtual Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public virtual void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { - return LibraryManager.UpdateItem(this, updateReason, cancellationToken); + LibraryManager.UpdateItem(this, updateReason, cancellationToken); } /// @@ -2209,7 +2215,7 @@ namespace MediaBrowser.Controller.Entities return type == ImageType.Backdrop || type == ImageType.Screenshot || type == ImageType.Chapter; } - public Task SwapImages(ImageType type, int index1, int index2) + public void SwapImages(ImageType type, int index1, int index2) { if (!AllowsMultipleImages(type)) { @@ -2222,13 +2228,13 @@ namespace MediaBrowser.Controller.Entities if (info1 == null || info2 == null) { // Nothing to do - return Task.FromResult(true); + return; } if (!info1.IsLocalFile || !info2.IsLocalFile) { // TODO: Not supported yet - return Task.FromResult(true); + return; } var path1 = info1.Path; @@ -2240,7 +2246,7 @@ namespace MediaBrowser.Controller.Entities info1.DateModified = FileSystem.GetLastWriteTimeUtc(info1.Path); info2.DateModified = FileSystem.GetLastWriteTimeUtc(info2.Path); - return UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); + UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None); } public virtual bool IsPlayed(User user) @@ -2526,15 +2532,6 @@ namespace MediaBrowser.Controller.Entities return LibraryManager.DeleteItem(this, options); } - public virtual Task OnFileDeleted() - { - // Remove from database - return Delete(new DeleteOptions - { - DeleteFileLocation = false - }); - } - public virtual List GetRelatedUrls() { return new List(); diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 6d88f70152..ce7145a791 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/MediaBrowser.Controller/Entities/Folder.cs @@ -328,11 +328,6 @@ namespace MediaBrowser.Controller.Entities return dictionary; } - private bool IsValidFromResolver(BaseItem current, BaseItem newItem) - { - return current.IsValidFromResolver(newItem); - } - protected override void TriggerOnRefreshStart() { } @@ -421,10 +416,15 @@ namespace MediaBrowser.Controller.Entities { BaseItem currentChild; - if (currentChildren.TryGetValue(child.Id, out currentChild) && IsValidFromResolver(currentChild, child)) + if (currentChildren.TryGetValue(child.Id, out currentChild) && currentChild.IsValidFromResolver(child)) { validChildren.Add(currentChild); + if (currentChild.UpdateFromResolvedItem(child) > ItemUpdateType.None) + { + currentChild.UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken); + } + continue; } @@ -542,7 +542,6 @@ namespace MediaBrowser.Controller.Entities if (validChildrenNeedGeneration) { validChildren = Children.ToList(); - validChildrenNeedGeneration = false; } await RefreshMetadataRecursive(validChildren, refreshOptions, recursive, innerProgress, cancellationToken); diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 4146686b21..b7d31b4d6a 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -151,11 +151,7 @@ namespace MediaBrowser.Controller.Entities /// /// Swaps the images. /// - /// The type. - /// The index1. - /// The index2. - /// Task. - Task SwapImages(ImageType type, int index1, int index2); + void SwapImages(ImageType type, int index1, int index2); /// /// Gets or sets the primary image path. @@ -249,10 +245,7 @@ namespace MediaBrowser.Controller.Entities /// /// Updates to repository. /// - /// The update reason. - /// The cancellation token. - /// Task. - Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); + void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); /// /// Sets the image. diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs index 36bbf6886a..821327b7f3 100644 --- a/MediaBrowser.Controller/Entities/User.cs +++ b/MediaBrowser.Controller/Entities/User.cs @@ -235,10 +235,9 @@ namespace MediaBrowser.Controller.Entities }, CancellationToken.None); } - public override Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public override void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { UserManager.UpdateUser(this); - return Task.FromResult(true); } /// diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs index 43adc4af68..acc452fbc3 100644 --- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs +++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs @@ -78,26 +78,26 @@ namespace MediaBrowser.Controller.Entities case SpecialFolder.LiveTvChannels: { - var result = await _liveTvManager.GetInternalChannels(new LiveTvChannelQuery + var result = _liveTvManager.GetInternalChannels(new LiveTvChannelQuery { UserId = query.User.Id.ToString("N"), Limit = query.Limit, StartIndex = query.StartIndex - }, new DtoOptions(), CancellationToken.None).ConfigureAwait(false); + }, new DtoOptions(), CancellationToken.None); return GetResult(result); } case SpecialFolder.LiveTvNowPlaying: { - var result = await _liveTvManager.GetRecommendedProgramsInternal(new RecommendedProgramQuery + var result = _liveTvManager.GetRecommendedProgramsInternal(new RecommendedProgramQuery { UserId = query.User.Id.ToString("N"), Limit = query.Limit, IsAiring = true - }, new Dto.DtoOptions(), CancellationToken.None).ConfigureAwait(false); + }, new Dto.DtoOptions(), CancellationToken.None); return GetResult(result); } @@ -142,22 +142,22 @@ namespace MediaBrowser.Controller.Entities return GetResult(user.RootFolder.GetChildren(user, true), queryParent, query); case CollectionType.Playlists: - return GetPlaylistsView(queryParent, user, query); + return GetPlaylistsView(queryParent, user, query); case CollectionType.BoxSets: return GetBoxsetView(queryParent, user, query); case CollectionType.TvShows: - return await GetTvView(queryParent, user, query).ConfigureAwait(false); + return GetTvView(queryParent, user, query); case CollectionType.Movies: - return await GetMovieFolders(queryParent, user, query).ConfigureAwait(false); + return GetMovieFolders(queryParent, user, query); case SpecialFolder.TvShowSeries: return GetTvSeries(queryParent, user, query); case SpecialFolder.TvGenres: - return await GetTvGenres(queryParent, user, query).ConfigureAwait(false); + return GetTvGenres(queryParent, user, query); case SpecialFolder.TvGenre: return GetTvGenreItems(queryParent, displayParent, user, query); @@ -178,10 +178,10 @@ namespace MediaBrowser.Controller.Entities return GetMovieLatest(queryParent, user, query); case SpecialFolder.MovieGenres: - return await GetMovieGenres(queryParent, user, query).ConfigureAwait(false); + return GetMovieGenres(queryParent, user, query); case SpecialFolder.MovieGenre: - return GetMovieGenreItems(queryParent, displayParent, user, query); + return GetMovieGenreItems(queryParent, displayParent, user, query); case SpecialFolder.MovieResume: return GetMovieResume(queryParent, user, query); @@ -199,7 +199,7 @@ namespace MediaBrowser.Controller.Entities return GetFavoriteSeries(queryParent, user, query); case CollectionType.Music: - return await GetMusicFolders(queryParent, user, query).ConfigureAwait(false); + return GetMusicFolders(queryParent, user, query); case SpecialFolder.MusicGenres: return GetMusicGenres(queryParent, user, query); @@ -223,7 +223,7 @@ namespace MediaBrowser.Controller.Entities return GetMusicSongs(queryParent, user, query); case SpecialFolder.MusicFavorites: - return await GetMusicFavorites(queryParent, user, query).ConfigureAwait(false); + return GetMusicFavorites(queryParent, user, query); case SpecialFolder.MusicFavoriteAlbums: return GetFavoriteAlbums(queryParent, user, query); @@ -245,7 +245,7 @@ namespace MediaBrowser.Controller.Entities } } - private async Task> GetMusicFolders(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetMusicFolders(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -262,25 +262,25 @@ namespace MediaBrowser.Controller.Entities var list = new List(); - list.Add(await GetUserView(SpecialFolder.MusicLatest, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicPlaylists, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicAlbums, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicAlbumArtists, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicArtists, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicSongs, "5", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicGenres, "6", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavorites, "7", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MusicLatest, "0", parent)); + list.Add(GetUserView(SpecialFolder.MusicPlaylists, "1", parent)); + list.Add(GetUserView(SpecialFolder.MusicAlbums, "2", parent)); + list.Add(GetUserView(SpecialFolder.MusicAlbumArtists, "3", parent)); + list.Add(GetUserView(SpecialFolder.MusicArtists, "4", parent)); + list.Add(GetUserView(SpecialFolder.MusicSongs, "5", parent)); + list.Add(GetUserView(SpecialFolder.MusicGenres, "6", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavorites, "7", parent)); return GetResult(list, parent, query); } - private async Task> GetMusicFavorites(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetMusicFavorites(Folder parent, User user, InternalItemsQuery query) { var list = new List(); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteAlbums, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteArtists, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MusicFavoriteSongs, "2", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteAlbums, "0", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteArtists, "1", parent)); + list.Add(GetUserView(SpecialFolder.MusicFavoriteSongs, "2", parent)); return GetResult(list, parent, query); } @@ -426,7 +426,7 @@ namespace MediaBrowser.Controller.Entities return 50; } - private async Task> GetMovieFolders(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetMovieFolders(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -443,12 +443,12 @@ namespace MediaBrowser.Controller.Entities var list = new List(); - list.Add(await GetUserView(SpecialFolder.MovieResume, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieLatest, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieMovies, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieCollections, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieFavorites, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.MovieGenres, "5", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.MovieResume, "0", parent)); + list.Add(GetUserView(SpecialFolder.MovieLatest, "1", parent)); + list.Add(GetUserView(SpecialFolder.MovieMovies, "2", parent)); + list.Add(GetUserView(SpecialFolder.MovieCollections, "3", parent)); + list.Add(GetUserView(SpecialFolder.MovieFavorites, "4", parent)); + list.Add(GetUserView(SpecialFolder.MovieGenres, "5", parent)); return GetResult(list, parent, query); } @@ -538,9 +538,9 @@ namespace MediaBrowser.Controller.Entities }; } - private async Task> GetMovieGenres(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetMovieGenres(Folder parent, User user, InternalItemsQuery query) { - var tasks = parent.QueryRecursive(new InternalItemsQuery(user) + var genres = parent.QueryRecursive(new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Movie).Name }, Recursive = true, @@ -566,8 +566,6 @@ namespace MediaBrowser.Controller.Entities .Where(i => i != null) .Select(i => GetUserView(i.Name, SpecialFolder.MovieGenre, i.SortName, parent)); - var genres = await Task.WhenAll(tasks).ConfigureAwait(false); - return GetResult(genres, parent, query); } @@ -598,7 +596,7 @@ namespace MediaBrowser.Controller.Entities return _libraryManager.GetItemsResult(query); } - private async Task> GetTvView(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetTvView(Folder parent, User user, InternalItemsQuery query) { if (query.Recursive) { @@ -615,13 +613,13 @@ namespace MediaBrowser.Controller.Entities var list = new List(); - list.Add(await GetUserView(SpecialFolder.TvResume, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvNextUp, "1", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvLatest, "2", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvShowSeries, "3", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvFavoriteSeries, "4", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvFavoriteEpisodes, "5", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.TvGenres, "6", parent).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.TvResume, "0", parent)); + list.Add(GetUserView(SpecialFolder.TvNextUp, "1", parent)); + list.Add(GetUserView(SpecialFolder.TvLatest, "2", parent)); + list.Add(GetUserView(SpecialFolder.TvShowSeries, "3", parent)); + list.Add(GetUserView(SpecialFolder.TvFavoriteSeries, "4", parent)); + list.Add(GetUserView(SpecialFolder.TvFavoriteEpisodes, "5", parent)); + list.Add(GetUserView(SpecialFolder.TvGenres, "6", parent)); return GetResult(list, parent, query); } @@ -679,9 +677,9 @@ namespace MediaBrowser.Controller.Entities return _libraryManager.GetItemsResult(query); } - private async Task> GetTvGenres(Folder parent, User user, InternalItemsQuery query) + private QueryResult GetTvGenres(Folder parent, User user, InternalItemsQuery query) { - var tasks = parent.QueryRecursive(new InternalItemsQuery(user) + var genres = parent.QueryRecursive(new InternalItemsQuery(user) { IncludeItemTypes = new[] { typeof(Series).Name }, Recursive = true, @@ -707,8 +705,6 @@ namespace MediaBrowser.Controller.Entities .Where(i => i != null) .Select(i => GetUserView(i.Name, SpecialFolder.TvGenre, i.SortName, parent)); - var genres = await Task.WhenAll(tasks).ConfigureAwait(false); - return GetResult(genres, parent, query); } @@ -1740,18 +1736,18 @@ namespace MediaBrowser.Controller.Entities var list = new List(); //list.Add(await GetUserSubView(SpecialFolder.LiveTvNowPlaying, user, "0", parent).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.LiveTvChannels, string.Empty, user.RootFolder).ConfigureAwait(false)); - list.Add(await GetUserView(SpecialFolder.LiveTvRecordingGroups, string.Empty, user.RootFolder).ConfigureAwait(false)); + list.Add(GetUserView(SpecialFolder.LiveTvChannels, string.Empty, user.RootFolder)); + list.Add(GetUserView(SpecialFolder.LiveTvRecordingGroups, string.Empty, user.RootFolder)); return GetResult(list, queryParent, query); } - private Task GetUserView(string name, string type, string sortName, BaseItem parent) + private UserView GetUserView(string name, string type, string sortName, BaseItem parent) { return _userViewManager.GetUserSubView(name, parent.Id.ToString("N"), type, sortName, CancellationToken.None); } - private Task GetUserView(string type, string sortName, BaseItem parent) + private UserView GetUserView(string type, string sortName, BaseItem parent) { return _userViewManager.GetUserSubView(parent.Id.ToString("N"), type, sortName, CancellationToken.None); } diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index 8693d867cc..8203e53042 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -406,30 +406,31 @@ namespace MediaBrowser.Controller.Entities } } - internal override bool IsValidFromResolver(BaseItem newItem) + internal override ItemUpdateType UpdateFromResolvedItem(BaseItem newItem) { - var current = this; + var updateType = base.UpdateFromResolvedItem(newItem); - var newAsVideo = newItem as Video; - - if (newAsVideo != null) + var newVideo = newItem as Video; + if (newVideo != null) { - if (!current.AdditionalParts.SequenceEqual(newAsVideo.AdditionalParts, StringComparer.OrdinalIgnoreCase)) + if (!AdditionalParts.SequenceEqual(newVideo.AdditionalParts, StringComparer.Ordinal)) { - return false; + AdditionalParts = newVideo.AdditionalParts; + updateType |= ItemUpdateType.MetadataImport; } - if (!current.LocalAlternateVersions.SequenceEqual(newAsVideo.LocalAlternateVersions, StringComparer.OrdinalIgnoreCase)) + if (!LocalAlternateVersions.SequenceEqual(newVideo.LocalAlternateVersions, StringComparer.Ordinal)) { - return false; + LocalAlternateVersions = newVideo.LocalAlternateVersions; + updateType |= ItemUpdateType.MetadataImport; } - - if (newAsVideo.VideoType != VideoType) + if (VideoType != newVideo.VideoType) { - return false; + VideoType = newVideo.VideoType; + updateType |= ItemUpdateType.MetadataImport; } } - return base.IsValidFromResolver(newItem); + return updateType; } public static string[] QueryPlayableStreamFiles(string rootPath, VideoType videoType) @@ -521,9 +522,9 @@ namespace MediaBrowser.Controller.Entities } } - public override async Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) + public override void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken) { - await base.UpdateToRepository(updateReason, cancellationToken).ConfigureAwait(false); + base.UpdateToRepository(updateReason, cancellationToken); var localAlternates = GetLocalAlternateVersionIds() .Select(i => LibraryManager.GetItemById(i)) @@ -540,7 +541,7 @@ namespace MediaBrowser.Controller.Entities item.Genres = Genres; item.ProviderIds = ProviderIds; - await item.UpdateToRepository(ItemUpdateType.MetadataDownload, cancellationToken).ConfigureAwait(false); + item.UpdateToRepository(ItemUpdateType.MetadataDownload, cancellationToken); } } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index 3001e33661..7fceeb780b 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -207,11 +207,7 @@ namespace MediaBrowser.Controller.Library /// /// Updates the item. /// - /// The item. - /// The update reason. - /// The cancellation token. - /// Task. - Task UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken); + void UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken); /// /// Retrieves the item. @@ -330,8 +326,7 @@ namespace MediaBrowser.Controller.Library /// Type of the view. /// Name of the sort. /// The cancellation token. - /// Task<UserView>. - Task GetNamedView(string name, + UserView GetNamedView(string name, string viewType, string sortName, CancellationToken cancellationToken); @@ -345,8 +340,7 @@ namespace MediaBrowser.Controller.Library /// Name of the sort. /// The unique identifier. /// The cancellation token. - /// Task<UserView>. - Task GetNamedView(string name, + UserView GetNamedView(string name, string parentId, string viewType, string sortName, diff --git a/MediaBrowser.Controller/Library/IUserViewManager.cs b/MediaBrowser.Controller/Library/IUserViewManager.cs index 76182c641b..ac37dc869c 100644 --- a/MediaBrowser.Controller/Library/IUserViewManager.cs +++ b/MediaBrowser.Controller/Library/IUserViewManager.cs @@ -13,9 +13,9 @@ namespace MediaBrowser.Controller.Library { Task GetUserViews(UserViewQuery query, CancellationToken cancellationToken); - Task GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken); + UserView GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken); - Task GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken); + UserView GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken); List>> GetLatestItems(LatestItemsQuery request, DtoOptions options); } diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs index be85e115c4..56f2353f16 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs @@ -236,14 +236,12 @@ namespace MediaBrowser.Controller.LiveTv /// The query. /// The options. /// The cancellation token. - /// Task{QueryResult{ProgramInfoDto}}. - Task> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); + QueryResult GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); /// /// Gets the recommended programs internal. /// - /// Task<QueryResult<LiveTvProgram>>. - Task> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); + QueryResult GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken); /// /// Gets the live tv information. @@ -264,8 +262,7 @@ namespace MediaBrowser.Controller.LiveTv /// Gets the live tv folder. /// /// The cancellation token. - /// BaseItemDto. - Task GetInternalLiveTvFolder(CancellationToken cancellationToken); + Folder GetInternalLiveTvFolder(CancellationToken cancellationToken); /// /// Gets the live tv folder. @@ -273,7 +270,7 @@ namespace MediaBrowser.Controller.LiveTv /// The user identifier. /// The cancellation token. /// BaseItemDto. - Task GetLiveTvFolder(string userId, CancellationToken cancellationToken); + BaseItemDto GetLiveTvFolder(string userId, CancellationToken cancellationToken); /// /// Gets the enabled users. @@ -284,7 +281,7 @@ namespace MediaBrowser.Controller.LiveTv /// /// Gets the internal channels. /// - Task> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken); + QueryResult GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken); /// /// Gets the internal recordings. @@ -362,13 +359,6 @@ namespace MediaBrowser.Controller.LiveTv /// The user. void AddChannelInfo(List> items, DtoOptions options, User user); - /// - /// Called when [recording file deleted]. - /// - /// The recording. - /// Task. - Task OnRecordingFileDeleted(BaseItem recording); - Task> GetChannelsForListingsProvider(string id, CancellationToken cancellationToken); Task> GetChannelsFromListingsProviderData(string id, CancellationToken cancellationToken); diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs index 8fa96076b7..2dfc59d228 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs @@ -161,10 +161,5 @@ namespace MediaBrowser.Controller.LiveTv { return LiveTvManager.DeleteRecording(this); } - - public override Task OnFileDeleted() - { - return LiveTvManager.OnRecordingFileDeleted(this); - } } } diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs index c5fe7b1b31..1dfed4f75d 100644 --- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs +++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs @@ -160,10 +160,5 @@ namespace MediaBrowser.Controller.LiveTv { return LiveTvManager.DeleteRecording(this); } - - public override Task OnFileDeleted() - { - return LiveTvManager.OnRecordingFileDeleted(this); - } } } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index b33993859b..960ff0aa7d 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -176,6 +176,7 @@ + diff --git a/MediaBrowser.Api/BasePeriodicWebSocketListener.cs b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs similarity index 99% rename from MediaBrowser.Api/BasePeriodicWebSocketListener.cs rename to MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs index c7a9d97bad..6be94e7e6e 100644 --- a/MediaBrowser.Api/BasePeriodicWebSocketListener.cs +++ b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs @@ -4,12 +4,11 @@ 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 +namespace MediaBrowser.Controller.Net { /// /// Starts sending data over a web socket periodically when a message is received, and then stops when a corresponding stop message is received @@ -93,7 +92,7 @@ namespace MediaBrowser.Api { get { - return true; + return false; } } diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 77e6a7e405..c2cbda11d9 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -119,16 +119,12 @@ namespace MediaBrowser.Controller.Providers /// The item. /// Type of the update. /// Task. - Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType); + void SaveMetadata(IHasMetadata item, ItemUpdateType updateType); /// /// Saves the metadata. /// - /// The item. - /// Type of the update. - /// The savers. - /// Task. - Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable savers); + void SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable savers); /// /// Gets the metadata options. diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index b93f783418..f222b2da4c 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -204,7 +204,7 @@ namespace MediaBrowser.Providers.Manager LibraryManager.UpdatePeople(baseItem, result.People); await SavePeopleMetadata(result.People, libraryOptions, cancellationToken).ConfigureAwait(false); } - await result.Item.UpdateToRepository(reason, cancellationToken).ConfigureAwait(false); + result.Item.UpdateToRepository(reason, cancellationToken); } private async Task SavePeopleMetadata(List people, LibraryOptions libraryOptions, CancellationToken cancellationToken) @@ -238,7 +238,7 @@ namespace MediaBrowser.Providers.Manager if (saveEntity) { - await personEntity.UpdateToRepository(updateType, cancellationToken).ConfigureAwait(false); + personEntity.UpdateToRepository(updateType, cancellationToken); } } } diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index c36d4cf63c..9f46d41dfe 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -560,30 +560,20 @@ namespace MediaBrowser.Providers.Manager new MetadataOptions(); } - private Task _completedTask = Task.FromResult(true); /// /// Saves the metadata. /// - /// The item. - /// Type of the update. - /// Task. - public Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType) + public void SaveMetadata(IHasMetadata item, ItemUpdateType updateType) { SaveMetadata(item, updateType, _savers); - return _completedTask; } /// /// Saves the metadata. /// - /// The item. - /// Type of the update. - /// The savers. - /// Task. - public Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable savers) + public void SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable savers) { SaveMetadata(item, updateType, _savers.Where(i => savers.Contains(i.Name, StringComparer.OrdinalIgnoreCase))); - return _completedTask; } /// diff --git a/MediaBrowser.Providers/TV/DummySeasonProvider.cs b/MediaBrowser.Providers/TV/DummySeasonProvider.cs index de51126eec..771570cbc7 100644 --- a/MediaBrowser.Providers/TV/DummySeasonProvider.cs +++ b/MediaBrowser.Providers/TV/DummySeasonProvider.cs @@ -78,7 +78,7 @@ namespace MediaBrowser.Providers.TV else if (existingSeason.IsVirtualItem) { existingSeason.IsVirtualItem = false; - await existingSeason.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + existingSeason.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken); } } @@ -97,7 +97,7 @@ namespace MediaBrowser.Providers.TV else if (existingSeason.IsVirtualItem) { existingSeason.IsVirtualItem = false; - await existingSeason.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + existingSeason.UpdateToRepository(ItemUpdateType.MetadataEdit, cancellationToken); } } diff --git a/MediaBrowser.WebDashboard/Api/PackageCreator.cs b/MediaBrowser.WebDashboard/Api/PackageCreator.cs index c855a8d9ba..bb4a98fa86 100644 --- a/MediaBrowser.WebDashboard/Api/PackageCreator.cs +++ b/MediaBrowser.WebDashboard/Api/PackageCreator.cs @@ -265,7 +265,7 @@ namespace MediaBrowser.WebDashboard.Api builder.AppendFormat("window.appMode='{0}';", mode); } - if (string.IsNullOrWhiteSpace(mode)) + else { builder.AppendFormat("window.dashboardVersion='{0}';", version); } diff --git a/MediaBrowser.XbmcMetadata/EntryPoint.cs b/MediaBrowser.XbmcMetadata/EntryPoint.cs index 98460f767e..9cc17481c4 100644 --- a/MediaBrowser.XbmcMetadata/EntryPoint.cs +++ b/MediaBrowser.XbmcMetadata/EntryPoint.cs @@ -52,7 +52,7 @@ namespace MediaBrowser.XbmcMetadata var items = _libraryManager.GetItemList(new InternalItemsQuery { - PersonIds = new [] { person.Id.ToString("N") }, + PersonIds = new[] { person.Id.ToString("N") }, DtoOptions = new DtoOptions(true) }); @@ -84,7 +84,7 @@ namespace MediaBrowser.XbmcMetadata GC.SuppressFinalize(this); } - private async void SaveMetadataForItem(BaseItem item, ItemUpdateType updateReason) + private void SaveMetadataForItem(BaseItem item, ItemUpdateType updateReason) { var locationType = item.LocationType; if (locationType == LocationType.Remote || @@ -105,7 +105,7 @@ namespace MediaBrowser.XbmcMetadata try { - await _providerManager.SaveMetadata(item, updateReason, new[] { BaseNfoSaver.SaverName }).ConfigureAwait(false); + _providerManager.SaveMetadata(item, updateReason, new[] { BaseNfoSaver.SaverName }); } catch (Exception ex) { diff --git a/SharedVersion.cs b/SharedVersion.cs index 75e244625b..9dbc18ddd4 100644 --- a/SharedVersion.cs +++ b/SharedVersion.cs @@ -1,3 +1,3 @@ using System.Reflection; -[assembly: AssemblyVersion("3.2.33.1")] +[assembly: AssemblyVersion("3.2.33.2")]