Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }