private static TraktSync GetTraktSyncObject(DBSeries series, List <DBEpisode> episodes) { // set series properties for episodes TraktSync traktSync = new TraktSync { Password = TraktAPI.Password, UserName = TraktAPI.Username, SeriesID = series[DBSeries.cID], IMDBID = series[DBOnlineSeries.cIMDBID], Year = series.Year, Title = series[DBOnlineSeries.cOriginalName] }; // get list of episodes for series List <TraktSync.Episode> epList = new List <TraktSync.Episode>(); foreach (DBEpisode ep in episodes.Where(e => e[DBEpisode.cSeriesID] == series[DBSeries.cID])) { TraktSync.Episode episode = new TraktSync.Episode(); episode.SeasonIndex = ep[DBOnlineEpisode.cSeasonIndex]; episode.EpisodeIndex = ep[DBOnlineEpisode.cEpisodeIndex]; epList.Add(episode); } traktSync.EpisodeList = epList; return(traktSync); }
public static async Task ExecuteTrakt(PerformContext ctx, string plexKey, string plexUrl, string plexClientSecret, string traktKey, string traktClientId, string traktClientSecret, string emailApiKey, string emailSendTo) { var traktSync = new TraktSync(plexKey, plexUrl, plexClientSecret, traktKey, traktClientId, traktClientSecret, emailApiKey, emailSendTo); await traktSync.SyncToTrakt(); }
public static void SynchronizeLibrary(List <DBEpisode> episodes, TraktSyncModes mode) { if (episodes.Count == 0) { return; } // get unique series ids var uniqueSeriesIDs = (from seriesIDs in episodes select seriesIDs[DBEpisode.cSeriesID].ToString()).Distinct().ToList(); // go over each series, can only send one series at a time foreach (string seriesID in uniqueSeriesIDs) { DBSeries series = Helper.getCorrespondingSeries(int.Parse(seriesID)); if (series == null || series[DBOnlineSeries.cTraktIgnore]) { continue; } MPTVSeriesLog.Write("Trakt: Synchronizing '{0}' episodes for series '{1}'.", mode.ToString(), series.ToString()); TraktSync traktSync = GetTraktSyncObject(series, episodes); // upload to trakt TraktResponse response = TraktAPI.SyncEpisodeLibrary(traktSync, mode); if (response == null) { MPTVSeriesLog.Write("Trakt Error: Response from server was unexpected."); continue; } // check for any error and log result CheckTraktErrorAndNotify(response, false); if (response.Status == "success") { SQLCondition conditions = new SQLCondition(); // flag episodes and commit to database switch (mode) { case TraktSyncModes.seen: conditions.Add(new DBOnlineEpisode(), DBOnlineEpisode.cSeriesID, seriesID, SQLConditionType.Equal); conditions.Add(new DBOnlineEpisode(), DBOnlineEpisode.cWatched, 1, SQLConditionType.Equal); conditions.Add(new DBOnlineEpisode(), DBOnlineEpisode.cHidden, 0, SQLConditionType.Equal); conditions.Add(new DBOnlineEpisode(), DBOnlineEpisode.cTraktSeen, 0, SQLConditionType.Equal); // we always flag traktLibrary field as the 'traktSeen' field counts as part of library DBOnlineEpisode.GlobalSet(new DBOnlineEpisode(), DBOnlineEpisode.cTraktLibrary, 1, conditions); DBOnlineEpisode.GlobalSet(new DBOnlineEpisode(), DBOnlineEpisode.cTraktSeen, 1, conditions); break; case TraktSyncModes.library: // we can't do a global set as our conditions are from two different tables // where filename is not empty and traktLibrary = 0 foreach (DBEpisode ep in episodes.Where(e => e[DBEpisode.cSeriesID] == seriesID)) { ep[DBOnlineEpisode.cTraktLibrary] = 1; ep.Commit(); } break; case TraktSyncModes.unseen: conditions.Add(new DBOnlineEpisode(), DBOnlineEpisode.cSeriesID, seriesID, SQLConditionType.Equal); conditions.Add(new DBOnlineEpisode(), DBOnlineEpisode.cHidden, 0, SQLConditionType.Equal); conditions.Add(new DBOnlineEpisode(), DBOnlineEpisode.cTraktSeen, 2, SQLConditionType.Equal); DBOnlineEpisode.GlobalSet(new DBOnlineEpisode(), DBOnlineEpisode.cTraktSeen, 0, conditions); break; case TraktSyncModes.unlibrary: break; } } // wait a short period before uploading another series Thread.Sleep(2000); } }