Episode.cs 7.5 KB

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