using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; using CommonIO; namespace MediaBrowser.Controller.Entities.Movies { /// /// Class Movie /// public class Movie : Video, IHasCriticRating, IHasSpecialFeatures, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasAwards, IHasMetascore, IHasLookupInfo, ISupportsBoxSetGrouping, IHasOriginalTitle { public List SpecialFeatureIds { get; set; } public string OriginalTitle { get; set; } public List ThemeSongIds { get; set; } public List ThemeVideoIds { get; set; } public List ProductionLocations { get; set; } public Movie() { SpecialFeatureIds = new List(); RemoteTrailers = new List(); LocalTrailerIds = new List(); RemoteTrailerIds = new List(); ThemeSongIds = new List(); ThemeVideoIds = new List(); Taglines = new List(); Keywords = new List(); ProductionLocations = new List(); } public string AwardSummary { get; set; } public float? Metascore { get; set; } public List LocalTrailerIds { get; set; } public List RemoteTrailerIds { get; set; } public List Keywords { get; set; } public List RemoteTrailers { get; set; } /// /// Gets or sets the taglines. /// /// The taglines. public List Taglines { get; set; } /// /// Gets or sets the budget. /// /// The budget. public double? Budget { get; set; } /// /// Gets or sets the revenue. /// /// The revenue. public double? Revenue { get; set; } /// /// Gets or sets the name of the TMDB collection. /// /// The name of the TMDB collection. public string TmdbCollectionName { get; set; } [IgnoreDataMember] public string CollectionName { get { return TmdbCollectionName; } set { TmdbCollectionName = value; } } /// /// Gets the trailer ids. /// /// List<Guid>. public List GetTrailerIds() { var list = LocalTrailerIds.ToList(); list.AddRange(RemoteTrailerIds); return list; } /// /// Gets the user data key. /// /// System.String. protected override string CreateUserDataKey() { var key = GetMovieUserDataKey(this); if (string.IsNullOrWhiteSpace(key)) { key = base.CreateUserDataKey(); } return key; } public static string GetMovieUserDataKey(BaseItem movie) { var key = movie.GetProviderId(MetadataProviders.Tmdb); if (string.IsNullOrWhiteSpace(key)) { key = movie.GetProviderId(MetadataProviders.Imdb); } return key; } protected override async Task RefreshedOwnedItems(MetadataRefreshOptions options, List fileSystemChildren, CancellationToken cancellationToken) { var hasChanges = await base.RefreshedOwnedItems(options, fileSystemChildren, cancellationToken).ConfigureAwait(false); // Must have a parent to have special features // In other words, it must be part of the Parent/Child tree if (LocationType == LocationType.FileSystem && GetParent() != null && !IsInMixedFolder) { var specialFeaturesChanged = await RefreshSpecialFeatures(options, fileSystemChildren, cancellationToken).ConfigureAwait(false); if (specialFeaturesChanged) { hasChanges = true; } } return hasChanges; } private async Task RefreshSpecialFeatures(MetadataRefreshOptions options, List fileSystemChildren, CancellationToken cancellationToken) { var newItems = LibraryManager.FindExtras(this, fileSystemChildren, options.DirectoryService).ToList(); var newItemIds = newItems.Select(i => i.Id).ToList(); var itemsChanged = !SpecialFeatureIds.SequenceEqual(newItemIds); var tasks = newItems.Select(i => i.RefreshMetadata(options, cancellationToken)); await Task.WhenAll(tasks).ConfigureAwait(false); SpecialFeatureIds = newItemIds; return itemsChanged; } public override UnratedItem GetBlockUnratedType() { return UnratedItem.Movie; } public MovieInfo GetLookupInfo() { var info = GetItemLookupInfo(); if (!IsInMixedFolder) { info.Name = System.IO.Path.GetFileName(ContainingFolderPath); } return info; } public override bool BeforeMetadataRefresh() { var hasChanges = base.BeforeMetadataRefresh(); if (!ProductionYear.HasValue) { var info = LibraryManager.ParseName(Name); var yearInName = info.Year; if (yearInName.HasValue) { ProductionYear = yearInName; hasChanges = true; } else { // Try to get the year from the folder name if (!IsInMixedFolder) { info = LibraryManager.ParseName(System.IO.Path.GetFileName(ContainingFolderPath)); yearInName = info.Year; if (yearInName.HasValue) { ProductionYear = yearInName; hasChanges = true; } } } } return hasChanges; } } }