using System; using System.Collections.Generic; using API.Entities.Enums; using API.Entities.Interfaces; using API.Parser; namespace API.Entities; public class Chapter : IEntityDate, IHasReadTimeEstimate { public int Id { get; set; } /// /// Range of numbers. Chapter 2-4 -> "2-4". Chapter 2 -> "2". /// public required string Range { get; set; } /// /// Smallest number of the Range. Can be a partial like Chapter 4.5 /// public required string Number { get; set; } /// /// The files that represent this Chapter /// public ICollection Files { get; set; } = null!; public DateTime Created { get; set; } public DateTime LastModified { get; set; } public DateTime CreatedUtc { get; set; } public DateTime LastModifiedUtc { get; set; } /// /// Relative path to the (managed) image file representing the cover image /// /// The file is managed internally to Kavita's APPDIR public string? CoverImage { get; set; } public bool CoverImageLocked { get; set; } /// /// Total number of pages in all MangaFiles /// public int Pages { get; set; } /// /// If this Chapter contains files that could only be identified as Series or has Special Identifier from filename /// public bool IsSpecial { get; set; } /// /// Used for books/specials to display custom title. For non-specials/books, will be set to /// public string? Title { get; set; } /// /// Age Rating for the issue/chapter /// public AgeRating AgeRating { get; set; } /// /// Chapter title /// /// This should not be confused with Title which is used for special filenames. public string TitleName { get; set; } = string.Empty; /// /// Date which chapter was released /// public DateTime ReleaseDate { get; set; } /// /// Summary for the Chapter/Issue /// public string? Summary { get; set; } /// /// Language for the Chapter/Issue /// public string? Language { get; set; } /// /// Total number of issues or volumes in the series /// /// Users may use Volume count or issue count. Kavita performs some light logic to help Count match up with TotalCount public int TotalCount { get; set; } = 0; /// /// Number of the Total Count (progress the Series is complete) /// public int Count { get; set; } = 0; /// /// SeriesGroup tag in ComicInfo /// public string SeriesGroup { get; set; } = string.Empty; public string StoryArc { get; set; } = string.Empty; public string StoryArcNumber { get; set; } = string.Empty; public string AlternateNumber { get; set; } = string.Empty; public string AlternateSeries { get; set; } = string.Empty; /// /// Not currently used in Kavita /// public int AlternateCount { get; set; } = 0; /// /// Total Word count of all chapters in this chapter. /// /// Word Count is only available from EPUB files public long WordCount { get; set; } /// public int MinHoursToRead { get; set; } /// public int MaxHoursToRead { get; set; } /// public int AvgHoursToRead { get; set; } /// /// All people attached at a Chapter level. Usually Comics will have different people per issue. /// public ICollection People { get; set; } = new List(); /// /// Genres for the Chapter /// public ICollection Genres { get; set; } = new List(); public ICollection Tags { get; set; } = new List(); public ICollection UserProgress { get; set; } // Relationships public Volume Volume { get; set; } = null!; public int VolumeId { get; set; } public void UpdateFrom(ParserInfo info) { Files ??= new List(); IsSpecial = info.IsSpecialInfo(); if (IsSpecial) { Number = "0"; } Title = (IsSpecial && info.Format == MangaFormat.Epub) ? info.Title : Range; } }