// 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 System.Linq.Expressions; using Kyoo.Abstractions.Models.Attributes; namespace Kyoo.Abstractions.Models { /// /// The type of item, ether a show, a movie or a collection. /// public enum ItemType { /// /// The is a . /// Show, /// /// The is a Movie (a with equals to true). /// Movie, /// /// The is a . /// Collection } /// /// A type union between and . /// This is used to list content put inside a library. /// public class LibraryItem : IResource, IThumbnails { /// public int ID { get; set; } /// public string Slug { get; set; } /// /// The title of the show or collection. /// public string Title { get; set; } /// /// The summary of the show or collection. /// public string Overview { get; set; } /// /// Is this show airing, not aired yet or finished? This is only applicable for shows. /// public Status? Status { get; set; } /// /// The date this show or collection started airing. It can be null if this is unknown. /// public DateTime? StartAir { get; set; } /// /// The date this show or collection 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; } /// /// The path of this item's poster. /// By default, the http path for this poster is returned from the public API. /// This can be disabled using the internal query flag. /// [SerializeAs("{HOST}/api/{Type:l}/{Slug}/poster")] public string Poster => Images?.GetValueOrDefault(Models.Images.Poster); /// /// The type of this item (ether a collection, a show or a movie). /// public ItemType Type { get; set; } /// /// Create a new, empty . /// public LibraryItem() { } /// /// Create a from a show. /// /// The show that this library item should represent. public LibraryItem(Show show) { ID = show.ID; Slug = show.Slug; Title = show.Title; Overview = show.Overview; Status = show.Status; StartAir = show.StartAir; EndAir = show.EndAir; Images = show.Images; Type = show.IsMovie ? ItemType.Movie : ItemType.Show; } /// /// Create a from a collection /// /// The collection that this library item should represent. public LibraryItem(Collection collection) { ID = -collection.ID; Slug = collection.Slug; Title = collection.Name; Overview = collection.Overview; Status = Models.Status.Unknown; StartAir = null; EndAir = null; Images = collection.Images; Type = ItemType.Collection; } /// /// An expression to create a representing a show. /// public static Expression> FromShow => x => new LibraryItem { ID = x.ID, Slug = x.Slug, Title = x.Title, Overview = x.Overview, Status = x.Status, StartAir = x.StartAir, EndAir = x.EndAir, Images = x.Images, Type = x.IsMovie ? ItemType.Movie : ItemType.Show }; /// /// An expression to create a representing a collection. /// public static Expression> FromCollection => x => new LibraryItem { ID = -x.ID, Slug = x.Slug, Title = x.Name, Overview = x.Overview, Status = Models.Status.Unknown, StartAir = null, EndAir = null, Images = x.Images, Type = ItemType.Collection }; } }