SyncedMediaSourceProvider.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using MediaBrowser.Controller;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Library;
  4. using MediaBrowser.Controller.Sync;
  5. using MediaBrowser.Model.Dto;
  6. using MediaBrowser.Model.MediaInfo;
  7. using MediaBrowser.Model.Sync;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. namespace MediaBrowser.Server.Implementations.Sync
  15. {
  16. public class SyncedMediaSourceProvider : IMediaSourceProvider
  17. {
  18. private readonly SyncManager _syncManager;
  19. private readonly IServerApplicationHost _appHost;
  20. public SyncedMediaSourceProvider(ISyncManager syncManager, IServerApplicationHost appHost)
  21. {
  22. _appHost = appHost;
  23. _syncManager = (SyncManager)syncManager;
  24. }
  25. public async Task<IEnumerable<MediaSourceInfo>> GetMediaSources(IHasMediaSources item, CancellationToken cancellationToken)
  26. {
  27. var jobItemResult = _syncManager.GetJobItems(new SyncJobItemQuery
  28. {
  29. AddMetadata = false,
  30. Statuses = new List<SyncJobItemStatus> { SyncJobItemStatus.Synced },
  31. ItemId = item.Id.ToString("N")
  32. });
  33. var list = new List<MediaSourceInfo>();
  34. if (jobItemResult.Items.Length > 0)
  35. {
  36. var targets = _syncManager.ServerSyncProviders
  37. .SelectMany(i => i.GetAllSyncTargets().Select(t => new Tuple<IServerSyncProvider, SyncTarget>(i, t)))
  38. .ToList();
  39. var serverId = _appHost.SystemId;
  40. foreach (var jobItem in jobItemResult.Items)
  41. {
  42. var targetTuple = targets.FirstOrDefault(i => string.Equals(i.Item2.Id, jobItem.TargetId, StringComparison.OrdinalIgnoreCase));
  43. if (targetTuple != null)
  44. {
  45. var syncTarget = targetTuple.Item2;
  46. var dataProvider = _syncManager.GetDataProvider(targetTuple.Item1, syncTarget);
  47. var localItems = await dataProvider.GetCachedItems(syncTarget, serverId, item.Id.ToString("N")).ConfigureAwait(false);
  48. foreach (var localItem in localItems)
  49. {
  50. list.AddRange(GetPlayableMediaSources(localItem));
  51. }
  52. }
  53. }
  54. }
  55. return list;
  56. }
  57. private IEnumerable<MediaSourceInfo> GetPlayableMediaSources(LocalItem item)
  58. {
  59. return item.Item.MediaSources
  60. .Where(IsMediaSourcePlayable);
  61. }
  62. private bool IsMediaSourcePlayable(MediaSourceInfo mediaSource)
  63. {
  64. if (mediaSource.Protocol == MediaProtocol.File)
  65. {
  66. if (!File.Exists(mediaSource.Path))
  67. {
  68. return false;
  69. }
  70. }
  71. return true;
  72. }
  73. }
  74. }