using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Users; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.Providers; using MoreLinq; namespace MediaBrowser.Controller.Entities.TV { /// /// Class Series /// public class Series : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo, IHasSpecialFeatures, IMetadataContainer, IHasOriginalTitle { public List SpecialFeatureIds { get; set; } public int? AnimeSeriesIndex { get; set; } public Series() { AirDays = new List(); SpecialFeatureIds = new List(); RemoteTrailers = new List(); LocalTrailerIds = new List(); RemoteTrailerIds = new List(); DisplaySpecialsWithSeasons = true; } [IgnoreDataMember] public override bool SupportsAddingToPlaylist { get { return true; } } [IgnoreDataMember] public override bool IsPreSorted { get { return true; } } [IgnoreDataMember] public override bool SupportsDateLastMediaAdded { get { return true; } } public bool DisplaySpecialsWithSeasons { get; set; } public List LocalTrailerIds { get; set; } public List RemoteTrailerIds { get; set; } public List RemoteTrailers { get; set; } /// /// airdate, dvd or absolute /// public string DisplayOrder { get; set; } /// /// Gets or sets the status. /// /// The status. public SeriesStatus? Status { get; set; } /// /// Gets or sets the air days. /// /// The air days. public List AirDays { get; set; } /// /// Gets or sets the air time. /// /// The air time. public string AirTime { get; set; } /// /// Gets or sets the date last episode added. /// /// The date last episode added. [IgnoreDataMember] public DateTime DateLastEpisodeAdded { get { return GetRecursiveChildren(i => i is Episode) .Select(i => i.DateCreated) .OrderByDescending(i => i) .FirstOrDefault(); } } [IgnoreDataMember] public override string PresentationUniqueKey { get { if (EnablePooling()) { return GetUserDataKeys().First(); } return base.PresentationUniqueKey; } } /// /// Gets the user data key. /// /// System.String. public override List GetUserDataKeys() { var list = base.GetUserDataKeys(); var key = this.GetProviderId(MetadataProviders.Imdb); if (!string.IsNullOrWhiteSpace(key)) { list.Insert(0, key); } key = this.GetProviderId(MetadataProviders.Tvdb); if (!string.IsNullOrWhiteSpace(key)) { list.Insert(0, key); } return list; } /// /// Gets the trailer ids. /// /// List<Guid>. public List GetTrailerIds() { var list = LocalTrailerIds.ToList(); list.AddRange(RemoteTrailerIds); return list; } // Studio, Genre and Rating will all be the same so makes no sense to index by these protected override IEnumerable GetIndexByOptions() { return new List { {"None"}, {"Performer"}, {"Director"}, {"Year"}, }; } [IgnoreDataMember] public bool ContainsEpisodesWithoutSeasonFolders { get { return Children.OfType