Răsfoiți Sursa

remove unneeded async signatures

Luke Pulverenti 7 ani în urmă
părinte
comite
a5b82cd2ec
32 a modificat fișierele cu 233 adăugiri și 340 ștergeri
  1. 13 19
      Emby.Server.Implementations/Channels/ChannelManager.cs
  2. 2 2
      Emby.Server.Implementations/Collections/CollectionManager.cs
  3. 5 12
      Emby.Server.Implementations/IO/FileRefresher.cs
  4. 9 10
      Emby.Server.Implementations/Library/LibraryManager.cs
  5. 3 4
      Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs
  6. 1 1
      Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
  7. 5 5
      Emby.Server.Implementations/Library/UserViewManager.cs
  8. 30 39
      Emby.Server.Implementations/LiveTv/LiveTvManager.cs
  9. 3 3
      Emby.Server.Implementations/Playlists/PlaylistManager.cs
  10. 5 5
      MediaBrowser.Api/ChannelService.cs
  11. 7 13
      MediaBrowser.Api/Images/ImageService.cs
  12. 7 7
      MediaBrowser.Api/Images/RemoteImageService.cs
  13. 2 9
      MediaBrowser.Api/ItemUpdateService.cs
  14. 7 7
      MediaBrowser.Api/LiveTv/LiveTvService.cs
  15. 16 30
      MediaBrowser.Api/VideosService.cs
  16. 2 3
      MediaBrowser.Controller/Channels/IChannelManager.cs
  17. 21 24
      MediaBrowser.Controller/Entities/BaseItem.cs
  18. 6 7
      MediaBrowser.Controller/Entities/Folder.cs
  19. 2 9
      MediaBrowser.Controller/Entities/IHasMetadata.cs
  20. 1 2
      MediaBrowser.Controller/Entities/User.cs
  21. 48 52
      MediaBrowser.Controller/Entities/UserViewBuilder.cs
  22. 17 16
      MediaBrowser.Controller/Entities/Video.cs
  23. 3 9
      MediaBrowser.Controller/Library/ILibraryManager.cs
  24. 2 2
      MediaBrowser.Controller/Library/IUserViewManager.cs
  25. 5 15
      MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
  26. 0 5
      MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
  27. 0 5
      MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
  28. 2 6
      MediaBrowser.Controller/Providers/IProviderManager.cs
  29. 2 2
      MediaBrowser.Providers/Manager/MetadataService.cs
  30. 2 12
      MediaBrowser.Providers/Manager/ProviderManager.cs
  31. 2 2
      MediaBrowser.Providers/TV/DummySeasonProvider.cs
  32. 3 3
      MediaBrowser.XbmcMetadata/EntryPoint.cs

+ 13 - 19
Emby.Server.Implementations/Channels/ChannelManager.cs

@@ -373,7 +373,7 @@ namespace Emby.Server.Implementations.Channels
 
         private async Task<Channel> 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<BaseItem>
             {
@@ -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<BaseItem> 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<BaseItemDto> 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<Folder> 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);
         }
     }
 

+ 2 - 2
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

+ 5 - 12
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<double>(), CancellationToken.None);
-                return;
-            }
-
             foreach (var item in itemsToRefresh)
             {
+                if (item is AggregateFolder)
+                {
+                    continue;
+                }
+
                 Logger.Info(item.Name + " (" + item.Path + ") will be refreshed.");
 
                 try

+ 9 - 10
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
         /// <param name="updateReason">The update reason.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task.</returns>
-        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<UserView> 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<UserView> 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();
         }

+ 3 - 4
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<BaseItem> channelTrailers)
+        private void AssignTrailers(IHasTrailers item, IEnumerable<BaseItem> 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);
             }
         }
     }

+ 1 - 1
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)
             {

+ 5 - 5
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<UserView> 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<UserView> 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);
 

+ 30 - 39
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -173,11 +173,11 @@ namespace Emby.Server.Implementations.LiveTv
             }
         }
 
-        public async Task<QueryResult<BaseItem>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken)
+        public QueryResult<BaseItem> 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<LiveTvProgram, bool, bool>(item, isNew, isUpdated);
         }
 
-        private async Task<Guid> 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<QueryResult<BaseItem>> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken)
+        public QueryResult<BaseItem> 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<QueryResult<BaseItemDto>> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken)
+        public QueryResult<BaseItemDto> 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<LiveTvChannel>();
 
             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<double>(), cancellationToken).ConfigureAwait(false);
 
@@ -1726,7 +1725,7 @@ namespace Emby.Server.Implementations.LiveTv
                 return new QueryResult<BaseItem>();
             }
 
-            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<string, SortOrder>(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<BaseItem>();
@@ -2910,11 +2901,11 @@ namespace Emby.Server.Implementations.LiveTv
             return service.ResetTuner(parts[1], cancellationToken);
         }
 
-        public async Task<BaseItemDto> 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<Folder> 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<TunerHostInfo> SaveTunerHost(TunerHostInfo info, bool dataSourceChanged = true)

+ 3 - 3
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)

+ 5 - 5
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)

+ 7 - 13
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);
         }
 
         /// <summary>
@@ -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);
         }
 
         /// <summary>
@@ -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);
         }
 
         /// <summary>
@@ -510,9 +504,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 +552,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 +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);
             }
         }
     }

+ 7 - 7
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)
             {
@@ -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);
         }
 

+ 2 - 9
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);
                 }
             }
         }

+ 7 - 7
MediaBrowser.Api/LiveTv/LiveTvService.cs

@@ -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);
 
@@ -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);
         }

+ 16 - 30
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.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);
         }
     }
 }

+ 2 - 3
MediaBrowser.Controller/Channels/IChannelManager.cs

@@ -117,14 +117,13 @@ namespace MediaBrowser.Controller.Channels
         /// </summary>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>BaseItemDto.</returns>
-        Task<Folder> GetInternalChannelFolder(CancellationToken cancellationToken);
+        Folder GetInternalChannelFolder(CancellationToken cancellationToken);
 
         /// <summary>
         /// Gets the channel folder.
         /// </summary>
         /// <param name="userId">The user identifier.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>BaseItemDto.</returns>
-        Task<BaseItemDto> GetChannelFolder(string userId, CancellationToken cancellationToken);
+        BaseItemDto GetChannelFolder(string userId, CancellationToken cancellationToken);
     }
 }

+ 21 - 24
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
         /// <param name="type">The type.</param>
         /// <param name="index">The index.</param>
         /// <returns>Task.</returns>
-        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);
         }
 
         /// <summary>
@@ -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<ExternalUrl> GetRelatedUrls()
         {
             return new List<ExternalUrl>();

+ 6 - 7
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);

+ 2 - 9
MediaBrowser.Controller/Entities/IHasMetadata.cs

@@ -151,11 +151,7 @@ namespace MediaBrowser.Controller.Entities
         /// <summary>
         /// Swaps the images.
         /// </summary>
-        /// <param name="type">The type.</param>
-        /// <param name="index1">The index1.</param>
-        /// <param name="index2">The index2.</param>
-        /// <returns>Task.</returns>
-        Task SwapImages(ImageType type, int index1, int index2);
+        void SwapImages(ImageType type, int index1, int index2);
 
         /// <summary>
         /// Gets or sets the primary image path.
@@ -249,10 +245,7 @@ namespace MediaBrowser.Controller.Entities
         /// <summary>
         /// Updates to repository.
         /// </summary>
-        /// <param name="updateReason">The update reason.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken);
+        void UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken);
 
         /// <summary>
         /// Sets the image.

+ 1 - 2
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);
         }
 
         /// <summary>

+ 48 - 52
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<QueryResult<BaseItem>> GetMusicFolders(Folder parent, User user, InternalItemsQuery query)
+        private QueryResult<BaseItem> GetMusicFolders(Folder parent, User user, InternalItemsQuery query)
         {
             if (query.Recursive)
             {
@@ -262,25 +262,25 @@ namespace MediaBrowser.Controller.Entities
 
             var list = new List<BaseItem>();
 
-            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<QueryResult<BaseItem>> GetMusicFavorites(Folder parent, User user, InternalItemsQuery query)
+        private QueryResult<BaseItem> GetMusicFavorites(Folder parent, User user, InternalItemsQuery query)
         {
             var list = new List<BaseItem>();
 
-            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<QueryResult<BaseItem>> GetMovieFolders(Folder parent, User user, InternalItemsQuery query)
+        private QueryResult<BaseItem> GetMovieFolders(Folder parent, User user, InternalItemsQuery query)
         {
             if (query.Recursive)
             {
@@ -443,12 +443,12 @@ namespace MediaBrowser.Controller.Entities
 
             var list = new List<BaseItem>();
 
-            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<QueryResult<BaseItem>> GetMovieGenres(Folder parent, User user, InternalItemsQuery query)
+        private QueryResult<BaseItem> 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<QueryResult<BaseItem>> GetTvView(Folder parent, User user, InternalItemsQuery query)
+        private QueryResult<BaseItem> GetTvView(Folder parent, User user, InternalItemsQuery query)
         {
             if (query.Recursive)
             {
@@ -615,13 +613,13 @@ namespace MediaBrowser.Controller.Entities
 
             var list = new List<BaseItem>();
 
-            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<QueryResult<BaseItem>> GetTvGenres(Folder parent, User user, InternalItemsQuery query)
+        private QueryResult<BaseItem> 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<BaseItem>();
 
             //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<UserView> 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<UserView> 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);
         }

+ 17 - 16
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);
             }
         }
 

+ 3 - 9
MediaBrowser.Controller/Library/ILibraryManager.cs

@@ -207,11 +207,7 @@ namespace MediaBrowser.Controller.Library
         /// <summary>
         /// Updates the item.
         /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="updateReason">The update reason.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken);
+        void UpdateItem(BaseItem item, ItemUpdateType updateReason, CancellationToken cancellationToken);
 
         /// <summary>
         /// Retrieves the item.
@@ -330,8 +326,7 @@ namespace MediaBrowser.Controller.Library
         /// <param name="viewType">Type of the view.</param>
         /// <param name="sortName">Name of the sort.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;UserView&gt;.</returns>
-        Task<UserView> GetNamedView(string name,
+        UserView GetNamedView(string name,
             string viewType,
             string sortName,
             CancellationToken cancellationToken);
@@ -345,8 +340,7 @@ namespace MediaBrowser.Controller.Library
         /// <param name="sortName">Name of the sort.</param>
         /// <param name="uniqueId">The unique identifier.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task&lt;UserView&gt;.</returns>
-        Task<UserView> GetNamedView(string name,
+        UserView GetNamedView(string name,
             string parentId,
             string viewType,
             string sortName,

+ 2 - 2
MediaBrowser.Controller/Library/IUserViewManager.cs

@@ -13,9 +13,9 @@ namespace MediaBrowser.Controller.Library
     {
         Task<Folder[]> GetUserViews(UserViewQuery query, CancellationToken cancellationToken);
 
-        Task<UserView> GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken);
+        UserView GetUserSubView(string name, string parentId, string type, string sortName, CancellationToken cancellationToken);
 
-        Task<UserView> GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken);
+        UserView GetUserSubView(string category, string type, string sortName, CancellationToken cancellationToken);
 
         List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options);
     }

+ 5 - 15
MediaBrowser.Controller/LiveTv/ILiveTvManager.cs

@@ -236,14 +236,12 @@ namespace MediaBrowser.Controller.LiveTv
         /// <param name="query">The query.</param>
         /// <param name="options">The options.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task{QueryResult{ProgramInfoDto}}.</returns>
-        Task<QueryResult<BaseItemDto>> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken);
+        QueryResult<BaseItemDto> GetRecommendedPrograms(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken);
 
         /// <summary>
         /// Gets the recommended programs internal.
         /// </summary>
-        /// <returns>Task&lt;QueryResult&lt;LiveTvProgram&gt;&gt;.</returns>
-        Task<QueryResult<BaseItem>> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken);
+        QueryResult<BaseItem> GetRecommendedProgramsInternal(RecommendedProgramQuery query, DtoOptions options, CancellationToken cancellationToken);
 
         /// <summary>
         /// Gets the live tv information.
@@ -264,8 +262,7 @@ namespace MediaBrowser.Controller.LiveTv
         /// Gets the live tv folder.
         /// </summary>
         /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>BaseItemDto.</returns>
-        Task<Folder> GetInternalLiveTvFolder(CancellationToken cancellationToken);
+        Folder GetInternalLiveTvFolder(CancellationToken cancellationToken);
 
         /// <summary>
         /// Gets the live tv folder.
@@ -273,7 +270,7 @@ namespace MediaBrowser.Controller.LiveTv
         /// <param name="userId">The user identifier.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>BaseItemDto.</returns>
-        Task<BaseItemDto> GetLiveTvFolder(string userId, CancellationToken cancellationToken);
+        BaseItemDto GetLiveTvFolder(string userId, CancellationToken cancellationToken);
 
         /// <summary>
         /// Gets the enabled users.
@@ -284,7 +281,7 @@ namespace MediaBrowser.Controller.LiveTv
         /// <summary>
         /// Gets the internal channels.
         /// </summary>
-        Task<QueryResult<BaseItem>> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken);
+        QueryResult<BaseItem> GetInternalChannels(LiveTvChannelQuery query, DtoOptions dtoOptions, CancellationToken cancellationToken);
 
         /// <summary>
         /// Gets the internal recordings.
@@ -362,13 +359,6 @@ namespace MediaBrowser.Controller.LiveTv
         /// <param name="user">The user.</param>
         void AddChannelInfo(List<Tuple<BaseItemDto, LiveTvChannel>> items, DtoOptions options, User user);
 
-        /// <summary>
-        /// Called when [recording file deleted].
-        /// </summary>
-        /// <param name="recording">The recording.</param>
-        /// <returns>Task.</returns>
-        Task OnRecordingFileDeleted(BaseItem recording);
-
         Task<List<ChannelInfo>> GetChannelsForListingsProvider(string id, CancellationToken cancellationToken);
         Task<List<ChannelInfo>> GetChannelsFromListingsProviderData(string id, CancellationToken cancellationToken);
 

+ 0 - 5
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);
-        }
     }
 }

+ 0 - 5
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);
-        }
     }
 }

+ 2 - 6
MediaBrowser.Controller/Providers/IProviderManager.cs

@@ -119,16 +119,12 @@ namespace MediaBrowser.Controller.Providers
         /// <param name="item">The item.</param>
         /// <param name="updateType">Type of the update.</param>
         /// <returns>Task.</returns>
-        Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType);
+        void SaveMetadata(IHasMetadata item, ItemUpdateType updateType);
 
         /// <summary>
         /// Saves the metadata.
         /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="updateType">Type of the update.</param>
-        /// <param name="savers">The savers.</param>
-        /// <returns>Task.</returns>
-        Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers);
+        void SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers);
 
         /// <summary>
         /// Gets the metadata options.

+ 2 - 2
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<PersonInfo> 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);
                     }
                 }
             }

+ 2 - 12
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -560,30 +560,20 @@ namespace MediaBrowser.Providers.Manager
                 new MetadataOptions();
         }
 
-        private Task _completedTask = Task.FromResult(true);
         /// <summary>
         /// Saves the metadata.
         /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="updateType">Type of the update.</param>
-        /// <returns>Task.</returns>
-        public Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType)
+        public void SaveMetadata(IHasMetadata item, ItemUpdateType updateType)
         {
             SaveMetadata(item, updateType, _savers);
-            return _completedTask;
         }
 
         /// <summary>
         /// Saves the metadata.
         /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="updateType">Type of the update.</param>
-        /// <param name="savers">The savers.</param>
-        /// <returns>Task.</returns>
-        public Task SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers)
+        public void SaveMetadata(IHasMetadata item, ItemUpdateType updateType, IEnumerable<string> savers)
         {
             SaveMetadata(item, updateType, _savers.Where(i => savers.Contains(i.Name, StringComparer.OrdinalIgnoreCase)));
-            return _completedTask;
         }
 
         /// <summary>

+ 2 - 2
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);
                 }
             }
 

+ 3 - 3
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)
             {