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.Threading; using System.Threading.Tasks; using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Providers; using MediaBrowser.Model.Serialization; namespace MediaBrowser.Controller.Entities.TV { /// /// Class Series /// public class Series : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo, IMetadataContainer { public Series() { RemoteTrailers = EmptyMediaUrlArray; LocalTrailerIds = EmptyGuidArray; RemoteTrailerIds = EmptyGuidArray; AirDays = new DayOfWeek[] { }; } public DayOfWeek[] AirDays { get; set; } public string AirTime { get; set; } [IgnoreDataMember] public override bool SupportsAddingToPlaylist { get { return true; } } [IgnoreDataMember] public override bool IsPreSorted { get { return true; } } [IgnoreDataMember] public override bool SupportsDateLastMediaAdded { get { return true; } } [IgnoreDataMember] public override bool SupportsInheritedParentImages { get { return false; } } public Guid[] LocalTrailerIds { get; set; } public Guid[] RemoteTrailerIds { get; set; } public MediaUrl[] 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 date last episode added. /// /// The date last episode added. [IgnoreDataMember] public DateTime DateLastEpisodeAdded { get { return DateLastMediaAdded ?? DateTime.MinValue; } } public override double? GetDefaultPrimaryImageAspectRatio() { double value = 2; value /= 3; return value; } public override string CreatePresentationUniqueKey() { if (LibraryManager.GetLibraryOptions(this).EnableAutomaticSeriesGrouping) { var userdatakeys = GetUserDataKeys(); if (userdatakeys.Count > 1) { return AddLibrariesToPresentationUniqueKey(userdatakeys[0]); } } return base.CreatePresentationUniqueKey(); } private string AddLibrariesToPresentationUniqueKey(string key) { var lang = GetPreferredMetadataLanguage(); if (!string.IsNullOrWhiteSpace(lang)) { key += "-" + lang; } var folders = LibraryManager.GetCollectionFolders(this) .Select(i => i.Id.ToString("N")) .ToArray(); if (folders.Length == 0) { return key; } return key + "-" + string.Join("-", folders); } private static string GetUniqueSeriesKey(BaseItem series) { return series.GetPresentationUniqueKey(); } public override int GetChildCount(User user) { var seriesKey = GetUniqueSeriesKey(this); var result = LibraryManager.GetCount(new InternalItemsQuery(user) { AncestorWithPresentationUniqueKey = null, SeriesPresentationUniqueKey = seriesKey, IncludeItemTypes = new[] { typeof(Season).Name }, IsVirtualItem = false, Limit = 0, DtoOptions = new Dto.DtoOptions(false) { EnableImages = false } }); return result; } public override int GetRecursiveChildCount(User user) { var seriesKey = GetUniqueSeriesKey(this); var query = new InternalItemsQuery(user) { AncestorWithPresentationUniqueKey = null, SeriesPresentationUniqueKey = seriesKey, DtoOptions = new Dto.DtoOptions(false) { EnableImages = false } }; if (query.IncludeItemTypes.Length == 0) { query.IncludeItemTypes = new[] { typeof(Episode).Name }; } query.IsVirtualItem = false; query.Limit = 0; var totalRecordCount = LibraryManager.GetCount(query); return totalRecordCount; } /// /// 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; } [IgnoreDataMember] public bool ContainsEpisodesWithoutSeasonFolders { get { return Children.OfType