using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; namespace MediaBrowser.Controller.Entities.Movies { /// /// Class Movie /// public class Movie : Video, IHasCriticRating, IHasSoundtracks, IHasSpecialFeatures, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasAwards, IHasMetascore, IHasLookupInfo, ISupportsBoxSetGrouping { public List SpecialFeatureIds { get; set; } public List SoundtrackIds { get; set; } public List ThemeSongIds { get; set; } public List ThemeVideoIds { get; set; } public List ProductionLocations { get; set; } /// /// This is just a cache to enable quick access by Id /// [IgnoreDataMember] public List BoxSetIdList { get; set; } public Movie() { SpecialFeatureIds = new List(); SoundtrackIds = new List(); RemoteTrailers = new List(); LocalTrailerIds = new List(); RemoteTrailerIds = new List(); ThemeSongIds = new List(); ThemeVideoIds = new List(); BoxSetIdList = 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 critic rating. /// /// The critic rating. public float? CriticRating { get; set; } /// /// Gets or sets the critic rating summary. /// /// The critic rating summary. public string CriticRatingSummary { get; set; } /// /// Gets or sets the name of the TMDB collection. /// /// The name of the TMDB collection. public string TmdbCollectionName { get; set; } /// /// 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. public override string GetUserDataKey() { return this.GetProviderId(MetadataProviders.Tmdb) ?? this.GetProviderId(MetadataProviders.Imdb) ?? base.GetUserDataKey(); } 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 && Parent != 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; } protected override bool GetBlockUnratedValue(UserConfiguration config) { return config.BlockUnratedItems.Contains(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; } } }