diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs | 133 |
1 files changed, 20 insertions, 113 deletions
diff --git a/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs b/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs index dea868848..676adad34 100644 --- a/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs +++ b/MediaBrowser.Server.Implementations/Sync/TargetDataProvider.cs @@ -1,5 +1,4 @@ using MediaBrowser.Common.Configuration; -using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; using MediaBrowser.Controller; using MediaBrowser.Controller.Sync; @@ -12,6 +11,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Interfaces.IO; namespace MediaBrowser.Server.Implementations.Sync { @@ -29,8 +29,6 @@ namespace MediaBrowser.Server.Implementations.Sync private readonly IApplicationPaths _appPaths; private readonly IServerApplicationHost _appHost; - private readonly SemaphoreSlim _cacheFileLock = new SemaphoreSlim(1, 1); - public TargetDataProvider(IServerSyncProvider provider, SyncTarget target, IServerApplicationHost appHost, ILogger logger, IJsonSerializer json, IFileSystem fileSystem, IApplicationPaths appPaths) { _logger = logger; @@ -42,12 +40,7 @@ namespace MediaBrowser.Server.Implementations.Sync _appHost = appHost; } - private string GetCachePath() - { - return Path.Combine(_appPaths.DataPath, "sync", _target.Id.GetMD5().ToString("N") + ".json"); - } - - private string GetRemotePath() + private string[] GetRemotePath() { var parts = new List<string> { @@ -57,7 +50,7 @@ namespace MediaBrowser.Server.Implementations.Sync parts = parts.Select(i => GetValidFilename(_provider, i)).ToList(); - return _provider.GetFullPath(parts, _target); + return parts.ToArray(); } private string GetValidFilename(IServerSyncProvider provider, string filename) @@ -66,58 +59,29 @@ namespace MediaBrowser.Server.Implementations.Sync return _fileSystem.GetValidFilename(filename); } - private async Task CacheData(Stream stream) - { - var cachePath = GetCachePath(); - - await _cacheFileLock.WaitAsync().ConfigureAwait(false); - - try - { - Directory.CreateDirectory(Path.GetDirectoryName(cachePath)); - using (var fileStream = _fileSystem.GetFileStream(cachePath, FileMode.Create, FileAccess.Write, FileShare.Read, true)) - { - await stream.CopyToAsync(fileStream).ConfigureAwait(false); - } - } - catch (Exception ex) - { - _logger.ErrorException("Error saving sync data to {0}", ex, cachePath); - } - finally - { - _cacheFileLock.Release(); - } - } - private async Task EnsureData(CancellationToken cancellationToken) { if (_items == null) { - try + _logger.Debug("Getting {0} from {1}", string.Join(MediaSync.PathSeparatorString, GetRemotePath().ToArray()), _provider.Name); + + var fileResult = await _provider.GetFiles(new FileQuery + { + FullPath = GetRemotePath().ToArray() + + }, _target, cancellationToken).ConfigureAwait(false); + + if (fileResult.Items.Length > 0) { - using (var stream = await _provider.GetFile(GetRemotePath(), _target, new Progress<double>(), cancellationToken)) + using (var stream = await _provider.GetFile(fileResult.Items[0].Id, _target, new Progress<double>(), cancellationToken)) { _items = _json.DeserializeFromStream<List<LocalItem>>(stream); } } - catch (FileNotFoundException) - { - _items = new List<LocalItem>(); - } - catch (DirectoryNotFoundException) + else { _items = new List<LocalItem>(); } - - using (var memoryStream = new MemoryStream()) - { - _json.SerializeToStream(_items, memoryStream); - - // Now cache it - memoryStream.Position = 0; - await CacheData(memoryStream).ConfigureAwait(false); - } } } @@ -130,10 +94,6 @@ namespace MediaBrowser.Server.Implementations.Sync // Save to sync provider stream.Position = 0; await _provider.SendFile(stream, GetRemotePath(), _target, new Progress<double>(), cancellationToken).ConfigureAwait(false); - - // Now cache it - stream.Position = 0; - await CacheData(stream).ConfigureAwait(false); } } @@ -171,14 +131,9 @@ namespace MediaBrowser.Server.Implementations.Sync } } - public Task<List<string>> GetServerItemIds(SyncTarget target, string serverId) + public Task<List<LocalItem>> GetLocalItems(SyncTarget target, string serverId) { - return GetData(items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase)).Select(i => i.ItemId).ToList()); - } - - public Task<List<string>> GetSyncJobItemIds(SyncTarget target, string serverId) - { - return GetData(items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase)).Select(i => i.SyncJobItemId).Where(i => !string.IsNullOrWhiteSpace(i)).ToList()); + return GetData(items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase)).ToList()); } public Task AddOrUpdate(SyncTarget target, LocalItem item) @@ -204,62 +159,14 @@ namespace MediaBrowser.Server.Implementations.Sync return GetData(items => items.FirstOrDefault(i => string.Equals(i.Id, id, StringComparison.OrdinalIgnoreCase))); } - private async Task<List<LocalItem>> GetCachedData() - { - if (_items == null) - { - await _cacheFileLock.WaitAsync().ConfigureAwait(false); - - try - { - if (_items == null) - { - try - { - _items = _json.DeserializeFromFile<List<LocalItem>>(GetCachePath()); - } - catch (FileNotFoundException) - { - _items = new List<LocalItem>(); - } - catch (DirectoryNotFoundException) - { - _items = new List<LocalItem>(); - } - } - } - finally - { - _cacheFileLock.Release(); - } - } - - return _items.ToList(); - } - - public async Task<List<string>> GetCachedServerItemIds(SyncTarget target, string serverId) - { - var items = await GetCachedData().ConfigureAwait(false); - - return items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase)) - .Select(i => i.ItemId) - .ToList(); - } - - public async Task<List<LocalItem>> GetCachedItems(SyncTarget target, string serverId, string itemId) + public Task<List<LocalItem>> GetItems(SyncTarget target, string serverId, string itemId) { - var items = await GetCachedData().ConfigureAwait(false); - - return items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase) && string.Equals(i.ItemId, itemId, StringComparison.OrdinalIgnoreCase)) - .ToList(); + return GetData(items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase) && string.Equals(i.ItemId, itemId, StringComparison.OrdinalIgnoreCase)).ToList()); } - public async Task<List<LocalItem>> GetCachedItemsBySyncJobItemId(SyncTarget target, string serverId, string syncJobItemId) + public Task<List<LocalItem>> GetItemsBySyncJobItemId(SyncTarget target, string serverId, string syncJobItemId) { - var items = await GetCachedData().ConfigureAwait(false); - - return items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase) && string.Equals(i.SyncJobItemId, syncJobItemId, StringComparison.OrdinalIgnoreCase)) - .ToList(); + return GetData(items => items.Where(i => string.Equals(i.ServerId, serverId, StringComparison.OrdinalIgnoreCase) && string.Equals(i.SyncJobItemId, syncJobItemId, StringComparison.OrdinalIgnoreCase)).ToList()); } } } |
