Episode.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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. /// Override this if you need to combine/collapse person information
  112. /// </summary>
  113. /// <value>All people.</value>
  114. [IgnoreDataMember]
  115. public override IEnumerable<PersonInfo> AllPeople
  116. {
  117. get
  118. {
  119. if (People == null) return Series != null ? Series.People : People;
  120. return Series != null && Series.People != null ? People.Concat(Series.People) : base.AllPeople;
  121. }
  122. }
  123. /// <summary>
  124. /// Gets all genres.
  125. /// </summary>
  126. /// <value>All genres.</value>
  127. [IgnoreDataMember]
  128. public override IEnumerable<string> AllGenres
  129. {
  130. get
  131. {
  132. if (Genres == null) return Series != null ? Series.Genres : Genres;
  133. return Series != null && Series.Genres != null ? Genres.Concat(Series.Genres) : base.AllGenres;
  134. }
  135. }
  136. /// <summary>
  137. /// Gets all studios.
  138. /// </summary>
  139. /// <value>All studios.</value>
  140. [IgnoreDataMember]
  141. public override IEnumerable<string> AllStudios
  142. {
  143. get
  144. {
  145. if (Studios == null) return Series != null ? Series.Studios : Studios;
  146. return Series != null && Series.Studios != null ? Studios.Concat(Series.Studios) : base.AllStudios;
  147. }
  148. }
  149. /// <summary>
  150. /// Our rating comes from our series
  151. /// </summary>
  152. [IgnoreDataMember]
  153. public override string OfficialRatingForComparison
  154. {
  155. get { return Series != null ? Series.OfficialRatingForComparison : base.OfficialRatingForComparison; }
  156. }
  157. /// <summary>
  158. /// Our rating comes from our series
  159. /// </summary>
  160. [IgnoreDataMember]
  161. public override string CustomRatingForComparison
  162. {
  163. get { return Series != null ? Series.CustomRatingForComparison : base.CustomRatingForComparison; }
  164. }
  165. /// <summary>
  166. /// The _series
  167. /// </summary>
  168. private Series _series;
  169. /// <summary>
  170. /// This Episode's Series Instance
  171. /// </summary>
  172. /// <value>The series.</value>
  173. [IgnoreDataMember]
  174. public Series Series
  175. {
  176. get { return _series ?? (_series = FindParent<Series>()); }
  177. }
  178. /// <summary>
  179. /// This is the ending episode number for double episodes.
  180. /// </summary>
  181. /// <value>The index number.</value>
  182. public int? IndexNumberEnd { get; set; }
  183. /// <summary>
  184. /// Creates the name of the sort.
  185. /// </summary>
  186. /// <returns>System.String.</returns>
  187. protected override string CreateSortName()
  188. {
  189. return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("000-") : "")
  190. + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
  191. }
  192. /// <summary>
  193. /// Determines whether [contains episode number] [the specified number].
  194. /// </summary>
  195. /// <param name="number">The number.</param>
  196. /// <returns><c>true</c> if [contains episode number] [the specified number]; otherwise, <c>false</c>.</returns>
  197. public bool ContainsEpisodeNumber(int number)
  198. {
  199. if (IndexNumber.HasValue)
  200. {
  201. if (IndexNumberEnd.HasValue)
  202. {
  203. return number >= IndexNumber.Value && number <= IndexNumberEnd.Value;
  204. }
  205. return IndexNumber.Value == number;
  206. }
  207. return false;
  208. }
  209. [IgnoreDataMember]
  210. public bool IsMissingEpisode
  211. {
  212. get
  213. {
  214. return LocationType == Model.Entities.LocationType.Virtual && PremiereDate.HasValue && PremiereDate.Value < DateTime.UtcNow;
  215. }
  216. }
  217. [IgnoreDataMember]
  218. public bool IsUnaired
  219. {
  220. get { return PremiereDate.HasValue && PremiereDate.Value.ToLocalTime().Date >= DateTime.Now.Date; }
  221. }
  222. [IgnoreDataMember]
  223. public bool IsVirtualUnaired
  224. {
  225. get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; }
  226. }
  227. [IgnoreDataMember]
  228. public Guid? SeasonId
  229. {
  230. get
  231. {
  232. // First see if the parent is a Season
  233. var season = Parent as Season;
  234. if (season != null)
  235. {
  236. return season.Id;
  237. }
  238. var seasonNumber = ParentIndexNumber;
  239. // Parent is a Series
  240. if (seasonNumber.HasValue)
  241. {
  242. var series = Parent as Series;
  243. if (series != null)
  244. {
  245. season = series.Children.OfType<Season>()
  246. .FirstOrDefault(i => i.IndexNumber.HasValue && i.IndexNumber.Value == seasonNumber.Value);
  247. if (season != null)
  248. {
  249. return season.Id;
  250. }
  251. }
  252. }
  253. return null;
  254. }
  255. }
  256. public override IEnumerable<string> GetDeletePaths()
  257. {
  258. return new[] { Path };
  259. }
  260. protected override bool GetBlockUnratedValue(UserConfiguration config)
  261. {
  262. return config.BlockUnratedSeries;
  263. }
  264. }
  265. }