Episode.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  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. /// We want to group into series not show individually in an index
  34. /// </summary>
  35. /// <value><c>true</c> if [group in index]; otherwise, <c>false</c>.</value>
  36. [IgnoreDataMember]
  37. public override bool GroupInIndex
  38. {
  39. get { return true; }
  40. }
  41. /// <summary>
  42. /// We roll up into series
  43. /// </summary>
  44. /// <value>The index container.</value>
  45. [IgnoreDataMember]
  46. public override Folder IndexContainer
  47. {
  48. get
  49. {
  50. return Season;
  51. }
  52. }
  53. /// <summary>
  54. /// Gets the user data key.
  55. /// </summary>
  56. /// <returns>System.String.</returns>
  57. public override string GetUserDataKey()
  58. {
  59. if (Series != null && ParentIndexNumber.HasValue && IndexNumber.HasValue)
  60. {
  61. return Series.GetUserDataKey() + ParentIndexNumber.Value.ToString("000") + IndexNumber.Value.ToString("000");
  62. }
  63. return base.GetUserDataKey();
  64. }
  65. /// <summary>
  66. /// Override this if you need to combine/collapse person information
  67. /// </summary>
  68. /// <value>All people.</value>
  69. [IgnoreDataMember]
  70. public override IEnumerable<PersonInfo> AllPeople
  71. {
  72. get
  73. {
  74. if (People == null) return Series != null ? Series.People : People;
  75. return Series != null && Series.People != null ? People.Concat(Series.People) : base.AllPeople;
  76. }
  77. }
  78. /// <summary>
  79. /// Gets all genres.
  80. /// </summary>
  81. /// <value>All genres.</value>
  82. [IgnoreDataMember]
  83. public override IEnumerable<string> AllGenres
  84. {
  85. get
  86. {
  87. if (Genres == null) return Series != null ? Series.Genres : Genres;
  88. return Series != null && Series.Genres != null ? Genres.Concat(Series.Genres) : base.AllGenres;
  89. }
  90. }
  91. /// <summary>
  92. /// Gets all studios.
  93. /// </summary>
  94. /// <value>All studios.</value>
  95. [IgnoreDataMember]
  96. public override IEnumerable<string> AllStudios
  97. {
  98. get
  99. {
  100. if (Studios == null) return Series != null ? Series.Studios : Studios;
  101. return Series != null && Series.Studios != null ? Studios.Concat(Series.Studios) : base.AllStudios;
  102. }
  103. }
  104. /// <summary>
  105. /// Our rating comes from our series
  106. /// </summary>
  107. [IgnoreDataMember]
  108. public override string OfficialRatingForComparison
  109. {
  110. get { return Series != null ? Series.OfficialRatingForComparison : base.OfficialRatingForComparison; }
  111. }
  112. /// <summary>
  113. /// Our rating comes from our series
  114. /// </summary>
  115. [IgnoreDataMember]
  116. public override string CustomRatingForComparison
  117. {
  118. get { return Series != null ? Series.CustomRatingForComparison : base.CustomRatingForComparison; }
  119. }
  120. /// <summary>
  121. /// The _series
  122. /// </summary>
  123. private Series _series;
  124. /// <summary>
  125. /// This Episode's Series Instance
  126. /// </summary>
  127. /// <value>The series.</value>
  128. [IgnoreDataMember]
  129. public Series Series
  130. {
  131. get { return _series ?? (_series = FindParent<Series>()); }
  132. }
  133. /// <summary>
  134. /// The _season
  135. /// </summary>
  136. private Season _season;
  137. /// <summary>
  138. /// This Episode's Season Instance
  139. /// </summary>
  140. /// <value>The season.</value>
  141. [IgnoreDataMember]
  142. public Season Season
  143. {
  144. get { return _season ?? (_season = FindParent<Season>()); }
  145. }
  146. /// <summary>
  147. /// This is the ending episode number for double episodes.
  148. /// </summary>
  149. /// <value>The index number.</value>
  150. public int? IndexNumberEnd { get; set; }
  151. /// <summary>
  152. /// Creates the name of the sort.
  153. /// </summary>
  154. /// <returns>System.String.</returns>
  155. protected override string CreateSortName()
  156. {
  157. return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("000-") : "")
  158. + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
  159. }
  160. /// <summary>
  161. /// Determines whether [contains episode number] [the specified number].
  162. /// </summary>
  163. /// <param name="number">The number.</param>
  164. /// <returns><c>true</c> if [contains episode number] [the specified number]; otherwise, <c>false</c>.</returns>
  165. public bool ContainsEpisodeNumber(int number)
  166. {
  167. if (IndexNumber.HasValue)
  168. {
  169. if (IndexNumberEnd.HasValue)
  170. {
  171. return number >= IndexNumber.Value && number <= IndexNumberEnd.Value;
  172. }
  173. return IndexNumber.Value == number;
  174. }
  175. return false;
  176. }
  177. [IgnoreDataMember]
  178. public bool IsMissingEpisode
  179. {
  180. get
  181. {
  182. return LocationType == Model.Entities.LocationType.Virtual && PremiereDate.HasValue && PremiereDate.Value < DateTime.UtcNow;
  183. }
  184. }
  185. [IgnoreDataMember]
  186. public bool IsUnaired
  187. {
  188. get { return PremiereDate.HasValue && PremiereDate.Value.ToLocalTime().Date >= DateTime.Now.Date; }
  189. }
  190. [IgnoreDataMember]
  191. public bool IsVirtualUnaired
  192. {
  193. get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; }
  194. }
  195. }
  196. }