Movie.cs 5.2 KB

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