/grawler/Grawler.Business/Data/TvShow.cs

http://grawler.googlecode.com/ · C# · 410 lines · 256 code · 50 blank · 104 comment · 7 complexity · 92bd88a6c6467ba9166843a2369c6d36 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Xml.Serialization;
  7. using Grawler.Business.Utility;
  8. using TvdbLib;
  9. using TvdbLib.Cache;
  10. using Grawler.Business.Parsing;
  11. namespace Grawler.Business.Data
  12. {
  13. [Serializable()]
  14. public class TvShow
  15. {
  16. #region Private variables
  17. private string _appVersion;
  18. private int _id;
  19. private string _imdbId;
  20. private int _tvDotComId;
  21. private string _zap2itId;
  22. private TvShowDataProvider _provider;
  23. private DateTime _lastUpdated;
  24. private string _name;
  25. private string _network;
  26. private double _duration;
  27. private DateTime _firstAired;
  28. private string _plot;
  29. private string _contentRating;
  30. private int _numberOfSeasons;
  31. private string _status;
  32. private double _rating;
  33. private string _fanArtBanner;
  34. private string _logoBanner;
  35. private string _coverArtBanner;
  36. private string _showBanner;
  37. private List<Actor> _actors;
  38. private List<string> _genres;
  39. private List<Season> _seasons;
  40. private NfoType _nfoType;
  41. #endregion
  42. #region Properties
  43. /// <summary>
  44. /// The application version used when generating.
  45. /// </summary>
  46. public string AppVersion
  47. {
  48. get { return _appVersion; }
  49. set { _appVersion = value; }
  50. }
  51. /// <summary>
  52. /// Id for the TV show.
  53. /// </summary>
  54. public int Id
  55. {
  56. get { return _id; }
  57. set { _id = value; }
  58. }
  59. /// <summary>
  60. /// IMDB Id for the TV show.
  61. /// </summary>
  62. public string ImdbId
  63. {
  64. get { return _imdbId; }
  65. set { _imdbId = value; }
  66. }
  67. /// <summary>
  68. /// TV.com Id for the TV show.
  69. /// </summary>
  70. public int TvDotComId
  71. {
  72. get { return _tvDotComId; }
  73. set { _tvDotComId = value; }
  74. }
  75. /// <summary>
  76. /// Zap2it Id for the TV show.
  77. /// </summary>
  78. public string Zap2itId
  79. {
  80. get { return _zap2itId; }
  81. set { _zap2itId = value; }
  82. }
  83. /// <summary>
  84. /// The provider that supplies the data.
  85. /// </summary>
  86. public TvShowDataProvider Provider
  87. {
  88. get { return _provider; }
  89. set { _provider = value; }
  90. }
  91. /// <summary>
  92. /// The NFO type.
  93. /// </summary>
  94. public NfoType NfoType
  95. {
  96. get { return _nfoType; }
  97. set { _nfoType = value; }
  98. }
  99. /// <summary>
  100. /// Indicates when the TV show information was last updated.
  101. /// </summary>
  102. public DateTime LastUpdated
  103. {
  104. get { return _lastUpdated; }
  105. set { _lastUpdated = value; }
  106. }
  107. /// <summary>
  108. /// The network that broadcasts the TV show.
  109. /// </summary>
  110. public string Network
  111. {
  112. get { return _network; }
  113. set { _network = value; }
  114. }
  115. /// <summary>
  116. /// The duration of an episode.
  117. /// </summary>
  118. public double Duration
  119. {
  120. get { return _duration; }
  121. set { _duration = value; }
  122. }
  123. /// <summary>
  124. /// The name of the TV show.
  125. /// </summary>
  126. public string Name
  127. {
  128. get { return _name; }
  129. set { _name = value; }
  130. }
  131. /// <summary>
  132. /// The date on which the TV show was first aired.
  133. /// </summary>
  134. public DateTime FirstAired
  135. {
  136. get { return _firstAired; }
  137. set { _firstAired = value; }
  138. }
  139. /// <summary>
  140. /// The overview of the TV show.
  141. /// </summary>
  142. public string Plot
  143. {
  144. get { return _plot; }
  145. set { _plot = value; }
  146. }
  147. /// <summary>
  148. /// The content rating for the TV show.
  149. /// </summary>
  150. public string ContentRating
  151. {
  152. get { return _contentRating; }
  153. set { _contentRating = value; }
  154. }
  155. /// <summary>
  156. /// The amount of seasons the TV show has.
  157. /// </summary>
  158. public int NumberOfSeasons
  159. {
  160. get { return _numberOfSeasons; }
  161. set { _numberOfSeasons = value; }
  162. }
  163. /// <summary>
  164. /// Current status of the TV show.
  165. /// </summary>
  166. public string Status
  167. {
  168. get { return _status; }
  169. set { _status = value; }
  170. }
  171. /// <summary>
  172. /// The rating for the TV show.
  173. /// </summary>
  174. public double Rating
  175. {
  176. get { return _rating; }
  177. set { _rating = value; }
  178. }
  179. /// <summary>
  180. /// The path where fanart can be found.
  181. /// </summary>
  182. public string FanArtBanner
  183. {
  184. get { return _fanArtBanner; }
  185. set { _fanArtBanner = value; }
  186. }
  187. /// <summary>
  188. /// The path where the logo can be found.
  189. /// </summary>
  190. public string LogoBanner
  191. {
  192. get { return _logoBanner; }
  193. set { _logoBanner = value; }
  194. }
  195. /// <summary>
  196. /// The path where coverart can be found.
  197. /// </summary>
  198. public string CoverArtBanner
  199. {
  200. get { return _coverArtBanner; }
  201. set { _coverArtBanner = value; }
  202. }
  203. /// <summary>
  204. /// The path where coverart can be found.
  205. /// </summary>
  206. public string ShowBanner
  207. {
  208. get { return _showBanner; }
  209. set { _showBanner = value; }
  210. }
  211. /// <summary>
  212. /// The genres in which the TV show is categorized.
  213. /// </summary>
  214. public List<string> Genres
  215. {
  216. get { return _genres; }
  217. set { _genres = value; }
  218. }
  219. /// <summary>
  220. /// A list of actors that perform in the TV show.
  221. /// </summary>
  222. public List<Actor> Actors
  223. {
  224. get { return _actors; }
  225. set { _actors = value; }
  226. }
  227. /// <summary>
  228. /// A count of the amount of episodes.
  229. /// </summary>
  230. public int NumberOfTotalEpisodes
  231. {
  232. get
  233. {
  234. int count = 0;
  235. foreach (Season season in _seasons)
  236. count += season.Episodes.Count;
  237. return count;
  238. }
  239. }
  240. /// <summary>
  241. /// A count of the amount of regular episodes, not counting specials.
  242. /// </summary>
  243. public int NumberOfRegularEpisodes
  244. {
  245. get
  246. {
  247. int count = 0;
  248. foreach (Season season in _seasons)
  249. count += season.Episodes.FindAll((Episode e) => e.SeasonNumber > 0).Count;
  250. return count;
  251. }
  252. }
  253. /// <summary>
  254. /// A simplified version of the TV show's name.
  255. /// </summary>
  256. public string Slug
  257. {
  258. get { return Common.CreatePersistableName(_name); }
  259. }
  260. /// <summary>
  261. /// A list of seasons for the TV show.
  262. /// </summary>
  263. public List<Season> Seasons
  264. {
  265. get { return _seasons; }
  266. set { _seasons = value; }
  267. }
  268. /// <summary>
  269. /// A list of seasons for the TV show.
  270. /// </summary>
  271. [XmlIgnore]
  272. public List<Season> SeasonsSorted
  273. {
  274. get { return _seasons.OrderBy(f => f.SeasonNumber).ToList(); }
  275. }
  276. #endregion
  277. #region Methods
  278. /// <summary>
  279. /// Retrieve an episode of the current TV show.
  280. /// </summary>
  281. /// <param name="season">The season to search the episode in.</param>
  282. /// <param name="episode">The episode to search for.</param>
  283. /// <returns></returns>
  284. /// <remarks></remarks>
  285. public Episode GetEpisode(int seasonNr, int episodeNr)
  286. {
  287. Season season = this.Seasons.Find((Season s) => s.SeasonNumber == seasonNr);
  288. if (season != null)
  289. {
  290. if (season.Episodes != null)
  291. {
  292. return season.Episodes.Find((Episode e) => e.EpisodeNumber == episodeNr);
  293. }
  294. }
  295. return null;
  296. }
  297. /// <summary>
  298. /// Loads a TV show from the data directory.
  299. /// </summary>
  300. /// <param name="showName"></param>
  301. /// <returns></returns>
  302. public bool LoadFromDataFile(string showName)
  303. {
  304. string path = Constants.TVShowsDir + "\\" + Common.CreatePersistableName(showName) + "\\" + Common.CreatePersistableName(showName) + ".xml";
  305. if (File.Exists(path))
  306. {
  307. LoadFromFile(path);
  308. return true;
  309. }
  310. else
  311. {
  312. return false;
  313. }
  314. }
  315. /// <summary>
  316. /// Loads a TV show from a file.
  317. /// </summary>
  318. /// <param name="path"></param>
  319. public void LoadFromFile(string path)
  320. {
  321. XmlSerializer x = new XmlSerializer(this.GetType());
  322. TvShow tvshow = null;
  323. using (StreamReader reader = new StreamReader(path, System.Text.Encoding.UTF8))
  324. {
  325. tvshow = (TvShow)x.Deserialize(reader);
  326. LoadFromObject(tvshow);
  327. }
  328. }
  329. /// <summary>
  330. /// Loads values into this TV show object from another.
  331. /// </summary>
  332. /// <param name="showToLoadFrom"></param>
  333. public void LoadFromObject(TvShow showToLoadFrom)
  334. {
  335. this.Actors = showToLoadFrom.Actors;
  336. this.ContentRating = showToLoadFrom.ContentRating;
  337. this.Duration = showToLoadFrom.Duration;
  338. this.Seasons = showToLoadFrom.Seasons;
  339. this.FirstAired = showToLoadFrom.FirstAired;
  340. this.Genres = showToLoadFrom.Genres;
  341. this.Id = showToLoadFrom.Id;
  342. this.Provider = showToLoadFrom.Provider;
  343. this.Name = showToLoadFrom.Name;
  344. this.Network = showToLoadFrom.Network;
  345. this.NumberOfSeasons = showToLoadFrom.NumberOfSeasons;
  346. this.Rating = showToLoadFrom.Rating;
  347. this.Status = showToLoadFrom.Status;
  348. this.LastUpdated = showToLoadFrom.LastUpdated;
  349. this.Plot = showToLoadFrom.Plot;
  350. this.FanArtBanner = showToLoadFrom.FanArtBanner;
  351. this.LogoBanner = showToLoadFrom.LogoBanner;
  352. this.CoverArtBanner = showToLoadFrom.CoverArtBanner;
  353. this.AppVersion = showToLoadFrom.AppVersion;
  354. this.ImdbId = showToLoadFrom.ImdbId;
  355. this.Zap2itId = showToLoadFrom.Zap2itId;
  356. this.TvDotComId = showToLoadFrom.TvDotComId;
  357. }
  358. #endregion
  359. }
  360. }