public override void ProcessCommand() { logger.Info("Processing CommandRequest_MALDownloadStatusFromMAL"); try { if (string.IsNullOrEmpty(ServerSettings.MAL_Username) || string.IsNullOrEmpty(ServerSettings.MAL_Password)) { return; } // find the latest eps to update myanimelist mal = MALHelper.GetMALAnimeList(); if (mal == null || mal.anime == null) { return; } // find the anidb user List <SVR_JMMUser> aniDBUsers = RepoFactory.JMMUser.GetAniDBUsers(); if (aniDBUsers.Count == 0) { return; } SVR_JMMUser user = aniDBUsers[0]; foreach (myanimelistAnime malAnime in mal.anime) { // look up the anime CrossRef_AniDB_MAL xref = RepoFactory.CrossRef_AniDB_MAL.GetByMALID(malAnime.series_animedb_id); if (xref == null) { continue; } if (malAnime.series_animedb_id == 8107 || malAnime.series_animedb_id == 10737) { Console.Write(""); } // check if this anime has any other links List <CrossRef_AniDB_MAL> allXrefs = RepoFactory.CrossRef_AniDB_MAL.GetByAnimeID(xref.AnimeID); if (allXrefs.Count == 0) { continue; } // find the range of watched episodes that this applies to int startEpNumber = xref.StartEpisodeNumber; int endEpNumber = GetUpperEpisodeLimit(allXrefs, xref); List <AniDB_Episode> aniEps = RepoFactory.AniDB_Episode.GetByAnimeID(xref.AnimeID); foreach (AniDB_Episode aniep in aniEps) { if (aniep.EpisodeType != xref.StartEpisodeType) { continue; } SVR_AnimeEpisode ep = RepoFactory.AnimeEpisode.GetByAniDBEpisodeID(aniep.EpisodeID); if (ep == null) { continue; } int adjustedWatchedEps = malAnime.my_watched_episodes + xref.StartEpisodeNumber - 1; int epNum = aniep.EpisodeNumber; if (epNum < startEpNumber || epNum > endEpNumber) { continue; } SVR_AnimeEpisode_User usrRec = ep.GetUserRecord(user.JMMUserID); if (epNum <= adjustedWatchedEps) { // update if the user doesn't have a record (means not watched) // or it is currently un-watched bool update = false; if (usrRec == null) { update = true; } else if (!usrRec.WatchedDate.HasValue) { update = true; } if (update) { ep.ToggleWatchedStatus(true, true, DateTime.Now, user.JMMUserID, false); } } else { if (usrRec != null && usrRec.WatchedDate.HasValue) { ep.ToggleWatchedStatus(false, true, DateTime.Now, user.JMMUserID, false); } } } } } catch (Exception ex) { logger.Error("Error processing CommandRequest_MALDownloadStatusFromMAL: {0}", ex); } }
private void Scrobble(PlexEvent data) { PlexEvent.PlexMetadata metadata = data.Metadata; if (!data.Metadata.Guid.StartsWith("com.plexapp.agents.shoko://")) { return; } string[] parts = metadata.Guid.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); int animeId = int.Parse(parts[1]); int series = int.Parse(parts[2]); var anime = RepoFactory.AnimeSeries.GetByID(animeId); enEpisodeType episodeType; switch (series ) //I hate magic number's but this is just about how I can do this, also the rest of this is for later. { case -4: episodeType = enEpisodeType.Parody; break; case -3: episodeType = enEpisodeType.Trailer; break; case -2: episodeType = enEpisodeType.Other; break; case -1: episodeType = enEpisodeType.Credits; break; case 0: episodeType = enEpisodeType.Special; break; default: episodeType = enEpisodeType.Episode; break; } if (episodeType != enEpisodeType.Episode || metadata.Index == 0) //metadata.index = 0 when it's something else. { return; //right now no clean way to detect the episode. I could do by title. } SVR_AnimeEpisode episode = anime .GetAnimeEpisodes() .Where(a => a.EpisodeTypeEnum == episodeType) .Where(a => metadata.Title.Equals(a?.PlexContract?.Title, StringComparison.InvariantCultureIgnoreCase)) .FirstOrDefault(a => a?.TvDBEpisode?.SeasonNumber == series); if (episode == null) { return; } var user = RepoFactory.JMMUser.GetAll().FirstOrDefault(u => data.Account.Title.FindIn(u.GetPlexUsers())); if (user == null) { return; //At this point in time, we don't want to scrobble for unknown users. } episode.ToggleWatchedStatus(true, true, FromUnixTime(metadata.LastViewedAt), false, false, user.JMMUserID, true); anime.UpdateStats(true, false, true); }