From 9aea46f82375d0314772fe5e58642b81bbdb6ccf Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 3 Dec 2015 11:45:14 -0500 Subject: [PATCH 1/6] add error handling --- MediaBrowser.Api/ApiEntryPoint.cs | 18 ++++++++---------- MediaBrowser.Api/Library/LibraryHelpers.cs | 5 +++++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index 7f4db5a89f..1abbce4084 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -709,7 +709,10 @@ namespace MediaBrowser.Api public void StartKillTimer(TimerCallback callback, int intervalMs) { - CheckHasExited(); + if (HasExited) + { + return; + } lock (_timerLock) { @@ -728,7 +731,10 @@ namespace MediaBrowser.Api public void ChangeKillTimerIfStarted() { - CheckHasExited(); + if (HasExited) + { + return; + } lock (_timerLock) { @@ -741,14 +747,6 @@ namespace MediaBrowser.Api } } } - - private void CheckHasExited() - { - if (HasExited) - { - throw new ObjectDisposedException("Job"); - } - } } /// diff --git a/MediaBrowser.Api/Library/LibraryHelpers.cs b/MediaBrowser.Api/Library/LibraryHelpers.cs index 111922bcad..2e0afa4116 100644 --- a/MediaBrowser.Api/Library/LibraryHelpers.cs +++ b/MediaBrowser.Api/Library/LibraryHelpers.cs @@ -56,6 +56,11 @@ namespace MediaBrowser.Api.Library /// The app paths. public static void AddMediaPath(IFileSystem fileSystem, string virtualFolderName, string path, IServerApplicationPaths appPaths) { + if (!string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentNullException("path"); + } + if (!fileSystem.DirectoryExists(path)) { throw new DirectoryNotFoundException("The path does not exist."); From b9f1f38318527ddc875a8600ac4893e971f6b197 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 3 Dec 2015 11:46:20 -0500 Subject: [PATCH 2/6] update cache path --- .../Configuration/BaseConfigurationManager.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs index 7bbc1abd77..7f9299ff2c 100644 --- a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs +++ b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs @@ -174,13 +174,9 @@ namespace MediaBrowser.Common.Implementations.Configuration { cachePath = null; } - else if (CommonConfiguration.EnableCustomPathSubFolders) - { - cachePath = Path.Combine(CommonConfiguration.CachePath, "cache"); - } else { - cachePath = CommonConfiguration.CachePath; + cachePath = Path.Combine(CommonConfiguration.CachePath, "cache"); } ((BaseApplicationPaths)CommonApplicationPaths).CachePath = cachePath; From 0efdd17d3f4cf7112ab988d237441900d1625af1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 3 Dec 2015 11:48:21 -0500 Subject: [PATCH 3/6] sync model --- MediaBrowser.Model/ApiClient/ServerCredentials.cs | 5 +++++ MediaBrowser.Model/ApiClient/ServerInfo.cs | 1 + MediaBrowser.Model/Dto/BaseItemDto.cs | 12 ++++++------ MediaBrowser.Model/Dto/IItemDto.cs | 6 ------ MediaBrowser.Model/Dto/UserDto.cs | 6 ------ MediaBrowser.Model/LiveTv/ChannelInfoDto.cs | 6 ------ MediaBrowser.Model/Querying/ItemFields.cs | 5 ----- MediaBrowser.Model/Session/GeneralCommandType.cs | 4 +++- 8 files changed, 15 insertions(+), 30 deletions(-) diff --git a/MediaBrowser.Model/ApiClient/ServerCredentials.cs b/MediaBrowser.Model/ApiClient/ServerCredentials.cs index b5a1a7b499..f9af0fa4ef 100644 --- a/MediaBrowser.Model/ApiClient/ServerCredentials.cs +++ b/MediaBrowser.Model/ApiClient/ServerCredentials.cs @@ -42,6 +42,11 @@ namespace MediaBrowser.Model.ApiClient existing.DateLastAccessed = server.DateLastAccessed; } + if (server.DateLastLocalConnection > existing.DateLastLocalConnection) + { + existing.DateLastLocalConnection = server.DateLastLocalConnection; + } + existing.UserLinkType = server.UserLinkType; if (!string.IsNullOrEmpty(server.AccessToken)) diff --git a/MediaBrowser.Model/ApiClient/ServerInfo.cs b/MediaBrowser.Model/ApiClient/ServerInfo.cs index e1fa581d7b..53ae5be528 100644 --- a/MediaBrowser.Model/ApiClient/ServerInfo.cs +++ b/MediaBrowser.Model/ApiClient/ServerInfo.cs @@ -19,6 +19,7 @@ namespace MediaBrowser.Model.ApiClient public String AccessToken { get; set; } public List WakeOnLanInfos { get; set; } public DateTime DateLastAccessed { get; set; } + public DateTime DateLastLocalConnection { get; set; } public String ExchangeToken { get; set; } public UserLinkType? UserLinkType { get; set; } public ConnectionMode? LastConnectionMode { get; set; } diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs index ff67db1b69..935d280cd2 100644 --- a/MediaBrowser.Model/Dto/BaseItemDto.cs +++ b/MediaBrowser.Model/Dto/BaseItemDto.cs @@ -530,12 +530,6 @@ namespace MediaBrowser.Model.Dto /// The primary image aspect ratio. public double? PrimaryImageAspectRatio { get; set; } - /// - /// Gets or sets the primary image aspect ratio, before image enhancements. - /// - /// The original primary image aspect ratio. - public double? OriginalPrimaryImageAspectRatio { get; set; } - /// /// Gets or sets the artists. /// @@ -560,6 +554,12 @@ namespace MediaBrowser.Model.Dto /// The type of the collection. public string CollectionType { get; set; } + /// + /// Gets or sets the type of the original collection. + /// + /// The type of the original collection. + public string OriginalCollectionType { get; set; } + /// /// Gets or sets the display order. /// diff --git a/MediaBrowser.Model/Dto/IItemDto.cs b/MediaBrowser.Model/Dto/IItemDto.cs index af46d29b9f..3e7d1c6085 100644 --- a/MediaBrowser.Model/Dto/IItemDto.cs +++ b/MediaBrowser.Model/Dto/IItemDto.cs @@ -11,11 +11,5 @@ namespace MediaBrowser.Model.Dto /// /// The primary image aspect ratio. double? PrimaryImageAspectRatio { get; set; } - - /// - /// Gets or sets the original primary image aspect ratio. - /// - /// The original primary image aspect ratio. - double? OriginalPrimaryImageAspectRatio { get; set; } } } diff --git a/MediaBrowser.Model/Dto/UserDto.cs b/MediaBrowser.Model/Dto/UserDto.cs index fc5d2f134a..f133f3343d 100644 --- a/MediaBrowser.Model/Dto/UserDto.cs +++ b/MediaBrowser.Model/Dto/UserDto.cs @@ -122,12 +122,6 @@ namespace MediaBrowser.Model.Dto /// The primary image aspect ratio. public double? PrimaryImageAspectRatio { get; set; } - /// - /// Gets or sets the original primary image aspect ratio. - /// - /// The original primary image aspect ratio. - public double? OriginalPrimaryImageAspectRatio { get; set; } - /// /// Gets a value indicating whether this instance has primary image. /// diff --git a/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs b/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs index fd901f29e8..91493def85 100644 --- a/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs +++ b/MediaBrowser.Model/LiveTv/ChannelInfoDto.cs @@ -105,12 +105,6 @@ namespace MediaBrowser.Model.LiveTv /// The primary image aspect ratio. public double? PrimaryImageAspectRatio { get; set; } - /// - /// Gets or sets the primary image aspect ratio, before image enhancements. - /// - /// The original primary image aspect ratio. - public double? OriginalPrimaryImageAspectRatio { get; set; } - /// /// Gets a value indicating whether this instance has primary image. /// diff --git a/MediaBrowser.Model/Querying/ItemFields.cs b/MediaBrowser.Model/Querying/ItemFields.cs index eea561f72b..e8b1414b79 100644 --- a/MediaBrowser.Model/Querying/ItemFields.cs +++ b/MediaBrowser.Model/Querying/ItemFields.cs @@ -165,11 +165,6 @@ /// PrimaryImageAspectRatio, - /// - /// The original primary image aspect ratio - /// - OriginalPrimaryImageAspectRatio, - /// /// The revenue /// diff --git a/MediaBrowser.Model/Session/GeneralCommandType.cs b/MediaBrowser.Model/Session/GeneralCommandType.cs index 79220f0662..64b61678e2 100644 --- a/MediaBrowser.Model/Session/GeneralCommandType.cs +++ b/MediaBrowser.Model/Session/GeneralCommandType.cs @@ -34,6 +34,8 @@ DisplayContent = 26, GoToSearch = 27, DisplayMessage = 28, - SetRepeatMode = 29 + SetRepeatMode = 29, + ChannelUp = 30, + ChannelDown = 31 } } \ No newline at end of file From c7b10864fe25378147174414c27cd82b262e2da1 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 3 Dec 2015 11:50:26 -0500 Subject: [PATCH 4/6] update dvd parsing --- MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index d2aeead5c9..5a87e76289 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -708,7 +708,7 @@ namespace MediaBrowser.Providers.MediaInfo // Try to eliminate menus and intros by skipping all files at the front of the list that are less than the minimum size // Once we reach a file that is at least the minimum, return all subsequent ones - var allVobs = _fileSystem.GetFiles(root) + var allVobs = _fileSystem.GetFiles(root, true) .Where(file => string.Equals(file.Extension, ".vob", StringComparison.OrdinalIgnoreCase)) .OrderBy(i => i.FullName) .ToList(); From 6c0743a70dfa11bf8603243b27de2aaecb102962 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 3 Dec 2015 11:57:23 -0500 Subject: [PATCH 5/6] update caching headers --- .../HttpServer/HttpResultFactory.cs | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs index 080441dda4..4252d7aa82 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/HttpResultFactory.cs @@ -114,6 +114,12 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// result public object GetOptimizedResult(IRequest requestContext, T result, IDictionary responseHeaders = null) where T : class + { + return GetOptimizedResultInternal(requestContext, result, true, responseHeaders); + } + + private object GetOptimizedResultInternal(IRequest requestContext, T result, bool addCachePrevention, IDictionary responseHeaders = null) + where T : class { if (result == null) { @@ -122,20 +128,27 @@ namespace MediaBrowser.Server.Implementations.HttpServer var optimizedResult = requestContext.ToOptimizedResult(result); - if (responseHeaders != null) + if (responseHeaders == null) { - // Apply headers - var hasOptions = optimizedResult as IHasOptions; + responseHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase); + } - if (hasOptions != null) - { - AddResponseHeaders(hasOptions, responseHeaders); - } + if (addCachePrevention) + { + responseHeaders["Expires"] = "-1"; + } + + // Apply headers + var hasOptions = optimizedResult as IHasOptions; + + if (hasOptions != null) + { + AddResponseHeaders(hasOptions, responseHeaders); } return optimizedResult; } - + /// /// Gets the optimized result using cache. /// @@ -166,7 +179,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer if (responseHeaders == null) { - responseHeaders = new Dictionary(); + responseHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase); } // See if the result is already cached in the browser @@ -177,7 +190,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer return result; } - return GetOptimizedResult(requestContext, factoryFn(), responseHeaders); + return GetOptimizedResultInternal(requestContext, factoryFn(), false, responseHeaders); } /// @@ -209,7 +222,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer if (responseHeaders == null) { - responseHeaders = new Dictionary(); + responseHeaders = new Dictionary(StringComparer.OrdinalIgnoreCase); } // See if the result is already cached in the browser @@ -363,7 +376,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer public object GetStaticResult(IRequest requestContext, StaticResultOptions options) { var cacheKey = options.CacheKey; - options.ResponseHeaders = options.ResponseHeaders ?? new Dictionary(); + options.ResponseHeaders = options.ResponseHeaders ?? new Dictionary(StringComparer.OrdinalIgnoreCase); var contentType = options.ContentType; if (cacheKey == Guid.Empty) From 00bcbfa958a202ca5556c72bea05300ba8004e3e Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 3 Dec 2015 12:03:47 -0500 Subject: [PATCH 6/6] update providers --- .../Manager/MetadataService.cs | 61 ++++++++----- .../Dto/DtoService.cs | 8 -- .../SqliteProviderInfoRepository.cs | 42 ++------- .../Persistence/SqliteUserRepository.cs | 7 +- .../Photos/BaseDynamicImageProvider.cs | 20 +++++ .../Photos/PhotoAlbumImageProvider.cs | 19 +---- .../Sync/MediaSync.cs | 2 +- .../Sync/SyncManager.cs | 1 - .../Sync/SyncRepository.cs | 85 +++++++------------ .../UserViews/DynamicImageProvider.cs | 4 +- .../ApplicationHost.cs | 2 +- 11 files changed, 106 insertions(+), 145 deletions(-) diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 3ed34e5be3..f80b3f14d0 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -50,12 +50,6 @@ namespace MediaBrowser.Providers.Manager protected Task SaveProviderResult(TItemType item, MetadataStatus result, IDirectoryService directoryService) { result.ItemId = item.Id; - result.ItemName = item.Name; - result.ItemType = item.GetType().Name; - - var series = item as IHasSeries; - - result.SeriesName = series == null ? null : series.SeriesName; //var locationType = item.LocationType; @@ -99,7 +93,6 @@ namespace MediaBrowser.Providers.Manager var updateType = ItemUpdateType.None; var refreshResult = GetLastResult(item); - refreshResult.LastErrorMessage = string.Empty; var itemImageProvider = new ItemImageProvider(Logger, ProviderManager, ServerConfigurationManager, FileSystem); var localImagesFailed = false; @@ -119,7 +112,6 @@ namespace MediaBrowser.Providers.Manager { localImagesFailed = true; Logger.ErrorException("Error validating images for {0}", ex, item.Path ?? item.Name ?? "Unknown name"); - refreshResult.AddStatus(ex.Message); } var metadataResult = new MetadataResult @@ -150,7 +142,6 @@ namespace MediaBrowser.Providers.Manager var result = await RefreshWithProviders(metadataResult, id, refreshOptions, providers, itemImageProvider, cancellationToken).ConfigureAwait(false); updateType = updateType | result.UpdateType; - refreshResult.AddStatus(result.ErrorMessage); if (result.Failures == 0) { refreshResult.SetDateLastMetadataRefresh(DateTime.UtcNow); @@ -172,7 +163,6 @@ namespace MediaBrowser.Providers.Manager var result = await itemImageProvider.RefreshImages(itemOfType, providers, refreshOptions, config, cancellationToken).ConfigureAwait(false); updateType = updateType | result.UpdateType; - refreshResult.AddStatus(result.ErrorMessage); if (result.Failures == 0) { refreshResult.SetDateLastImagesRefresh(DateTime.UtcNow); @@ -231,17 +221,7 @@ namespace MediaBrowser.Providers.Manager private DateTime GetLastRefreshDate(IHasMetadata item) { - if (item.DateLastRefreshed != default(DateTime)) - { - return item.DateLastRefreshed; - } - - if (ServerConfigurationManager.Configuration.EnableDateLastRefresh) - { - return item.DateLastRefreshed; - } - - if (item is BoxSet || (item is IItemByName && !(item is MusicArtist))) + if (EnableDateLastRefreshed(item)) { return item.DateLastRefreshed; } @@ -249,6 +229,26 @@ namespace MediaBrowser.Providers.Manager return item.DateLastSaved; } + private bool EnableDateLastRefreshed(IHasMetadata item) + { + if (ServerConfigurationManager.Configuration.EnableDateLastRefresh) + { + return true; + } + + if (item.DateLastRefreshed != default(DateTime)) + { + return true; + } + + if (item is BoxSet || (item is IItemByName && !(item is MusicArtist))) + { + return true; + } + + return false; + } + protected async Task SaveItem(MetadataResult result, ItemUpdateType reason, CancellationToken cancellationToken) { if (result.Item.SupportsPeople && result.People != null) @@ -668,7 +668,14 @@ namespace MediaBrowser.Providers.Manager { try { - return changeMonitor.HasChanged(item, status, directoryService); + var hasChanged = changeMonitor.HasChanged(item, status, directoryService); + + //if (hasChanged) + //{ + // Logger.Debug("{0} reports change to {1}", changeMonitor.GetType().Name, item.Path ?? item.Name); + //} + + return hasChanged; } catch (Exception ex) { @@ -681,7 +688,15 @@ namespace MediaBrowser.Providers.Manager { try { - return changeMonitor.HasChanged(item, directoryService, date); + var hasChanged = changeMonitor.HasChanged(item, directoryService, date); + + //if (hasChanged) + //{ + // Logger.Debug("{0} reports change to {1} since {2}", changeMonitor.GetType().Name, + // item.Path ?? item.Name, date); + //} + + return hasChanged; } catch (Exception ex) { diff --git a/MediaBrowser.Server.Implementations/Dto/DtoService.cs b/MediaBrowser.Server.Implementations/Dto/DtoService.cs index 20e1eb5434..bb7f818bad 100644 --- a/MediaBrowser.Server.Implementations/Dto/DtoService.cs +++ b/MediaBrowser.Server.Implementations/Dto/DtoService.cs @@ -1765,14 +1765,6 @@ namespace MediaBrowser.Server.Implementations.Dto return; } - if (fields.Contains(ItemFields.OriginalPrimaryImageAspectRatio)) - { - if (size.Width > 0 && size.Height > 0) - { - dto.OriginalPrimaryImageAspectRatio = size.Width / size.Height; - } - } - var supportedEnhancers = _imageProcessor.GetSupportedEnhancers(item, ImageType.Primary).ToList(); foreach (var enhancer in supportedEnhancers) diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs index e7853b4580..dbceda727b 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteProviderInfoRepository.cs @@ -47,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.Persistence string[] queries = { - "create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, ItemName TEXT, ItemType TEXT, SeriesName TEXT, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, LastErrorMessage TEXT, ItemDateModified DateTimeNull)", + "create table if not exists MetadataStatus (ItemId GUID PRIMARY KEY, DateLastMetadataRefresh datetime, DateLastImagesRefresh datetime, ItemDateModified DateTimeNull)", "create index if not exists idx_MetadataStatus on MetadataStatus(ItemId)", //pragmas @@ -66,12 +66,8 @@ namespace MediaBrowser.Server.Implementations.Persistence private static readonly string[] StatusColumns = { "ItemId", - "ItemName", - "ItemType", - "SeriesName", "DateLastMetadataRefresh", "DateLastImagesRefresh", - "LastErrorMessage", "ItemDateModified" }; @@ -160,37 +156,17 @@ namespace MediaBrowser.Server.Implementations.Persistence if (!reader.IsDBNull(1)) { - result.ItemName = reader.GetString(1); + result.DateLastMetadataRefresh = reader.GetDateTime(1).ToUniversalTime(); } if (!reader.IsDBNull(2)) { - result.ItemName = reader.GetString(2); + result.DateLastImagesRefresh = reader.GetDateTime(2).ToUniversalTime(); } if (!reader.IsDBNull(3)) { - result.SeriesName = reader.GetString(3); - } - - if (!reader.IsDBNull(4)) - { - result.DateLastMetadataRefresh = reader.GetDateTime(4).ToUniversalTime(); - } - - if (!reader.IsDBNull(5)) - { - result.DateLastImagesRefresh = reader.GetDateTime(5).ToUniversalTime(); - } - - if (!reader.IsDBNull(6)) - { - result.LastErrorMessage = reader.GetString(6); - } - - if (!reader.IsDBNull(7)) - { - result.ItemDateModified = reader.GetDateTime(7).ToUniversalTime(); + result.ItemDateModified = reader.GetDateTime(3).ToUniversalTime(); } return result; @@ -214,13 +190,9 @@ namespace MediaBrowser.Server.Implementations.Persistence transaction = _connection.BeginTransaction(); _saveStatusCommand.GetParameter(0).Value = status.ItemId; - _saveStatusCommand.GetParameter(1).Value = status.ItemName; - _saveStatusCommand.GetParameter(2).Value = status.ItemType; - _saveStatusCommand.GetParameter(3).Value = status.SeriesName; - _saveStatusCommand.GetParameter(4).Value = status.DateLastMetadataRefresh; - _saveStatusCommand.GetParameter(5).Value = status.DateLastImagesRefresh; - _saveStatusCommand.GetParameter(6).Value = status.LastErrorMessage; - _saveStatusCommand.GetParameter(7).Value = status.ItemDateModified; + _saveStatusCommand.GetParameter(1).Value = status.DateLastMetadataRefresh; + _saveStatusCommand.GetParameter(2).Value = status.DateLastImagesRefresh; + _saveStatusCommand.GetParameter(3).Value = status.ItemDateModified; _saveStatusCommand.Transaction = transaction; diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs index ad784ae5d6..9bd7e47f39 100644 --- a/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs +++ b/MediaBrowser.Server.Implementations/Persistence/SqliteUserRepository.cs @@ -144,15 +144,18 @@ namespace MediaBrowser.Server.Implementations.Persistence { using (var cmd = _connection.CreateCommand()) { - cmd.CommandText = "select data from users"; + cmd.CommandText = "select guid,data from users"; using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult)) { while (reader.Read()) { - using (var stream = reader.GetMemoryStream(0)) + var id = reader.GetGuid(0); + + using (var stream = reader.GetMemoryStream(1)) { var user = _jsonSerializer.DeserializeFromStream(stream); + user.Id = id; yield return user; } } diff --git a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs index fd34e32482..c30d35ed2d 100644 --- a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs +++ b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs @@ -285,5 +285,25 @@ namespace MediaBrowser.Server.Implementations.Photos return 0; } } + + protected async Task CreateSingleImage(List itemsWithImages, string outputPathWithoutExtension, ImageType imageType) + { + var image = itemsWithImages + .Where(i => i.HasImage(imageType) && i.GetImageInfo(imageType, 0).IsLocalFile && Path.HasExtension(i.GetImagePath(imageType))) + .Select(i => i.GetImagePath(imageType)) + .FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(image)) + { + return null; + } + + var ext = Path.GetExtension(image); + + var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ext); + File.Copy(image, outputPath); + + return outputPath; + } } } diff --git a/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs index 3abb7e70e3..56a1747561 100644 --- a/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs +++ b/MediaBrowser.Server.Implementations/Photos/PhotoAlbumImageProvider.cs @@ -26,24 +26,9 @@ namespace MediaBrowser.Server.Implementations.Photos return Task.FromResult(items); } - protected override async Task CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + protected override Task CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) { - var image = itemsWithImages - .Where(i => i.HasImage(ImageType.Primary) && i.GetImageInfo(ImageType.Primary, 0).IsLocalFile && Path.HasExtension(i.GetImagePath(ImageType.Primary))) - .Select(i => i.GetImagePath(ImageType.Primary)) - .FirstOrDefault(); - - if (string.IsNullOrWhiteSpace(image)) - { - return null; - } - - var ext = Path.GetExtension(image); - - var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ext); - File.Copy(image, outputPath); - - return outputPath; + return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); } } } diff --git a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs index cff72ae583..fd2f8ae8d6 100644 --- a/MediaBrowser.Server.Implementations/Sync/MediaSync.cs +++ b/MediaBrowser.Server.Implementations/Sync/MediaSync.cs @@ -66,7 +66,7 @@ namespace MediaBrowser.Server.Implementations.Sync // Do the data sync twice so the server knows what was removed from the device await SyncData(provider, dataProvider, serverId, target, cancellationToken).ConfigureAwait(false); - + progress.Report(100); } diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index c715c3f50d..db6a753b76 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -640,7 +640,6 @@ namespace MediaBrowser.Server.Implementations.Sync dtoOptions.Fields.Remove(ItemFields.MediaStreams); dtoOptions.Fields.Remove(ItemFields.IndexOptions); dtoOptions.Fields.Remove(ItemFields.MediaSourceCount); - dtoOptions.Fields.Remove(ItemFields.OriginalPrimaryImageAspectRatio); dtoOptions.Fields.Remove(ItemFields.Path); dtoOptions.Fields.Remove(ItemFields.SeriesGenres); dtoOptions.Fields.Remove(ItemFields.Settings); diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index 75c9290164..d266a534d7 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -17,12 +17,9 @@ using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Sync { - public class SyncRepository : ISyncRepository, IDisposable + public class SyncRepository : BaseSqliteRepository, ISyncRepository { private IDbConnection _connection; - private readonly ILogger _logger; - private readonly SemaphoreSlim _writeLock = new SemaphoreSlim(1, 1); - private readonly IServerApplicationPaths _appPaths; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private IDbCommand _insertJobCommand; @@ -34,19 +31,20 @@ namespace MediaBrowser.Server.Implementations.Sync private IDbCommand _updateJobItemCommand; private readonly IJsonSerializer _json; + private readonly IServerApplicationPaths _appPaths; - public SyncRepository(ILogger logger, IServerApplicationPaths appPaths, IJsonSerializer json) + public SyncRepository(ILogManager logManager, IJsonSerializer json, IServerApplicationPaths appPaths) + : base(logManager) { - _logger = logger; - _appPaths = appPaths; _json = json; + _appPaths = appPaths; } public async Task Initialize() { var dbFile = Path.Combine(_appPaths.DataPath, "sync14.db"); - _connection = await SqliteExtensions.ConnectToDb(dbFile, _logger).ConfigureAwait(false); + _connection = await SqliteExtensions.ConnectToDb(dbFile, Logger).ConfigureAwait(false); string[] queries = { @@ -62,10 +60,10 @@ namespace MediaBrowser.Server.Implementations.Sync "pragma shrink_memory" }; - _connection.RunQueries(queries, _logger); + _connection.RunQueries(queries, Logger); - _connection.AddColumn(_logger, "SyncJobs", "Profile", "TEXT"); - _connection.AddColumn(_logger, "SyncJobs", "Bitrate", "INT"); + _connection.AddColumn(Logger, "SyncJobs", "Profile", "TEXT"); + _connection.AddColumn(Logger, "SyncJobs", "Bitrate", "INT"); PrepareStatements(); } @@ -298,7 +296,7 @@ namespace MediaBrowser.Server.Implementations.Sync CheckDisposed(); - await _writeLock.WaitAsync().ConfigureAwait(false); + await WriteLock.WaitAsync().ConfigureAwait(false); IDbTransaction transaction = null; @@ -344,7 +342,7 @@ namespace MediaBrowser.Server.Implementations.Sync } catch (Exception e) { - _logger.ErrorException("Failed to save record:", e); + Logger.ErrorException("Failed to save record:", e); if (transaction != null) { @@ -360,7 +358,7 @@ namespace MediaBrowser.Server.Implementations.Sync transaction.Dispose(); } - _writeLock.Release(); + WriteLock.Release(); } } @@ -373,7 +371,7 @@ namespace MediaBrowser.Server.Implementations.Sync CheckDisposed(); - await _writeLock.WaitAsync().ConfigureAwait(false); + await WriteLock.WaitAsync().ConfigureAwait(false); IDbTransaction transaction = null; @@ -405,7 +403,7 @@ namespace MediaBrowser.Server.Implementations.Sync } catch (Exception e) { - _logger.ErrorException("Failed to save record:", e); + Logger.ErrorException("Failed to save record:", e); if (transaction != null) { @@ -421,7 +419,7 @@ namespace MediaBrowser.Server.Implementations.Sync transaction.Dispose(); } - _writeLock.Release(); + WriteLock.Release(); } } @@ -656,7 +654,7 @@ namespace MediaBrowser.Server.Implementations.Sync CheckDisposed(); - await _writeLock.WaitAsync().ConfigureAwait(false); + await WriteLock.WaitAsync().ConfigureAwait(false); IDbTransaction transaction = null; @@ -699,7 +697,7 @@ namespace MediaBrowser.Server.Implementations.Sync } catch (Exception e) { - _logger.ErrorException("Failed to save record:", e); + Logger.ErrorException("Failed to save record:", e); if (transaction != null) { @@ -715,7 +713,7 @@ namespace MediaBrowser.Server.Implementations.Sync transaction.Dispose(); } - _writeLock.Release(); + WriteLock.Release(); } } @@ -802,15 +800,6 @@ namespace MediaBrowser.Server.Implementations.Sync return item; } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - private bool _disposed; private void CheckDisposed() { @@ -820,38 +809,26 @@ namespace MediaBrowser.Server.Implementations.Sync } } - private readonly object _disposeLock = new object(); - - /// - /// Releases unmanaged and - optionally - managed resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected virtual void Dispose(bool dispose) + protected override void Dispose(bool dispose) { if (dispose) { _disposed = true; + } + base.Dispose(dispose); + } - try + protected override void CloseConnection() + { + if (_connection != null) + { + if (_connection.IsOpen()) { - lock (_disposeLock) - { - if (_connection != null) - { - if (_connection.IsOpen()) - { - _connection.Close(); - } + _connection.Close(); + } - _connection.Dispose(); - _connection = null; - } - } - } - catch (Exception ex) - { - _logger.ErrorException("Error disposing database", ex); - } + _connection.Dispose(); + _connection = null; } } } diff --git a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs index cdffadcd7d..167b5706ee 100644 --- a/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs +++ b/MediaBrowser.Server.Implementations/UserViews/DynamicImageProvider.cs @@ -54,9 +54,7 @@ namespace MediaBrowser.Server.Implementations.UserViews return new List(); } - if (string.Equals(view.ViewType, SpecialFolder.GameGenre, StringComparison.OrdinalIgnoreCase) || - string.Equals(view.ViewType, SpecialFolder.MusicGenre, StringComparison.OrdinalIgnoreCase) || - string.Equals(view.ViewType, SpecialFolder.MovieGenre, StringComparison.OrdinalIgnoreCase) || + if (string.Equals(view.ViewType, SpecialFolder.MovieGenre, StringComparison.OrdinalIgnoreCase) || string.Equals(view.ViewType, SpecialFolder.TvGenre, StringComparison.OrdinalIgnoreCase)) { var userItemsResult = await view.GetItems(new InternalItemsQuery diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs index 97a457a1b6..99a7f0a152 100644 --- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs +++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs @@ -680,7 +680,7 @@ namespace MediaBrowser.Server.Startup.Common private async Task GetSyncRepository() { - var repo = new SyncRepository(LogManager.GetLogger("SyncRepository"), ServerConfigurationManager.ApplicationPaths, JsonSerializer); + var repo = new SyncRepository(LogManager, JsonSerializer, ServerConfigurationManager.ApplicationPaths); await repo.Initialize().ConfigureAwait(false);