Movie.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using MediaBrowser.Model.Entities;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace MediaBrowser.Controller.Entities.Movies
  9. {
  10. /// <summary>
  11. /// Class Movie
  12. /// </summary>
  13. public class Movie : Video
  14. {
  15. public List<Guid> SpecialFeatureIds { get; set; }
  16. public Movie()
  17. {
  18. SpecialFeatureIds = new List<Guid>();
  19. }
  20. /// <summary>
  21. /// Gets the user data key.
  22. /// </summary>
  23. /// <returns>System.String.</returns>
  24. public override string GetUserDataKey()
  25. {
  26. return this.GetProviderId(MetadataProviders.Tmdb) ?? this.GetProviderId(MetadataProviders.Imdb) ?? base.GetUserDataKey();
  27. }
  28. /// <summary>
  29. /// Overrides the base implementation to refresh metadata for special features
  30. /// </summary>
  31. /// <param name="cancellationToken">The cancellation token.</param>
  32. /// <param name="forceSave">if set to <c>true</c> [is new item].</param>
  33. /// <param name="forceRefresh">if set to <c>true</c> [force].</param>
  34. /// <param name="allowSlowProviders">if set to <c>true</c> [allow slow providers].</param>
  35. /// <param name="resetResolveArgs">The reset resolve args.</param>
  36. /// <returns>Task{System.Boolean}.</returns>
  37. public override async Task<bool> RefreshMetadata(CancellationToken cancellationToken, bool forceSave = false, bool forceRefresh = false, bool allowSlowProviders = true, bool resetResolveArgs = true)
  38. {
  39. // Kick off a task to refresh the main item
  40. var result = await base.RefreshMetadata(cancellationToken, forceSave, forceRefresh, allowSlowProviders, resetResolveArgs).ConfigureAwait(false);
  41. var specialFeaturesChanged = false;
  42. // Must have a parent to have special features
  43. // In other words, it must be part of the Parent/Child tree
  44. if (LocationType == LocationType.FileSystem && Parent != null && !IsInMixedFolder)
  45. {
  46. specialFeaturesChanged = await RefreshSpecialFeatures(cancellationToken, forceSave, forceRefresh, allowSlowProviders).ConfigureAwait(false);
  47. }
  48. return specialFeaturesChanged || result;
  49. }
  50. private async Task<bool> RefreshSpecialFeatures(CancellationToken cancellationToken, bool forceSave = false, bool forceRefresh = false, bool allowSlowProviders = true)
  51. {
  52. var newItems = LoadSpecialFeatures().ToList();
  53. var newItemIds = newItems.Select(i => i.Id).ToList();
  54. var itemsChanged = !SpecialFeatureIds.SequenceEqual(newItemIds);
  55. var tasks = newItems.Select(i => i.RefreshMetadata(cancellationToken, forceSave, forceRefresh, allowSlowProviders, resetResolveArgs: false));
  56. var results = await Task.WhenAll(tasks).ConfigureAwait(false);
  57. SpecialFeatureIds = newItemIds;
  58. return itemsChanged || results.Contains(true);
  59. }
  60. /// <summary>
  61. /// Loads the special features.
  62. /// </summary>
  63. /// <returns>IEnumerable{Video}.</returns>
  64. private IEnumerable<Video> LoadSpecialFeatures()
  65. {
  66. FileSystemInfo folder;
  67. try
  68. {
  69. folder = ResolveArgs.GetFileSystemEntryByName("specials");
  70. }
  71. catch (IOException ex)
  72. {
  73. Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path);
  74. return new List<Video>();
  75. }
  76. // Path doesn't exist. No biggie
  77. if (folder == null)
  78. {
  79. return new List<Video>();
  80. }
  81. IEnumerable<FileSystemInfo> files;
  82. try
  83. {
  84. files = new DirectoryInfo(folder.FullName).EnumerateFiles();
  85. }
  86. catch (IOException ex)
  87. {
  88. Logger.ErrorException("Error loading special features for {0}", ex, Name);
  89. return new List<Video>();
  90. }
  91. return LibraryManager.ResolvePaths<Video>(files, null).Select(video =>
  92. {
  93. // Try to retrieve it from the db. If we don't find it, use the resolved version
  94. var dbItem = LibraryManager.RetrieveItem(video.Id) as Video;
  95. if (dbItem != null)
  96. {
  97. dbItem.ResetResolveArgs(video.ResolveArgs);
  98. video = dbItem;
  99. }
  100. return video;
  101. });
  102. }
  103. }
  104. }