// Kyoo - A portable and vast media library solution. // Copyright (c) Kyoo. // // See AUTHORS.md and LICENSE file in the project root for full license information. // // Kyoo is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // Kyoo is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Kyoo. If not, see . using System; using System.Collections.Generic; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models.Attributes; namespace Kyoo.Abstractions.Models { /// /// A series or a movie. /// public class Show : IResource, IMetadata, IOnMerge, IThumbnails { /// public int ID { get; set; } /// public string Slug { get; set; } /// /// The title of this show. /// public string Title { get; set; } /// /// The list of alternative titles of this show. /// [EditableRelation] public string[] Aliases { get; set; } /// /// The path of the root directory of this show. /// This can be any kind of path supported by /// [SerializeIgnore] public string Path { get; set; } /// /// The summary of this show. /// public string Overview { get; set; } /// /// Is this show airing, not aired yet or finished? /// public Status Status { get; set; } /// /// An URL to a trailer. This could be any path supported by the . /// /// TODO for now, this is set to a youtube url. It should be cached and converted to a local file. [Obsolete("Use Images instead of this, this is only kept for the API response.")] public string TrailerUrl => Images?.GetValueOrDefault(Models.Images.Trailer); /// /// The date this show started airing. It can be null if this is unknown. /// public DateTime? StartAir { get; set; } /// /// The date this show finished airing. /// It must be after the but can be the same (example: for movies). /// It can also be null if this is unknown. /// public DateTime? EndAir { get; set; } /// public Dictionary Images { get; set; } /// /// True if this show represent a movie, false otherwise. /// public bool IsMovie { get; set; } /// [EditableRelation][LoadableRelation] public ICollection ExternalIDs { get; set; } /// /// The ID of the Studio that made this show. /// [SerializeIgnore] public int? StudioID { get; set; } /// /// The Studio that made this show. /// This must be explicitly loaded via a call to . /// [LoadableRelation(nameof(StudioID))][EditableRelation] public Studio Studio { get; set; } /// /// The list of genres (themes) this show has. /// [LoadableRelation][EditableRelation] public ICollection Genres { get; set; } /// /// The list of people that made this show. /// [LoadableRelation][EditableRelation] public ICollection People { get; set; } /// /// The different seasons in this show. If this is a movie, this list is always null or empty. /// [LoadableRelation] public ICollection Seasons { get; set; } /// /// The list of episodes in this show. /// If this is a movie, there will be a unique episode (with the seasonNumber and episodeNumber set to null). /// Having an episode is necessary to store metadata and tracks. /// [LoadableRelation] public ICollection Episodes { get; set; } /// /// The list of libraries that contains this show. /// [LoadableRelation] public ICollection Libraries { get; set; } /// /// The list of collections that contains this show. /// [LoadableRelation] public ICollection Collections { get; set; } /// public void OnMerge(object merged) { if (People != null) { foreach (PeopleRole link in People) link.Show = this; } if (Seasons != null) { foreach (Season season in Seasons) season.Show = this; } if (Episodes != null) { foreach (Episode episode in Episodes) episode.Show = this; } } } /// /// The enum containing show's status. /// public enum Status { /// /// The status of the show is not known. /// Unknown, /// /// The show has finished airing. /// Finished, /// /// The show is still actively airing. /// Airing, /// /// This show has not aired yet but has been announced. /// Planned } }