using System; using System.Collections.Generic; using NzbDrone.Core.Model; using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Repository { public class Episode { [SubSonicPrimaryKey] public virtual int EpisodeId { get; set; } public int? TvDbEpisodeId { get; set; } public virtual int SeriesId { get; set; } public virtual int EpisodeFileId { get; set; } public virtual int SeasonId { get; set; } public int SeasonNumber { get; set; } public int EpisodeNumber { get; set; } public string Title { get; set; } public DateTime AirDate { get; set; } [SubSonicLongString] public string Overview { get; set; } public Boolean Ignored { get; set; } /// /// Gets or sets the grab date. /// /// /// Used to specify when the episode was grapped. /// this filed is used by status as an expirable "Grabbed" status. /// public DateTime? GrabDate { get; set; } [SubSonicIgnore] public EpisodeStatusType Status { get { if (Ignored || (Season != null && !Season.Monitored)) return EpisodeStatusType.Ignored; if (GrabDate != null && GrabDate.Value.AddDays(1) >= DateTime.Now) { return EpisodeStatusType.Downloading; } if (EpisodeFileId != 0) return EpisodeStatusType.Ready; if (AirDate.Date.Year > 1900 && DateTime.Now.Date >= AirDate.Date) { return EpisodeStatusType.Missing; } return EpisodeStatusType.NotAired; } } [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] public virtual Season Season { get; set; } [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] public virtual Series Series { get; set; } [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] public virtual EpisodeFile EpisodeFile { get; set; } [SubSonicToManyRelation] public virtual IList Histories { get; protected set; } public override string ToString() { var seriesTitle = Series == null ? "[NULL]" : Series.Title; if (EpisodeNumber == 0) return string.Format("{0} - {1}", seriesTitle, AirDate.Date); return string.Format("{0} - S{1:00}E{2}", seriesTitle, SeasonNumber, EpisodeNumber); } } }