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; using MediaBrowser.Model.Providers; namespace MediaBrowser.Controller.Entities.Movies { /// /// Class Movie /// public class Movie : Video, IHasCriticRating, IHasSpecialFeatures, IHasBudget, IHasTrailers, IHasThemeMedia, IHasAwards, IHasMetascore, IHasLookupInfo, ISupportsBoxSetGrouping, IHasOriginalTitle { public List SpecialFeatureIds { get; set; } public List ThemeSongIds { get; set; } public List ThemeVideoIds { 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(); } public string AwardSummary { get; set; } public float? Metascore { get; set; } public List LocalTrailerIds { get; set; } public List RemoteTrailerIds { 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; } } 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 && !DetectIsInMixedFolder()) { 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 (!DetectIsInMixedFolder()) { 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 (!DetectIsInMixedFolder()) { info = LibraryManager.ParseName(System.IO.Path.GetFileName(ContainingFolderPath)); yearInName = info.Year; if (yearInName.HasValue) { ProductionYear = yearInName; hasChanges = true; } } } } return hasChanges; } public override List GetRelatedUrls() { var list = base.GetRelatedUrls(); var imdbId = this.GetProviderId(MetadataProviders.Imdb); if (!string.IsNullOrWhiteSpace(imdbId)) { list.Add(new ExternalUrl { Name = "Trakt", Url = string.Format("https://trakt.tv/movies/{0}", imdbId) }); } return list; } [IgnoreDataMember] public override bool StopRefreshIfLocalMetadataFound { get { // Need people id's from internet metadata return false; } } } }