Episode.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.Serialization;
  5. namespace MediaBrowser.Controller.Entities.TV
  6. {
  7. /// <summary>
  8. /// Class Episode
  9. /// </summary>
  10. public class Episode : Video
  11. {
  12. /// <summary>
  13. /// Episodes have a special Metadata folder
  14. /// </summary>
  15. /// <value>The meta location.</value>
  16. [IgnoreDataMember]
  17. public override string MetaLocation
  18. {
  19. get
  20. {
  21. return System.IO.Path.Combine(Parent.Path, "metadata");
  22. }
  23. }
  24. [IgnoreDataMember]
  25. protected override bool UseParentPathToCreateResolveArgs
  26. {
  27. get
  28. {
  29. return false;
  30. }
  31. }
  32. /// <summary>
  33. /// Gets the season in which it aired.
  34. /// </summary>
  35. /// <value>The aired season.</value>
  36. public int? AirsBeforeSeasonNumber { get; set; }
  37. public int? AirsAfterSeasonNumber { get; set; }
  38. public int? AirsBeforeEpisodeNumber { get; set; }
  39. /// <summary>
  40. /// Gets or sets the DVD season number.
  41. /// </summary>
  42. /// <value>The DVD season number.</value>
  43. public int? DvdSeasonNumber { get; set; }
  44. /// <summary>
  45. /// Gets or sets the DVD episode number.
  46. /// </summary>
  47. /// <value>The DVD episode number.</value>
  48. public float? DvdEpisodeNumber { get; set; }
  49. /// <summary>
  50. /// Gets or sets the absolute episode number.
  51. /// </summary>
  52. /// <value>The absolute episode number.</value>
  53. public int? AbsoluteEpisodeNumber { get; set; }
  54. /// <summary>
  55. /// We want to group into series not show individually in an index
  56. /// </summary>
  57. /// <value><c>true</c> if [group in index]; otherwise, <c>false</c>.</value>
  58. [IgnoreDataMember]
  59. public override bool GroupInIndex
  60. {
  61. get { return true; }
  62. }
  63. [IgnoreDataMember]
  64. public int? AiredSeasonNumber
  65. {
  66. get
  67. {
  68. return AirsAfterSeasonNumber ?? AirsBeforeSeasonNumber ?? PhysicalSeasonNumber;
  69. }
  70. }
  71. [IgnoreDataMember]
  72. public int? PhysicalSeasonNumber
  73. {
  74. get
  75. {
  76. var value = ParentIndexNumber;
  77. if (value.HasValue)
  78. {
  79. return value;
  80. }
  81. var season = Parent as Season;
  82. return season != null ? season.IndexNumber : null;
  83. }
  84. }
  85. /// <summary>
  86. /// We roll up into series
  87. /// </summary>
  88. /// <value>The index container.</value>
  89. [IgnoreDataMember]
  90. public override Folder IndexContainer
  91. {
  92. get
  93. {
  94. return FindParent<Season>();
  95. }
  96. }
  97. /// <summary>
  98. /// Gets the user data key.
  99. /// </summary>
  100. /// <returns>System.String.</returns>
  101. public override string GetUserDataKey()
  102. {
  103. if (Series != null && ParentIndexNumber.HasValue && IndexNumber.HasValue)
  104. {
  105. return Series.GetUserDataKey() + ParentIndexNumber.Value.ToString("000") + IndexNumber.Value.ToString("000");
  106. }
  107. return base.GetUserDataKey();
  108. }
  109. /// <summary>
  110. /// Override this if you need to combine/collapse person information
  111. /// </summary>
  112. /// <value>All people.</value>
  113. [IgnoreDataMember]
  114. public override IEnumerable<PersonInfo> AllPeople
  115. {
  116. get
  117. {
  118. if (People == null) return Series != null ? Series.People : People;
  119. return Series != null && Series.People != null ? People.Concat(Series.People) : base.AllPeople;
  120. }
  121. }
  122. /// <summary>
  123. /// Gets all genres.
  124. /// </summary>
  125. /// <value>All genres.</value>
  126. [IgnoreDataMember]
  127. public override IEnumerable<string> AllGenres
  128. {
  129. get
  130. {
  131. if (Genres == null) return Series != null ? Series.Genres : Genres;
  132. return Series != null && Series.Genres != null ? Genres.Concat(Series.Genres) : base.AllGenres;
  133. }
  134. }
  135. /// <summary>
  136. /// Gets all studios.
  137. /// </summary>
  138. /// <value>All studios.</value>
  139. [IgnoreDataMember]
  140. public override IEnumerable<string> AllStudios
  141. {
  142. get
  143. {
  144. if (Studios == null) return Series != null ? Series.Studios : Studios;
  145. return Series != null && Series.Studios != null ? Studios.Concat(Series.Studios) : base.AllStudios;
  146. }
  147. }
  148. /// <summary>
  149. /// Our rating comes from our series
  150. /// </summary>
  151. [IgnoreDataMember]
  152. public override string OfficialRatingForComparison
  153. {
  154. get { return Series != null ? Series.OfficialRatingForComparison : base.OfficialRatingForComparison; }
  155. }
  156. /// <summary>
  157. /// Our rating comes from our series
  158. /// </summary>
  159. [IgnoreDataMember]
  160. public override string CustomRatingForComparison
  161. {
  162. get { return Series != null ? Series.CustomRatingForComparison : base.CustomRatingForComparison; }
  163. }
  164. /// <summary>
  165. /// The _series
  166. /// </summary>
  167. private Series _series;
  168. /// <summary>
  169. /// This Episode's Series Instance
  170. /// </summary>
  171. /// <value>The series.</value>
  172. [IgnoreDataMember]
  173. public Series Series
  174. {
  175. get { return _series ?? (_series = FindParent<Series>()); }
  176. }
  177. /// <summary>
  178. /// This is the ending episode number for double episodes.
  179. /// </summary>
  180. /// <value>The index number.</value>
  181. public int? IndexNumberEnd { get; set; }
  182. /// <summary>
  183. /// Creates the name of the sort.
  184. /// </summary>
  185. /// <returns>System.String.</returns>
  186. protected override string CreateSortName()
  187. {
  188. return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("000-") : "")
  189. + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
  190. }
  191. /// <summary>
  192. /// Determines whether [contains episode number] [the specified number].
  193. /// </summary>
  194. /// <param name="number">The number.</param>
  195. /// <returns><c>true</c> if [contains episode number] [the specified number]; otherwise, <c>false</c>.</returns>
  196. public bool ContainsEpisodeNumber(int number)
  197. {
  198. if (IndexNumber.HasValue)
  199. {
  200. if (IndexNumberEnd.HasValue)
  201. {
  202. return number >= IndexNumber.Value && number <= IndexNumberEnd.Value;
  203. }
  204. return IndexNumber.Value == number;
  205. }
  206. return false;
  207. }
  208. [IgnoreDataMember]
  209. public bool IsMissingEpisode
  210. {
  211. get
  212. {
  213. return LocationType == Model.Entities.LocationType.Virtual && PremiereDate.HasValue && PremiereDate.Value < DateTime.UtcNow;
  214. }
  215. }
  216. [IgnoreDataMember]
  217. public bool IsUnaired
  218. {
  219. get { return PremiereDate.HasValue && PremiereDate.Value.ToLocalTime().Date >= DateTime.Now.Date; }
  220. }
  221. [IgnoreDataMember]
  222. public bool IsVirtualUnaired
  223. {
  224. get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; }
  225. }
  226. [IgnoreDataMember]
  227. public Guid? SeasonId
  228. {
  229. get
  230. {
  231. // First see if the parent is a Season
  232. var season = Parent as Season;
  233. if (season != null)
  234. {
  235. return season.Id;
  236. }
  237. var seasonNumber = ParentIndexNumber;
  238. // Parent is a Series
  239. if (seasonNumber.HasValue)
  240. {
  241. var series = Parent as Series;
  242. if (series != null)
  243. {
  244. season = series.Children.OfType<Season>()
  245. .FirstOrDefault(i => i.IndexNumber.HasValue && i.IndexNumber.Value == seasonNumber.Value);
  246. if (season != null)
  247. {
  248. return season.Id;
  249. }
  250. }
  251. }
  252. return null;
  253. }
  254. }
  255. public override IEnumerable<string> GetDeletePaths()
  256. {
  257. return new[] { Path };
  258. }
  259. }
  260. }