Episode.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Runtime.Serialization;
  4. namespace MediaBrowser.Controller.Entities.TV
  5. {
  6. /// <summary>
  7. /// Class Episode
  8. /// </summary>
  9. public class Episode : Video
  10. {
  11. /// <summary>
  12. /// Episodes have a special Metadata folder
  13. /// </summary>
  14. /// <value>The meta location.</value>
  15. [IgnoreDataMember]
  16. public override string MetaLocation
  17. {
  18. get
  19. {
  20. return System.IO.Path.Combine(Parent.Path, "metadata");
  21. }
  22. }
  23. [IgnoreDataMember]
  24. protected override bool UseParentPathToCreateResolveArgs
  25. {
  26. get
  27. {
  28. return false;
  29. }
  30. }
  31. /// <summary>
  32. /// We want to group into series not show individually in an index
  33. /// </summary>
  34. /// <value><c>true</c> if [group in index]; otherwise, <c>false</c>.</value>
  35. [IgnoreDataMember]
  36. public override bool GroupInIndex
  37. {
  38. get { return true; }
  39. }
  40. /// <summary>
  41. /// We roll up into series
  42. /// </summary>
  43. /// <value>The index container.</value>
  44. [IgnoreDataMember]
  45. public override Folder IndexContainer
  46. {
  47. get
  48. {
  49. return Season;
  50. }
  51. }
  52. /// <summary>
  53. /// Gets the user data key.
  54. /// </summary>
  55. /// <returns>System.String.</returns>
  56. public override string GetUserDataKey()
  57. {
  58. if (Series != null && ParentIndexNumber.HasValue && IndexNumber.HasValue)
  59. {
  60. return Series.GetUserDataKey() + ParentIndexNumber.Value.ToString("000") + IndexNumber.Value.ToString("000");
  61. }
  62. return base.GetUserDataKey();
  63. }
  64. /// <summary>
  65. /// Override this if you need to combine/collapse person information
  66. /// </summary>
  67. /// <value>All people.</value>
  68. [IgnoreDataMember]
  69. public override IEnumerable<PersonInfo> AllPeople
  70. {
  71. get
  72. {
  73. if (People == null) return Series != null ? Series.People : People;
  74. return Series != null && Series.People != null ? People.Concat(Series.People) : base.AllPeople;
  75. }
  76. }
  77. /// <summary>
  78. /// Gets all genres.
  79. /// </summary>
  80. /// <value>All genres.</value>
  81. [IgnoreDataMember]
  82. public override IEnumerable<string> AllGenres
  83. {
  84. get
  85. {
  86. if (Genres == null) return Series != null ? Series.Genres : Genres;
  87. return Series != null && Series.Genres != null ? Genres.Concat(Series.Genres) : base.AllGenres;
  88. }
  89. }
  90. /// <summary>
  91. /// Gets all studios.
  92. /// </summary>
  93. /// <value>All studios.</value>
  94. [IgnoreDataMember]
  95. public override IEnumerable<string> AllStudios
  96. {
  97. get
  98. {
  99. if (Studios == null) return Series != null ? Series.Studios : Studios;
  100. return Series != null && Series.Studios != null ? Studios.Concat(Series.Studios) : base.AllStudios;
  101. }
  102. }
  103. /// <summary>
  104. /// Our rating comes from our series
  105. /// </summary>
  106. [IgnoreDataMember]
  107. public override string OfficialRatingForComparison
  108. {
  109. get { return Series != null ? Series.OfficialRatingForComparison : base.OfficialRatingForComparison; }
  110. }
  111. /// <summary>
  112. /// Our rating comes from our series
  113. /// </summary>
  114. [IgnoreDataMember]
  115. public override string CustomRatingForComparison
  116. {
  117. get { return Series != null ? Series.CustomRatingForComparison : base.CustomRatingForComparison; }
  118. }
  119. /// <summary>
  120. /// The _series
  121. /// </summary>
  122. private Series _series;
  123. /// <summary>
  124. /// This Episode's Series Instance
  125. /// </summary>
  126. /// <value>The series.</value>
  127. [IgnoreDataMember]
  128. public Series Series
  129. {
  130. get { return _series ?? (_series = FindParent<Series>()); }
  131. }
  132. /// <summary>
  133. /// The _season
  134. /// </summary>
  135. private Season _season;
  136. /// <summary>
  137. /// This Episode's Season Instance
  138. /// </summary>
  139. /// <value>The season.</value>
  140. [IgnoreDataMember]
  141. public Season Season
  142. {
  143. get { return _season ?? (_season = FindParent<Season>()); }
  144. }
  145. /// <summary>
  146. /// This is the ending episode number for double episodes.
  147. /// </summary>
  148. /// <value>The index number.</value>
  149. public int? IndexNumberEnd { get; set; }
  150. /// <summary>
  151. /// Creates the name of the sort.
  152. /// </summary>
  153. /// <returns>System.String.</returns>
  154. protected override string CreateSortName()
  155. {
  156. return (ParentIndexNumber != null ? ParentIndexNumber.Value.ToString("000-") : "")
  157. + (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
  158. }
  159. /// <summary>
  160. /// Determines whether [contains episode number] [the specified number].
  161. /// </summary>
  162. /// <param name="number">The number.</param>
  163. /// <returns><c>true</c> if [contains episode number] [the specified number]; otherwise, <c>false</c>.</returns>
  164. public bool ContainsEpisodeNumber(int number)
  165. {
  166. if (IndexNumber.HasValue)
  167. {
  168. if (IndexNumberEnd.HasValue)
  169. {
  170. return number >= IndexNumber.Value && number <= IndexNumberEnd.Value;
  171. }
  172. return IndexNumber.Value == number;
  173. }
  174. return false;
  175. }
  176. }
  177. }