PageRenderTime 54ms CodeModel.GetById 10ms RepoModel.GetById 1ms app.codeStats 0ms

/JMMServer/JMMServer/Providers/TraktTV/TraktTVHelper.cs

https://bitbucket.org/gibwar/jmm-test
C# | 1455 lines | 1123 code | 254 blank | 78 comment | 206 complexity | ed5b7cb8830011d0af76ef9223d4a192 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using NLog;
  6. using JMMServer.Repositories;
  7. using JMMServer.Entities;
  8. using System.Xml;
  9. using JMMServer.Commands;
  10. using System.IO;
  11. using System.Net;
  12. using BinaryNorthwest;
  13. using JMMContracts;
  14. using NHibernate;
  15. namespace JMMServer.Providers.TraktTV
  16. {
  17. public class TraktTVHelper
  18. {
  19. private static Logger logger = LogManager.GetCurrentClassLogger();
  20. public static TraktTVShow GetShowInfo(string traktID)
  21. {
  22. TraktTVShow tvshow = new TraktTVShow();
  23. try
  24. {
  25. string url = string.Format(Constants.TraktTvURLs.URLGetShowExtended, Constants.TraktTvURLs.APIKey, traktID);
  26. logger.Trace("GetShowInfo: {0}", url);
  27. // Search for a series
  28. string json = Utils.DownloadWebPage(url);
  29. if (json.Trim().Length == 0) return null;
  30. tvshow = JSONHelper.Deserialize<TraktTVShow>(json);
  31. // save this data to the DB for use later
  32. SaveExtendedShowInfo(tvshow);
  33. }
  34. catch (Exception ex)
  35. {
  36. logger.ErrorException("Error in TraktTVHelper.GetShowInfo: " + ex.ToString(), ex);
  37. return null;
  38. }
  39. return tvshow;
  40. }
  41. public static List<TraktTVFriendRequest> GetFriendsRequests()
  42. {
  43. List<TraktTVFriendRequest> friends = new List<TraktTVFriendRequest>();
  44. try
  45. {
  46. string url = string.Format(Constants.TraktTvURLs.URLPostFriendsRequests, Constants.TraktTvURLs.APIKey);
  47. logger.Trace("GetFriendsRequests: {0}", url);
  48. TraktTVPost_FriendsRequests cmd = new TraktTVPost_FriendsRequests();
  49. cmd.Init();
  50. string json = JSONHelper.Serialize<TraktTVPost_FriendsRequests>(cmd);
  51. string jsonResponse = SendData(url, json);
  52. if (string.IsNullOrEmpty(jsonResponse)) return friends;
  53. friends = JSONHelper.Deserialize<List<TraktTVFriendRequest>>(jsonResponse);
  54. }
  55. catch (Exception ex)
  56. {
  57. logger.ErrorException("Error in TraktTVHelper.GetFriends: " + ex.ToString(), ex);
  58. return null;
  59. }
  60. return friends;
  61. }
  62. public static bool PostShoutShow(int animeID, string shoutText, bool isSpoiler, ref string returnMessage)
  63. {
  64. returnMessage = "";
  65. try
  66. {
  67. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  68. {
  69. returnMessage = "Trakt credentials have not been entered";
  70. return false;
  71. }
  72. if (string.IsNullOrEmpty(shoutText))
  73. {
  74. returnMessage = "Please enter text for your shout";
  75. return false;
  76. }
  77. CrossRef_AniDB_TraktRepository repXrefTrakt = new CrossRef_AniDB_TraktRepository();
  78. Trakt_ShowRepository repTraktShow = new Trakt_ShowRepository();
  79. CrossRef_AniDB_Trakt traktXRef = repXrefTrakt.GetByAnimeID(animeID);
  80. if (traktXRef == null)
  81. {
  82. returnMessage = string.Format("Could not find trakt show for Anime ID: {0}", animeID);
  83. return false;
  84. }
  85. Trakt_Show show = repTraktShow.GetByTraktID(traktXRef.TraktID);
  86. if (show == null || !show.TvDB_ID.HasValue)
  87. {
  88. returnMessage = string.Format("Could not find trakt show for Anime ID: {0}", animeID);
  89. return false;
  90. }
  91. TraktTVPost_ShoutShow cmd = new TraktTVPost_ShoutShow();
  92. cmd.Init(shoutText, isSpoiler, show.TvDB_ID.Value);
  93. string url = string.Format(Constants.TraktTvURLs.URLPostShoutShow, Constants.TraktTvURLs.APIKey);
  94. logger.Trace("PostShoutShow: {0}", url);
  95. string json = JSONHelper.Serialize<TraktTVPost_ShoutShow>(cmd);
  96. string jsonResponse = SendData(url, json);
  97. TraktTVGenericResponse genResponse = JSONHelper.Deserialize<TraktTVGenericResponse>(jsonResponse);
  98. if (genResponse.IsSuccess)
  99. {
  100. returnMessage = genResponse.message;
  101. return true;
  102. }
  103. else
  104. {
  105. returnMessage = genResponse.error;
  106. return false;
  107. }
  108. }
  109. catch (Exception ex)
  110. {
  111. logger.ErrorException("Error in TraktTVHelper.PostShoutShow: " + ex.ToString(), ex);
  112. returnMessage = ex.Message;
  113. return false;
  114. }
  115. }
  116. public static List<TraktTV_ShoutGet> GetShowShouts(int animeID)
  117. {
  118. using (var session = JMMService.SessionFactory.OpenSession())
  119. {
  120. return GetShowShouts(session, animeID);
  121. }
  122. }
  123. public static List<TraktTV_ShoutGet> GetShowShouts(ISession session, int animeID)
  124. {
  125. List<TraktTV_ShoutGet> shouts = null;
  126. try
  127. {
  128. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  129. return null;
  130. CrossRef_AniDB_TraktRepository repXrefTrakt = new CrossRef_AniDB_TraktRepository();
  131. CrossRef_AniDB_Trakt traktXRef = repXrefTrakt.GetByAnimeID(session, animeID);
  132. if (traktXRef == null) return null;
  133. string url = string.Format(Constants.TraktTvURLs.URLGetShowShouts, Constants.TraktTvURLs.APIKey, traktXRef.TraktID);
  134. logger.Trace("GetShowShouts: {0}", url);
  135. // Search for a series
  136. string json = Utils.DownloadWebPage(url);
  137. if (json.Trim().Length == 0) return new List<TraktTV_ShoutGet>();
  138. shouts = JSONHelper.Deserialize<List<TraktTV_ShoutGet>>(json);
  139. Trakt_FriendRepository repFriends = new Trakt_FriendRepository();
  140. foreach (TraktTV_ShoutGet shout in shouts)
  141. {
  142. Trakt_Friend traktFriend = repFriends.GetByUsername(session, shout.user.username);
  143. if (traktFriend == null)
  144. {
  145. traktFriend = new Trakt_Friend();
  146. traktFriend.LastAvatarUpdate = DateTime.Now;
  147. }
  148. traktFriend.Populate(shout.user);
  149. repFriends.Save(traktFriend);
  150. if (!string.IsNullOrEmpty(traktFriend.FullImagePath))
  151. {
  152. bool fileExists = File.Exists(traktFriend.FullImagePath);
  153. TimeSpan ts = DateTime.Now - traktFriend.LastAvatarUpdate;
  154. if (!fileExists || ts.TotalHours > 8)
  155. {
  156. traktFriend.LastAvatarUpdate = DateTime.Now;
  157. CommandRequest_DownloadImage cmd = new CommandRequest_DownloadImage(traktFriend.Trakt_FriendID, JMMImageType.Trakt_Friend, true);
  158. cmd.Save(session);
  159. }
  160. }
  161. }
  162. }
  163. catch (Exception ex)
  164. {
  165. logger.ErrorException("Error in TraktTVHelper.GetShowShouts: " + ex.ToString(), ex);
  166. }
  167. return shouts;
  168. }
  169. public static TraktTV_ActivitySummary GetActivityFriends(bool shoutsOnly)
  170. {
  171. TraktTV_ActivitySummary summ = null;
  172. try
  173. {
  174. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  175. return null;
  176. string url = string.Format(Constants.TraktTvURLs.URLGetActivityFriends, Constants.TraktTvURLs.APIKey);
  177. if (shoutsOnly)
  178. url = string.Format(Constants.TraktTvURLs.URLGetActivityFriendsShoutsOnly, Constants.TraktTvURLs.APIKey);
  179. logger.Trace("GetActivityFriends: {0}", url);
  180. TraktTVPost_GetFriends cmdFriends = new TraktTVPost_GetFriends();
  181. cmdFriends.Init();
  182. string json = JSONHelper.Serialize<TraktTVPost_GetFriends>(cmdFriends); // TraktTVPost_GetFriends is really just an auth method
  183. string jsonResponse = SendData(url, json);
  184. if (jsonResponse.Trim().Length == 0) return null;
  185. summ = JSONHelper.Deserialize<TraktTV_ActivitySummary>(jsonResponse);
  186. if (summ == null) return null;
  187. // save any trakt data that we don't have already
  188. Trakt_ShowRepository repShows = new Trakt_ShowRepository();
  189. Trakt_EpisodeRepository repEpisodes = new Trakt_EpisodeRepository();
  190. Trakt_FriendRepository repFriends = new Trakt_FriendRepository();
  191. foreach (TraktTV_Activity act in summ.activity)
  192. {
  193. if (act.user == null) continue;
  194. TraktTV_UserActivity friend = act.user;
  195. Trakt_Friend traktFriend = repFriends.GetByUsername(friend.username);
  196. if (traktFriend == null)
  197. {
  198. traktFriend = new Trakt_Friend();
  199. traktFriend.LastAvatarUpdate = DateTime.Now;
  200. }
  201. traktFriend.Populate(friend);
  202. repFriends.Save(traktFriend);
  203. if (!string.IsNullOrEmpty(traktFriend.FullImagePath))
  204. {
  205. bool fileExists = File.Exists(traktFriend.FullImagePath);
  206. TimeSpan ts = DateTime.Now - traktFriend.LastAvatarUpdate;
  207. if (!fileExists || ts.TotalHours > 8)
  208. {
  209. traktFriend.LastAvatarUpdate = DateTime.Now;
  210. CommandRequest_DownloadImage cmd = new CommandRequest_DownloadImage(traktFriend.Trakt_FriendID, JMMImageType.Trakt_Friend, true);
  211. cmd.Save();
  212. }
  213. }
  214. if (act.episode != null && act.show != null)
  215. {
  216. Trakt_Show show = repShows.GetByTraktID(act.show.TraktID);
  217. if (show == null)
  218. {
  219. show = new Trakt_Show();
  220. show.Populate(act.show);
  221. repShows.Save(show);
  222. }
  223. Trakt_Episode episode = repEpisodes.GetByShowIDSeasonAndEpisode(show.Trakt_ShowID, int.Parse(act.episode.season), int.Parse(act.episode.number));
  224. if (episode == null)
  225. episode = new Trakt_Episode();
  226. episode.Populate(act.episode, show.Trakt_ShowID);
  227. repEpisodes.Save(episode);
  228. if (!string.IsNullOrEmpty(episode.FullImagePath))
  229. {
  230. bool fileExists = File.Exists(episode.FullImagePath);
  231. if (!fileExists)
  232. {
  233. CommandRequest_DownloadImage cmd = new CommandRequest_DownloadImage(episode.Trakt_EpisodeID, JMMImageType.Trakt_Episode, false);
  234. cmd.Save();
  235. }
  236. }
  237. }
  238. // a shout on just the show
  239. if (act.episode == null && act.show != null)
  240. {
  241. Trakt_Show show = repShows.GetByTraktID(act.show.TraktID);
  242. if (show == null)
  243. {
  244. show = new Trakt_Show();
  245. show.Populate(act.show);
  246. repShows.Save(show);
  247. }
  248. }
  249. }
  250. }
  251. catch (Exception ex)
  252. {
  253. logger.ErrorException("Error in TraktTVHelper.GetActivityFriends: " + ex.ToString(), ex);
  254. }
  255. return summ;
  256. }
  257. public static List<TraktTVUser> GetFriends()
  258. {
  259. List<TraktTVUser> friends = new List<TraktTVUser>();
  260. try
  261. {
  262. string url = string.Format(Constants.TraktTvURLs.URLGetFriends, Constants.TraktTvURLs.APIKey, ServerSettings.Trakt_Username);
  263. //string url = string.Format(Constants.TraktTvURLs.URLGetFriends, Constants.TraktTvURLs.APIKey, "lwerndly");
  264. logger.Trace("GetFriends: {0}", url);
  265. TraktTVPost_GetFriends cmdFriends = new TraktTVPost_GetFriends();
  266. cmdFriends.Init();
  267. string json = JSONHelper.Serialize<TraktTVPost_GetFriends>(cmdFriends);
  268. string jsonResponse = SendData(url, json);
  269. if (jsonResponse.Trim().Length == 0) return friends;
  270. friends = JSONHelper.Deserialize<List<TraktTVUser>>(jsonResponse);
  271. /*string json = Utils.DownloadWebPage(url);
  272. if (json.Trim().Length == 0) return null;
  273. friends = JSONHelper.Deserialize<List<TraktTVUser>>(json);*/
  274. Trakt_ShowRepository repShows = new Trakt_ShowRepository();
  275. Trakt_EpisodeRepository repEpisodes = new Trakt_EpisodeRepository();
  276. Trakt_FriendRepository repFriends = new Trakt_FriendRepository();
  277. foreach (TraktTVUser friend in friends)
  278. {
  279. Trakt_Friend traktFriend = repFriends.GetByUsername(friend.username);
  280. if (traktFriend == null)
  281. {
  282. traktFriend = new Trakt_Friend();
  283. traktFriend.LastAvatarUpdate = DateTime.Now;
  284. }
  285. traktFriend.Populate(friend);
  286. repFriends.Save(traktFriend);
  287. if (!string.IsNullOrEmpty(traktFriend.FullImagePath))
  288. {
  289. bool fileExists = File.Exists(traktFriend.FullImagePath);
  290. TimeSpan ts = DateTime.Now - traktFriend.LastAvatarUpdate;
  291. if (!fileExists || ts.TotalHours > 8)
  292. {
  293. traktFriend.LastAvatarUpdate = DateTime.Now;
  294. CommandRequest_DownloadImage cmd = new CommandRequest_DownloadImage(traktFriend.Trakt_FriendID, JMMImageType.Trakt_Friend, true);
  295. cmd.Save();
  296. }
  297. }
  298. foreach (TraktTVWatched wtch in friend.watched)
  299. {
  300. if (wtch.episode != null && wtch.show != null)
  301. {
  302. Trakt_Show show = repShows.GetByTraktID(wtch.show.TraktID);
  303. if (show == null)
  304. {
  305. show = new Trakt_Show();
  306. show.Populate(wtch.show);
  307. repShows.Save(show);
  308. }
  309. Trakt_Episode episode = repEpisodes.GetByShowIDSeasonAndEpisode(show.Trakt_ShowID, int.Parse(wtch.episode.season), int.Parse(wtch.episode.number));
  310. if (episode == null)
  311. episode = new Trakt_Episode();
  312. episode.Populate(wtch.episode, show.Trakt_ShowID);
  313. repEpisodes.Save(episode);
  314. if (!string.IsNullOrEmpty(episode.FullImagePath))
  315. {
  316. bool fileExists = File.Exists(episode.FullImagePath);
  317. if (!fileExists)
  318. {
  319. CommandRequest_DownloadImage cmd = new CommandRequest_DownloadImage(episode.Trakt_EpisodeID, JMMImageType.Trakt_Episode, false);
  320. cmd.Save();
  321. }
  322. }
  323. }
  324. }
  325. }
  326. //Contract_Trakt_Friend fr = friends[0].ToContract();
  327. }
  328. catch (Exception ex)
  329. {
  330. logger.ErrorException("Error in TraktTVHelper.GetFriends: " + ex.ToString(), ex);
  331. return friends;
  332. }
  333. return friends;
  334. }
  335. public static void SaveExtendedShowInfo(TraktTVShow tvshow)
  336. {
  337. try
  338. {
  339. // save this data to the DB for use later
  340. Trakt_ImageFanartRepository repFanart = new Trakt_ImageFanartRepository();
  341. Trakt_ShowRepository repShows = new Trakt_ShowRepository();
  342. Trakt_Show show = repShows.GetByTraktID(tvshow.TraktID);
  343. if (show == null)
  344. show = new Trakt_Show();
  345. show.Populate(tvshow);
  346. repShows.Save(show);
  347. if (tvshow.images != null)
  348. {
  349. if (!string.IsNullOrEmpty(tvshow.images.fanart))
  350. {
  351. Trakt_ImageFanart fanart = repFanart.GetByShowIDAndSeason(show.Trakt_ShowID, 1);
  352. if (fanart == null)
  353. {
  354. fanart = new Trakt_ImageFanart();
  355. fanart.Enabled = 0;
  356. }
  357. fanart.ImageURL = tvshow.images.fanart;
  358. fanart.Season = 1;
  359. fanart.Trakt_ShowID = show.Trakt_ShowID;
  360. repFanart.Save(fanart);
  361. }
  362. }
  363. // save the seasons
  364. Trakt_SeasonRepository repSeasons = new Trakt_SeasonRepository();
  365. Trakt_EpisodeRepository repEpisodes = new Trakt_EpisodeRepository();
  366. Trakt_ImagePosterRepository repPosters = new Trakt_ImagePosterRepository();
  367. foreach (TraktTVSeason sea in tvshow.seasons)
  368. {
  369. Trakt_Season season = repSeasons.GetByShowIDAndSeason(show.Trakt_ShowID, int.Parse(sea.season));
  370. if (season == null)
  371. season = new Trakt_Season();
  372. season.Season = int.Parse(sea.season);
  373. season.URL = sea.url;
  374. season.Trakt_ShowID = show.Trakt_ShowID;
  375. repSeasons.Save(season);
  376. if (sea.images != null)
  377. {
  378. if (!string.IsNullOrEmpty(sea.images.poster))
  379. {
  380. Trakt_ImagePoster poster = repPosters.GetByShowIDAndSeason(show.Trakt_ShowID, season.Season);
  381. if (poster == null)
  382. {
  383. poster = new Trakt_ImagePoster();
  384. poster.Enabled = 0;
  385. }
  386. poster.ImageURL = sea.images.poster;
  387. poster.Season = season.Season;
  388. poster.Trakt_ShowID = show.Trakt_ShowID;
  389. repPosters.Save(poster);
  390. }
  391. }
  392. foreach (TraktTVEpisode ep in sea.episodes)
  393. {
  394. Trakt_Episode episode = repEpisodes.GetByShowIDSeasonAndEpisode(show.Trakt_ShowID, int.Parse(ep.season), int.Parse(ep.episode));
  395. if (episode == null)
  396. episode = new Trakt_Episode();
  397. episode.EpisodeImage = ep.screen;
  398. episode.EpisodeNumber = int.Parse(ep.episode);
  399. episode.Overview = ep.overview;
  400. episode.Season = int.Parse(ep.season);
  401. episode.Title = ep.title;
  402. episode.URL = ep.url;
  403. episode.Trakt_ShowID = show.Trakt_ShowID;
  404. repEpisodes.Save(episode);
  405. }
  406. }
  407. }
  408. catch (Exception ex)
  409. {
  410. logger.ErrorException("Error in TraktTVHelper.SaveExtendedShowInfo: " + ex.ToString(), ex);
  411. }
  412. }
  413. public static void SaveShowInfo(TraktTVShow tvshow)
  414. {
  415. try
  416. {
  417. // save this data to the DB for use later
  418. Trakt_ImageFanartRepository repFanart = new Trakt_ImageFanartRepository();
  419. Trakt_ShowRepository repShows = new Trakt_ShowRepository();
  420. Trakt_Show show = repShows.GetByTraktID(tvshow.TraktID);
  421. if (show == null)
  422. show = new Trakt_Show();
  423. show.Overview = tvshow.overview;
  424. show.Title = tvshow.title;
  425. show.TraktID = tvshow.TraktID;
  426. if (!string.IsNullOrEmpty(tvshow.tvdb_id)) show.TvDB_ID = int.Parse(tvshow.tvdb_id);
  427. show.URL = tvshow.url;
  428. show.Year = tvshow.year;
  429. repShows.Save(show);
  430. if (tvshow.images != null)
  431. {
  432. if (!string.IsNullOrEmpty(tvshow.images.fanart))
  433. {
  434. Trakt_ImageFanart fanart = repFanart.GetByShowIDAndSeason(show.Trakt_ShowID, 1);
  435. if (fanart == null)
  436. {
  437. fanart = new Trakt_ImageFanart();
  438. fanart.Enabled = 1;
  439. }
  440. fanart.ImageURL = tvshow.images.fanart;
  441. fanart.Season = 1;
  442. fanart.Trakt_ShowID = show.Trakt_ShowID;
  443. repFanart.Save(fanart);
  444. }
  445. }
  446. }
  447. catch (Exception ex)
  448. {
  449. logger.ErrorException("Error in TraktTVHelper.SaveExtendedShowInfo: " + ex.ToString(), ex);
  450. }
  451. }
  452. public static TraktTVShow GetShowInfo(int tvDBID)
  453. {
  454. return GetShowInfo(tvDBID.ToString());
  455. }
  456. public static void LinkAniDBTrakt(int animeID, string traktID, int seasonNumber, bool fromWebCache)
  457. {
  458. using (var session = JMMService.SessionFactory.OpenSession())
  459. {
  460. LinkAniDBTrakt(session, animeID, traktID, seasonNumber, fromWebCache);
  461. }
  462. }
  463. public static void LinkAniDBTrakt(ISession session, int animeID, string traktID, int seasonNumber, bool fromWebCache)
  464. {
  465. CrossRef_AniDB_TraktRepository repCrossRef = new CrossRef_AniDB_TraktRepository();
  466. CrossRef_AniDB_Trakt xrefTemp = repCrossRef.GetByTraktID(traktID, seasonNumber);
  467. if (xrefTemp != null)
  468. {
  469. string msg = string.Format("Not using Trakt link as one already exists {0} ({1}) - {2}", traktID, seasonNumber, animeID);
  470. logger.Warn(msg);
  471. return;
  472. }
  473. // check if we have this information locally
  474. // if not download it now
  475. Trakt_ShowRepository repShow = new Trakt_ShowRepository();
  476. Trakt_Show traktShow = repShow.GetByTraktID(traktID);
  477. if (traktShow == null)
  478. {
  479. // we download the series info here
  480. TraktTVShow tvshow = GetShowInfo(traktID);
  481. if (tvshow == null) return;
  482. }
  483. // download fanart, posters
  484. DownloadAllImages(traktID);
  485. CrossRef_AniDB_Trakt xref = repCrossRef.GetByAnimeID(animeID);
  486. if (xref == null)
  487. xref = new CrossRef_AniDB_Trakt();
  488. xref.AnimeID = animeID;
  489. if (fromWebCache)
  490. xref.CrossRefSource = (int)CrossRefSource.WebCache;
  491. else
  492. xref.CrossRefSource = (int)CrossRefSource.User;
  493. xref.TraktID = traktID;
  494. xref.TraktSeasonNumber = seasonNumber;
  495. repCrossRef.Save(xref);
  496. StatsCache.Instance.UpdateUsingAnime(session, animeID);
  497. logger.Trace("Changed trakt association: {0}", animeID);
  498. CommandRequest_WebCacheSendXRefAniDBTrakt req = new CommandRequest_WebCacheSendXRefAniDBTrakt(xref.CrossRef_AniDB_TraktID);
  499. req.Save();
  500. }
  501. // Removes all Trakt information from a series, bringing it back to a blank state.
  502. public static void RemoveLinkAniDBTrakt(AnimeSeries ser)
  503. {
  504. CrossRef_AniDB_TraktRepository repCrossRef = new CrossRef_AniDB_TraktRepository();
  505. CrossRef_AniDB_Trakt xref = repCrossRef.GetByAnimeID(ser.AniDB_ID);
  506. if (xref == null) return;
  507. repCrossRef.Delete(xref.CrossRef_AniDB_TraktID);
  508. CommandRequest_WebCacheDeleteXRefAniDBTrakt req = new CommandRequest_WebCacheDeleteXRefAniDBTrakt(ser.AniDB_ID);
  509. req.Save();
  510. }
  511. public static List<TraktTVShow> SearchShow(string criteria)
  512. {
  513. List<TraktTVShow> results = new List<TraktTVShow>();
  514. try
  515. {
  516. // replace spaces with a + symbo
  517. criteria = criteria.Replace(' ', '+');
  518. // Search for a series
  519. string url = string.Format(Constants.TraktTvURLs.URLSearchShow, Constants.TraktTvURLs.APIKey, criteria);
  520. logger.Trace("Search Trakt Show: {0}", url);
  521. // Search for a series
  522. string json = Utils.DownloadWebPage(url);
  523. if (json.Trim().Length == 0) return new List<TraktTVShow>();
  524. results = JSONHelper.Deserialize<List<TraktTVShow>>(json);
  525. // save this data for later use
  526. //foreach (TraktTVShow tvshow in results)
  527. // SaveExtendedShowInfo(tvshow);
  528. }
  529. catch (Exception ex)
  530. {
  531. logger.ErrorException("Error in SearchSeries: " + ex.ToString(), ex);
  532. }
  533. return results;
  534. }
  535. public static List<TraktTVShowUserCollectionWatched> GetUserCollection()
  536. {
  537. List<TraktTVShowUserCollectionWatched> results = new List<TraktTVShowUserCollectionWatched>();
  538. try
  539. {
  540. string url = string.Format(Constants.TraktTvURLs.URLUserLibraryShowsCollection, Constants.TraktTvURLs.APIKey, ServerSettings.Trakt_Username);
  541. logger.Trace("Trakt User Collection: {0}", url);
  542. // Search for a series
  543. string json = Utils.DownloadWebPage(url);
  544. if (json.Trim().Length == 0) return new List<TraktTVShowUserCollectionWatched>();
  545. results = JSONHelper.Deserialize<List<TraktTVShowUserCollectionWatched>>(json);
  546. }
  547. catch (Exception ex)
  548. {
  549. logger.ErrorException("Error in SearchSeries: " + ex.ToString(), ex);
  550. }
  551. return results;
  552. }
  553. public static List<TraktTVShowUserCollectionWatched> GetUserWatched()
  554. {
  555. List<TraktTVShowUserCollectionWatched> results = new List<TraktTVShowUserCollectionWatched>();
  556. try
  557. {
  558. string url = string.Format(Constants.TraktTvURLs.URLUserLibraryShowsWatched, Constants.TraktTvURLs.APIKey, ServerSettings.Trakt_Username);
  559. logger.Trace("Trakt User Collection Watched: {0}", url);
  560. // Search for a series
  561. string json = Utils.DownloadWebPage(url);
  562. if (json.Trim().Length == 0) return new List<TraktTVShowUserCollectionWatched>();
  563. results = JSONHelper.Deserialize<List<TraktTVShowUserCollectionWatched>>(json);
  564. }
  565. catch (Exception ex)
  566. {
  567. logger.ErrorException("Error in SearchSeries: " + ex.ToString(), ex);
  568. }
  569. return results;
  570. }
  571. /// <summary>
  572. /// Updates the followung
  573. /// 1. Series Info
  574. /// 2. Episode Info
  575. /// 3. Episode Images
  576. /// 4. Fanart, Poster Images
  577. /// </summary>
  578. /// <param name="seriesID"></param>
  579. /// <param name="forceRefresh"></param>
  580. public static void UpdateAllInfoAndImages(string traktID, bool forceRefresh)
  581. {
  582. // this will do the first 3 steps
  583. TraktTVShow tvShow = GetShowInfo(traktID);
  584. if (tvShow == null) return;
  585. try
  586. {
  587. //now download the images
  588. DownloadAllImages(traktID);
  589. }
  590. catch (Exception ex)
  591. {
  592. logger.ErrorException("Error in TraktTVHelper.UpdateAllInfoAndImages: " + ex.ToString(), ex);
  593. }
  594. }
  595. public static void DownloadAllImages(string traktID)
  596. {
  597. try
  598. {
  599. //now download the images
  600. Trakt_ShowRepository repShow = new Trakt_ShowRepository();
  601. Trakt_Show show = repShow.GetByTraktID(traktID);
  602. if (show == null) return;
  603. if (ServerSettings.Trakt_DownloadFanart)
  604. {
  605. //download the fanart image for the show
  606. Trakt_ImageFanartRepository repFanart = new Trakt_ImageFanartRepository();
  607. Trakt_ImageFanart fanart = repFanart.GetByShowIDAndSeason(show.Trakt_ShowID, 1);
  608. if (fanart != null)
  609. {
  610. if (!string.IsNullOrEmpty(fanart.FullImagePath))
  611. {
  612. if (!File.Exists(fanart.FullImagePath))
  613. {
  614. CommandRequest_DownloadImage cmd = new CommandRequest_DownloadImage(fanart.Trakt_ImageFanartID, JMMImageType.Trakt_Fanart, false);
  615. cmd.Save();
  616. }
  617. }
  618. }
  619. }
  620. // download the posters for seasons
  621. Trakt_ImagePosterRepository repPosters = new Trakt_ImagePosterRepository();
  622. foreach (Trakt_Season season in show.Seasons)
  623. {
  624. if (ServerSettings.Trakt_DownloadPosters)
  625. {
  626. Trakt_ImagePoster poster = repPosters.GetByShowIDAndSeason(season.Trakt_ShowID, season.Season);
  627. if (poster != null)
  628. {
  629. if (!string.IsNullOrEmpty(poster.FullImagePath))
  630. {
  631. if (!File.Exists(poster.FullImagePath))
  632. {
  633. CommandRequest_DownloadImage cmd = new CommandRequest_DownloadImage(poster.Trakt_ImagePosterID, JMMImageType.Trakt_Poster, false);
  634. cmd.Save();
  635. }
  636. }
  637. }
  638. }
  639. if (ServerSettings.Trakt_DownloadEpisodes)
  640. {
  641. // download the screenshots for episodes
  642. foreach (Trakt_Episode ep in season.Episodes)
  643. {
  644. if (!string.IsNullOrEmpty(ep.FullImagePath))
  645. {
  646. if (!File.Exists(ep.FullImagePath))
  647. {
  648. CommandRequest_DownloadImage cmd = new CommandRequest_DownloadImage(ep.Trakt_EpisodeID, JMMImageType.Trakt_Episode, false);
  649. cmd.Save();
  650. }
  651. }
  652. }
  653. }
  654. }
  655. }
  656. catch (Exception ex)
  657. {
  658. logger.ErrorException("Error in TraktTVHelper.UpdateAllInfoAndImages: " + ex.ToString(), ex);
  659. }
  660. }
  661. public static void ScanForMatches()
  662. {
  663. AnimeSeriesRepository repSeries = new AnimeSeriesRepository();
  664. List<AnimeSeries> allSeries = repSeries.GetAll();
  665. CrossRef_AniDB_TraktRepository repCrossRef = new CrossRef_AniDB_TraktRepository();
  666. List<CrossRef_AniDB_Trakt> allCrossRefs = repCrossRef.GetAll();
  667. List<int> alreadyLinked = new List<int>();
  668. foreach (CrossRef_AniDB_Trakt xref in allCrossRefs)
  669. {
  670. alreadyLinked.Add(xref.AnimeID);
  671. }
  672. foreach (AnimeSeries ser in allSeries)
  673. {
  674. if (alreadyLinked.Contains(ser.AniDB_ID)) continue;
  675. AniDB_Anime anime = ser.GetAnime();
  676. if (anime != null)
  677. logger.Trace("Found anime without Trakt association: " + anime.MainTitle);
  678. if (anime.IsTraktLinkDisabled) continue;
  679. CommandRequest_TraktSearchAnime cmd = new CommandRequest_TraktSearchAnime(ser.AniDB_ID, false);
  680. cmd.Save();
  681. }
  682. }
  683. public static void UpdateAllInfo()
  684. {
  685. CrossRef_AniDB_TraktRepository repCrossRef = new CrossRef_AniDB_TraktRepository();
  686. List<CrossRef_AniDB_Trakt> allCrossRefs = repCrossRef.GetAll();
  687. foreach (CrossRef_AniDB_Trakt xref in allCrossRefs)
  688. {
  689. CommandRequest_TraktUpdateInfoAndImages cmd = new CommandRequest_TraktUpdateInfoAndImages(xref.TraktID);
  690. cmd.Save();
  691. }
  692. }
  693. /*public static void MarkEpisodeWatched(AnimeEpisode ep)
  694. {
  695. TraktTVPost_ShowScrobble tt = new TraktTVPost_ShowScrobble();
  696. if (!tt.Init(ep)) return;
  697. try
  698. {
  699. string url = string.Format(Constants.TraktTvURLs.URLPostShowScrobble, Constants.TraktTvURLs.APIKey);
  700. logger.Trace("GetShowInfo: {0}", url);
  701. logger.Trace("Marking episode as unwatched on Trakt: {0} - S{1} - EP{2}", show.Title, retSeason, retEpNum);
  702. string json = JSONHelper.Serialize<TraktTVPost_ShowScrobble>(tt);
  703. SendData(url, json);
  704. }
  705. catch (Exception ex)
  706. {
  707. logger.ErrorException("Error in TraktTVHelper.MarkEpisodeWatched: " + ex.ToString(), ex);
  708. }
  709. }*/
  710. public static void MarkEpisodeWatched(AnimeEpisode ep)
  711. {
  712. try
  713. {
  714. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  715. return;
  716. CrossRef_AniDB_Trakt xref = ep.GetAnimeSeries().CrossRefTrakt;
  717. if (xref == null) return;
  718. Trakt_ShowRepository repShows = new Trakt_ShowRepository();
  719. Trakt_Show show = repShows.GetByTraktID(xref.TraktID);
  720. if (show == null) return;
  721. if (!show.TvDB_ID.HasValue) return;
  722. Dictionary<int, int> dictTraktSeasons = null;
  723. Dictionary<int, Trakt_Episode> dictTraktEpisodes = null;
  724. Dictionary<int, Trakt_Episode> dictTraktSpecials = null;
  725. GetDictTraktEpisodesAndSeasons(show, ref dictTraktEpisodes, ref dictTraktSpecials, ref dictTraktSeasons);
  726. int retEpNum = -1;
  727. int retSeason = -1;
  728. GetTraktEpisodeNumber(ep, ep.GetAnimeSeries(), show, xref.TraktSeasonNumber, ref retEpNum, ref retSeason, dictTraktEpisodes, dictTraktSpecials, dictTraktSeasons);
  729. if (retEpNum < 0) return;
  730. TraktTVPost_ShowScrobble postScrobble = new TraktTVPost_ShowScrobble();
  731. postScrobble.SetCredentials();
  732. postScrobble.imdb_id = "";
  733. postScrobble.title = show.Title;
  734. postScrobble.year = show.Year;
  735. postScrobble.tvdb_id = show.TvDB_ID.Value.ToString();
  736. postScrobble.episode = retEpNum.ToString();
  737. postScrobble.season = retSeason.ToString();
  738. AniDB_Episode aniep = ep.AniDB_Episode;
  739. if (aniep != null)
  740. {
  741. TimeSpan t = TimeSpan.FromSeconds(aniep.LengthSeconds + 14);
  742. int toMinutes = int.Parse(Math.Round(t.TotalMinutes).ToString());
  743. postScrobble.duration = toMinutes.ToString();
  744. }
  745. else
  746. postScrobble.duration = "25";
  747. postScrobble.progress = "100";
  748. postScrobble.plugin_version = "0.4";
  749. postScrobble.media_center_version = "1.2.0.1";
  750. postScrobble.media_center_date = "Dec 17 2010";
  751. logger.Trace("Marking episode as watched (scrobble) on Trakt: {0} - S{1} - EP{2}", show.Title, retSeason, retEpNum);
  752. string url = string.Format(Constants.TraktTvURLs.URLPostShowScrobble, Constants.TraktTvURLs.APIKey);
  753. string json = JSONHelper.Serialize<TraktTVPost_ShowScrobble>(postScrobble);
  754. SendData(url, json);
  755. }
  756. catch (Exception ex)
  757. {
  758. logger.ErrorException("Error in TraktTVHelper.MarkEpisodeWatched: " + ex.ToString(), ex);
  759. }
  760. }
  761. public static void MarkEpisodeUnwatched(AnimeEpisode ep)
  762. {
  763. try
  764. {
  765. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  766. return;
  767. CrossRef_AniDB_Trakt xref = ep.GetAnimeSeries().CrossRefTrakt;
  768. if (xref == null) return;
  769. Trakt_ShowRepository repShows = new Trakt_ShowRepository();
  770. Trakt_Show show = repShows.GetByTraktID(xref.TraktID);
  771. if (show == null) return;
  772. if (!show.TvDB_ID.HasValue) return;
  773. Dictionary<int, int> dictTraktSeasons = null;
  774. Dictionary<int, Trakt_Episode> dictTraktEpisodes = null;
  775. Dictionary<int, Trakt_Episode> dictTraktSpecials = null;
  776. GetDictTraktEpisodesAndSeasons(show, ref dictTraktEpisodes, ref dictTraktSpecials, ref dictTraktSeasons);
  777. TraktTVPost_ShowEpisodeUnseen postUnseen = new TraktTVPost_ShowEpisodeUnseen();
  778. postUnseen.episodes = new List<TraktTVSeasonEpisode>();
  779. postUnseen.SetCredentials();
  780. postUnseen.imdb_id = "";
  781. postUnseen.title = show.Title;
  782. postUnseen.year = show.Year;
  783. postUnseen.tvdb_id = show.TvDB_ID.Value.ToString();
  784. int retEpNum = -1;
  785. int retSeason = -1;
  786. GetTraktEpisodeNumber(ep, ep.GetAnimeSeries(), show, xref.TraktSeasonNumber, ref retEpNum, ref retSeason, dictTraktEpisodes, dictTraktSpecials, dictTraktSeasons);
  787. if (retEpNum < 0) return;
  788. TraktTVSeasonEpisode traktEp = new TraktTVSeasonEpisode();
  789. traktEp.episode = retEpNum.ToString();
  790. traktEp.season = retSeason.ToString();
  791. postUnseen.episodes.Add(traktEp);
  792. logger.Trace("Marking episode as unwatched on Trakt: {0} - S{1} - EP{2}", show.Title, retSeason, retEpNum);
  793. string urlUnseen = string.Format(Constants.TraktTvURLs.URLPostShowEpisodeUnseen, Constants.TraktTvURLs.APIKey);
  794. string json = JSONHelper.Serialize<TraktTVPost_ShowEpisodeUnseen>(postUnseen);
  795. SendData(urlUnseen, json);
  796. }
  797. catch (Exception ex)
  798. {
  799. logger.ErrorException("Error in TraktTVHelper.MarkEpisodeWatched: " + ex.ToString(), ex);
  800. }
  801. }
  802. private static string SendData(string uri, string json)
  803. {
  804. WebRequest req = null;
  805. WebResponse rsp = null;
  806. string output = "";
  807. try
  808. {
  809. DateTime start = DateTime.Now;
  810. req = WebRequest.Create(uri);
  811. req.Method = "POST"; // Post method
  812. req.ContentType = "text/json"; // content type
  813. req.Proxy = null;
  814. // Wrap the request stream with a text-based writer
  815. StreamWriter writer = new StreamWriter(req.GetRequestStream());
  816. // Write the XML text into the stream
  817. writer.WriteLine(json);
  818. writer.Close();
  819. // Send the data to the webserver
  820. //rsp = req.GetResponse();
  821. HttpWebResponse WebResponse = (HttpWebResponse)req.GetResponse();
  822. Stream responseStream = WebResponse.GetResponseStream();
  823. String enco = WebResponse.CharacterSet;
  824. Encoding encoding = null;
  825. if (!String.IsNullOrEmpty(enco))
  826. encoding = Encoding.GetEncoding(WebResponse.CharacterSet);
  827. if (encoding == null)
  828. encoding = Encoding.Default;
  829. StreamReader Reader = new StreamReader(responseStream, encoding);
  830. output = Reader.ReadToEnd();
  831. TimeSpan ts = DateTime.Now - start;
  832. //logger.Trace("Sent TraktPost in {0} ms: {1} --- {2}", ts.TotalMilliseconds, uri, output);
  833. }
  834. catch (WebException webEx)
  835. {
  836. logger.Error("Error(1) in XMLServiceQueue.SendData: {0}", webEx);
  837. }
  838. catch (Exception ex)
  839. {
  840. logger.ErrorException("Error(2) in XMLServiceQueue.SendData: {0}", ex);
  841. }
  842. finally
  843. {
  844. if (req != null) req.GetRequestStream().Close();
  845. if (rsp != null) rsp.GetResponseStream().Close();
  846. }
  847. return output;
  848. }
  849. public static string TestUserLogin()
  850. {
  851. try
  852. {
  853. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  854. return "Please enter a username and password";
  855. TraktTVPost_AccountTest cmd = new TraktTVPost_AccountTest();
  856. cmd.Init();
  857. string url = string.Format(Constants.TraktTvURLs.URLPostAccountTest, Constants.TraktTvURLs.APIKey);
  858. logger.Trace("TestUserLogin: {0}", url);
  859. string json = JSONHelper.Serialize<TraktTVPost_AccountTest>(cmd);
  860. string jsonResponse = SendData(url, json);
  861. if (string.IsNullOrEmpty(jsonResponse)) return "Invalid login";
  862. TraktTVGenericResponse genResponse = JSONHelper.Deserialize<TraktTVGenericResponse>(jsonResponse);
  863. if (genResponse.IsSuccess)
  864. {
  865. MainWindow.UpdateTraktFriendInfo(true);
  866. return "";
  867. }
  868. else
  869. return genResponse.error;
  870. }
  871. catch (Exception ex)
  872. {
  873. logger.ErrorException("Error in TraktTVHelper.TestUserLogin: " + ex.ToString(), ex);
  874. return ex.Message;
  875. }
  876. }
  877. public static bool CreateAccount(string uname, string pass, string emailAddress, ref string returnMessage)
  878. {
  879. returnMessage = "";
  880. try
  881. {
  882. if (string.IsNullOrEmpty(uname) || string.IsNullOrEmpty(pass) || string.IsNullOrEmpty(emailAddress))
  883. {
  884. returnMessage = "Please enter a username and password";
  885. return false;
  886. }
  887. TraktTVPost_AccountCreate cmd = new TraktTVPost_AccountCreate();
  888. cmd.Init(uname, pass, emailAddress);
  889. string url = string.Format(Constants.TraktTvURLs.URLPostAccountCreate, Constants.TraktTvURLs.APIKey);
  890. logger.Trace("CreateAccount: {0}", url);
  891. string json = JSONHelper.Serialize<TraktTVPost_AccountCreate>(cmd);
  892. string jsonResponse = SendData(url, json);
  893. TraktTVGenericResponse genResponse = JSONHelper.Deserialize<TraktTVGenericResponse>(jsonResponse);
  894. if (genResponse.IsSuccess)
  895. {
  896. returnMessage = genResponse.message;
  897. ServerSettings.Trakt_Username = uname;
  898. ServerSettings.Trakt_Password = pass;
  899. MainWindow.UpdateTraktFriendInfo(true);
  900. return true;
  901. }
  902. else
  903. {
  904. returnMessage = genResponse.error;
  905. return false;
  906. }
  907. }
  908. catch (Exception ex)
  909. {
  910. logger.ErrorException("Error in TraktTVHelper.TestUserLogin: " + ex.ToString(), ex);
  911. returnMessage = ex.Message;
  912. return false;
  913. }
  914. }
  915. public static bool FriendRequestDeny(string uname, ref string returnMessage)
  916. {
  917. returnMessage = "";
  918. try
  919. {
  920. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  921. {
  922. returnMessage = "Please enter a username and password";
  923. return false;
  924. }
  925. TraktTVPost_FriendDenyApprove cmd = new TraktTVPost_FriendDenyApprove();
  926. cmd.Init(uname);
  927. string url = string.Format(Constants.TraktTvURLs.URLPostFriendsDeny, Constants.TraktTvURLs.APIKey);
  928. logger.Trace("URLPostFriendsDeny: {0}", url);
  929. string json = JSONHelper.Serialize<TraktTVPost_FriendDenyApprove>(cmd);
  930. string jsonResponse = SendData(url, json);
  931. if (string.IsNullOrEmpty(jsonResponse))
  932. {
  933. returnMessage = "Error occurred";
  934. return false;
  935. }
  936. TraktTVGenericResponse genResponse = JSONHelper.Deserialize<TraktTVGenericResponse>(jsonResponse);
  937. if (genResponse.IsSuccess)
  938. {
  939. returnMessage = genResponse.message;
  940. MainWindow.UpdateTraktFriendInfo(true);
  941. return true;
  942. }
  943. else
  944. {
  945. returnMessage = genResponse.error;
  946. return false;
  947. }
  948. }
  949. catch (Exception ex)
  950. {
  951. logger.ErrorException("Error in TraktTVHelper.FriendRequestDeny: " + ex.ToString(), ex);
  952. returnMessage = ex.Message;
  953. return false;
  954. }
  955. }
  956. public static bool FriendRequestApprove(string uname, ref string returnMessage)
  957. {
  958. returnMessage = "";
  959. try
  960. {
  961. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  962. {
  963. returnMessage = "Please enter a username and password";
  964. return false;
  965. }
  966. TraktTVPost_FriendDenyApprove cmd = new TraktTVPost_FriendDenyApprove();
  967. cmd.Init(uname);
  968. string url = string.Format(Constants.TraktTvURLs.URLPostFriendsApprove, Constants.TraktTvURLs.APIKey);
  969. logger.Trace("URLPostFriendsDeny: {0}", url);
  970. string json = JSONHelper.Serialize<TraktTVPost_FriendDenyApprove>(cmd);
  971. string jsonResponse = SendData(url, json);
  972. if (string.IsNullOrEmpty(jsonResponse))
  973. {
  974. returnMessage = "Error occurred";
  975. return false;
  976. }
  977. TraktTVGenericResponse genResponse = JSONHelper.Deserialize<TraktTVGenericResponse>(jsonResponse);
  978. if (genResponse.IsSuccess)
  979. {
  980. returnMessage = genResponse.message;
  981. MainWindow.UpdateTraktFriendInfo(true);
  982. return true;
  983. }
  984. else
  985. {
  986. returnMessage = genResponse.error;
  987. return false;
  988. }
  989. }
  990. catch (Exception ex)
  991. {
  992. logger.ErrorException("Error in TraktTVHelper.FriendRequestDeny: " + ex.ToString(), ex);
  993. returnMessage = ex.Message;
  994. return false;
  995. }
  996. }
  997. public static void SyncCollectionToTrakt_Series(AnimeSeries series)
  998. {
  999. try
  1000. {
  1001. // check that we have at least one user nominated for Trakt
  1002. JMMUserRepository repUsers = new JMMUserRepository();
  1003. List<JMMUser> traktUsers = repUsers.GetTraktUsers();
  1004. if (traktUsers.Count == 0) return;
  1005. string url = string.Format(Constants.TraktTvURLs.URLPostShowEpisodeLibrary, Constants.TraktTvURLs.APIKey);
  1006. string urlSeen = string.Format(Constants.TraktTvURLs.URLPostShowEpisodeSeen, Constants.TraktTvURLs.APIKey);
  1007. int retEpNum = 0, retSeason = 0;
  1008. CrossRef_AniDB_Trakt xref = series.CrossRefTrakt;
  1009. if (xref == null) return;
  1010. Trakt_ShowRepository repShows = new Trakt_ShowRepository();
  1011. Trakt_Show show = repShows.GetByTraktID(xref.TraktID);
  1012. if (show == null) return;
  1013. if (!show.TvDB_ID.HasValue) return;
  1014. Dictionary<int, int> dictTraktSeasons = null;
  1015. Dictionary<int, Trakt_Episode> dictTraktEpisodes = null;
  1016. Dictionary<int, Trakt_Episode> dictTraktSpecials = null;
  1017. GetDictTraktEpisodesAndSeasons(show, ref dictTraktEpisodes, ref dictTraktSpecials, ref dictTraktSeasons);
  1018. TraktTVPost_ShowEpisodeLibrary postLibrary = new TraktTVPost_ShowEpisodeLibrary();
  1019. postLibrary.episodes = new List<TraktTVSeasonEpisode>();
  1020. postLibrary.SetCredentials();
  1021. postLibrary.imdb_id = "";
  1022. postLibrary.title = show.Title;
  1023. postLibrary.year = show.Year;
  1024. postLibrary.tvdb_id = show.TvDB_ID.Value.ToString();
  1025. TraktTVPost_ShowEpisodeSeen postSeen = new TraktTVPost_ShowEpisodeSeen();
  1026. postSeen.episodes = new List<TraktTVSeasonEpisode>();
  1027. postSeen.SetCredentials();
  1028. postSeen.imdb_id = "";
  1029. postSeen.title = show.Title;
  1030. postSeen.year = show.Year;
  1031. postSeen.tvdb_id = show.TvDB_ID.Value.ToString();
  1032. foreach (AnimeEpisode ep in series.GetAnimeEpisodes())
  1033. {
  1034. if (ep.GetVideoLocals().Count > 0)
  1035. {
  1036. retEpNum = -1;
  1037. retSeason = -1;
  1038. GetTraktEpisodeNumber(ep, series, show, xref.TraktSeasonNumber, ref retEpNum, ref retSeason, dictTraktEpisodes, dictTraktSpecials, dictTraktSeasons);
  1039. if (retEpNum < 0) continue;
  1040. TraktTVSeasonEpisode traktEp = new TraktTVSeasonEpisode();
  1041. traktEp.episode = retEpNum.ToString();
  1042. traktEp.season = retSeason.ToString();
  1043. postLibrary.episodes.Add(traktEp);
  1044. AnimeEpisode_User userRecord = null;
  1045. foreach (JMMUser juser in traktUsers)
  1046. {
  1047. userRecord = ep.GetUserRecord(juser.JMMUserID);
  1048. if (userRecord != null) break;
  1049. }
  1050. if (userRecord != null)
  1051. postSeen.episodes.Add(traktEp);
  1052. }
  1053. }
  1054. if (postLibrary.episodes.Count > 0)
  1055. {
  1056. logger.Info("PostShowEpisodeLibrary: {0}/{1}/{2} eps", show.Title, show.TraktID, postLibrary.episodes.Count);
  1057. string json = JSONHelper.Serialize<TraktTVPost_ShowEpisodeLibrary>(postLibrary);
  1058. string jsonResponse = SendData(url, json);
  1059. logger.Info("PostShowEpisodeLibrary RESPONSE: {0}", jsonResponse);
  1060. }
  1061. if (postSeen.episodes.Count > 0)
  1062. {
  1063. logger.Info("PostShowEpisodeSeen: {0}/{1}/{2} eps", show.Title, show.TraktID, postSeen.episodes.Count);
  1064. string json = JSONHelper.Serialize<TraktTVPost_ShowEpisodeSeen>(postSeen);
  1065. string jsonResponse = SendData(urlSeen, json);
  1066. logger.Info("PostShowEpisodeSeen RESPONSE: {0}", jsonResponse);
  1067. }
  1068. }
  1069. catch (Exception ex)
  1070. {
  1071. logger.ErrorException("Error in TraktTVHelper.SyncCollectionToTrakt_Series: " + ex.ToString(), ex);
  1072. }
  1073. }
  1074. public static void SyncCollectionToTrakt()
  1075. {
  1076. try
  1077. {
  1078. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password)) return;
  1079. AnimeSeriesRepository repSeries = new AnimeSeriesRepository();
  1080. List<AnimeSeries> allSeries = repSeries.GetAll();
  1081. foreach (AnimeSeries series in allSeries)
  1082. {
  1083. //SyncCollectionToTrakt_Series(series);
  1084. CommandRequest_TraktSyncCollectionSeries cmd = new CommandRequest_TraktSyncCollectionSeries(series.AnimeSeriesID, series.GetAnime().MainTitle);
  1085. cmd.Save();
  1086. }
  1087. }
  1088. catch (Exception ex)
  1089. {
  1090. logger.ErrorException("Error in TraktTVHelper.SyncCollectionToTrakt: " + ex.ToString(), ex);
  1091. }
  1092. }
  1093. private static void GetTraktEpisodeNumber(AnimeEpisode aniepisode, AnimeSeries ser, Trakt_Show show, int season, ref int traktEpNum, ref int traktSeason)
  1094. {
  1095. Dictionary<int, int> dictTraktSeasons = null;
  1096. Dictionary<int, Trakt_Episode> dictTraktEpisodes = null;
  1097. Dictionary<int, Trakt_Episode> dictTraktSpecials = null;
  1098. GetDictTraktEpisodesAndSeasons(show, ref dictTraktEpisodes, ref dictTraktSpecials, ref dictTraktSeasons);
  1099. GetTraktEpisodeNumber(aniepisode, ser, show, season, ref traktEpNum, ref traktSeason, dictTraktEpisodes, dictTraktSpecials, dictTraktSeasons);
  1100. }
  1101. private static void GetTraktEpisodeNumber(AnimeEpisode aniepisode, AnimeSeries ser, Trakt_Show show, int season, ref int traktEpNum, ref int traktSeason,
  1102. Dictionary<int, Trakt_Episode> dictTraktEpisodes, Dictionary<int, Trakt_Episode> dictTraktSpecials, Dictionary<int, int> dictTraktSeasons)
  1103. {
  1104. try
  1105. {
  1106. traktEpNum = -1;
  1107. traktSeason = -1;
  1108. int epNum = aniepisode.AniDB_Episode.EpisodeNumber;
  1109. if (season > 0)
  1110. {
  1111. //episode
  1112. if (aniepisode.EpisodeTypeEnum == AniDBAPI.enEpisodeType.Episode)
  1113. {
  1114. if (dictTraktEpisodes != null && dictTraktSeasons != null)
  1115. {
  1116. if (dictTraktSeasons.ContainsKey(season))
  1117. {
  1118. int absEpisodeNumber = dictTraktSeasons[season] + epNum - 1;
  1119. if (dictTraktEpisodes.ContainsKey(absEpisodeNumber))
  1120. {
  1121. Trakt_Episode tvep = dictTraktEpisodes[absEpisodeNumber];
  1122. traktEpNum = tvep.EpisodeNumber;
  1123. traktSeason = tvep.Season;
  1124. }
  1125. }
  1126. }
  1127. }
  1128. if (aniepisode.EpisodeTypeEnum == AniDBAPI.enEpisodeType.Special)
  1129. {
  1130. traktSeason = 0;
  1131. traktEpNum = epNum;
  1132. }
  1133. }
  1134. else
  1135. {
  1136. traktSeason = 0;
  1137. traktEpNum = epNum;
  1138. }
  1139. return;
  1140. }
  1141. catch (Exception ex)
  1142. {
  1143. logger.ErrorException(ex.ToString(), ex);
  1144. return;
  1145. }
  1146. }
  1147. private static void GetDictTraktEpisodesAndSeasons(Trakt_Show show, ref Dictionary<int, Trakt_Episode> dictTraktEpisodes,
  1148. ref Dictionary<int, Trakt_Episode> dictTraktSpecials, ref Dictionary<int, int> dictTraktSeasons)
  1149. {
  1150. dictTraktEpisodes = new Dictionary<int, Trakt_Episode>();
  1151. dictTraktSpecials = new Dictionary<int, Trakt_Episode>();
  1152. dictTraktSeasons = new Dictionary<int, int>();
  1153. try
  1154. {
  1155. Trakt_EpisodeRepository repEps = new Trakt_EpisodeRepository();
  1156. // create a dictionary of absolute episode numbers for trakt episodes
  1157. // sort by season and episode number
  1158. // ignore season 0, which is used for specials
  1159. List<Trakt_Episode> eps = repEps.GetByShowID(show.Trakt_ShowID);
  1160. List<SortPropOrFieldAndDirection> sortCriteria = new List<SortPropOrFieldAndDirection>();
  1161. sortCriteria.Add(new SortPropOrFieldAndDirection("Season", false, SortType.eInteger));
  1162. sortCriteria.Add(new SortPropOrFieldAndDirection("EpisodeNumber", false, SortType.eInteger));
  1163. eps = Sorting.MultiSort<Trakt_Episode>(eps, sortCriteria);
  1164. int i = 1;
  1165. int iSpec = 1;
  1166. int lastSeason = -999;
  1167. foreach (Trakt_Episode ep in eps)
  1168. {
  1169. //if (ep.Season == 0) continue;
  1170. if (ep.Season > 0)
  1171. {
  1172. dictTraktEpisodes[i] = ep;
  1173. if (ep.Season != lastSeason)
  1174. dictTraktSeasons[ep.Season] = i;
  1175. i++;
  1176. }
  1177. else
  1178. {
  1179. dictTraktSpecials[iSpec] = ep;
  1180. if (ep.Season != lastSeason)
  1181. dictTraktSeasons[ep.Season] = iSpec;
  1182. iSpec++;
  1183. }
  1184. lastSeason = ep.Season;
  1185. }
  1186. }
  1187. catch (Exception ex)
  1188. {
  1189. logger.ErrorException(ex.ToString(), ex);
  1190. }
  1191. }
  1192. }
  1193. }