예제 #1
0
        public async Task <List <AiringAnime> > Leftovers(AnimeSeason season, Func <Task <List <AiringAnime> > > getLeftovers)
        {
            if (!Data.ContainsKey(season.Title))
            {
                Data[season.Title] = new AniListSeasonData();
            }

            var data = Data[season.Title];

            // Check for any updates?
            if ((data.LastCheckedLeftover - DateTime.Now).Hours > 12)
            {
                ;
            }

            if (data.LeftOver.Count == 0)
            {
                Data[season.Title].LeftOver = await getLeftovers();

                Data[season.Title].LastCheckedLeftover = DateTime.Now;
                await Save();
            }

            return(Data[season.Title].LeftOver);
        }
예제 #2
0
        public async Task <List <AiringAnime> > New(AnimeSeason season, Func <Task <List <AiringAnime> > > getNew)
        {
            if (!Data.ContainsKey(season.Title))
            {
                Data[season.Title] = new AniListSeasonData();
            }

            var data = Data[season.Title];

            // Check for any updates?
            if ((data.LastCheckedNew - DateTime.Now).Hours > 12)
            {
                ;
            }

            else if (data.New.Count == 0)
            {
                Data[season.Title].New = await getNew();

                Data[season.Title].LastCheckedNew = DateTime.Now;
                await Save();
            }

            return(Data[season.Title].New);
        }
예제 #3
0
        public override async Task <IEnumerable <RemoteMedia> > FindAllMedia(Anime anime, string name, int episode)
        {
            if (_nodes == null || (DateTime.Now - _lastUpdatedNodes).Minutes > 10)
            {
                await RetrieveNodes();
            }

            return(_nodes
                   .Where(item => // Episode is this season
            {
                if (item.Date.HasValue)
                {
                    return (item.Date.Value - DateTime.Now).Days <= AnimeSeason.MaxAgeFor(anime, episode);
                }
                return true;
            })
                   .Where(item => item.StrippedName.Contains(episode.ToString()) &&
                          !item.StrippedName.Contains(episode.ToString() + ".5"))
                   .Where(item => // Name contains everything
            {
                var title = Regex.Replace(item.StrippedWithNoEpisode.ToLower(), @"-|:|'", " ");
                var filtered = Regex.Replace(
                    Regex.Replace(name, @"\s?(\d|\dnd season)$", "", RegexOptions.IgnoreCase),
                    @"-|:|'",
                    " ");
                var words = filtered.ToLower().Split(' ').ToList();
                return words.Count(word => title.Contains(word)) > (words.Count / 2);
            })
                   .OrderByDescending(n => n.Name.Contains(anime.Resolution)));
        }
예제 #4
0
 public AnimeSeasonalQuery(AnimeSeason season)
 {
     _season             = season;
     _overriden          = _season.Url != "https://myanimelist.net/anime/season";
     Request             = WebRequest.Create(Uri.EscapeUriString(_season.Url));
     Request.ContentType = "application/x-www-form-urlencoded";
     Request.Method      = "GET";
 }
예제 #5
0
        public async Task <Season> GetSeasonAsync(int year, AnimeSeason season)
        {
            var request = new[]
            {
                Constants.Season,
                year.ToString(),
                season.GetDescription()
            };

            return(await ExecuteGetRequestAsync <Season>(request));
        }
예제 #6
0
        public async Task <List <AiringAnime> > GetLeftoverAnime(AnimeSeason season)
        {
            var data = await GetBrowse(await BuildLeftoverUrl(season));

            return(data
                   .Where(anime => anime.Type == "TV")
                   .Where(anime => anime.Airing?.NextEpisode.HasValue == true &&
                          Methods.InRange(anime.Airing.NextEpisode.Value, 10, 24))
                   .Where(anime => anime.TotalEpisodes > 12)
                   .ToList());
        }
예제 #7
0
 public AnimeListPageNavigationArgs(SortOptions sort, int status, bool desc,
                                    AnimeListWorkModes seasonal, string source, AnimeSeason season, AnimeListDisplayModes dispMode)
 {
     SortOption  = sort;
     Status      = status;
     Descending  = desc;
     WorkMode    = seasonal;
     ListSource  = source;
     NavArgs     = true;
     CurrSeason  = season;
     DisplayMode = dispMode;
 }
예제 #8
0
        public override async Task <IEnumerable <RemoteMedia> > FindAllMedia(Anime anime, string name, int episode)
        {
            var document = new XmlDocument();

            var url = new Uri("https://nyaa.pantsu.cat/feed" +
                              $"?c={EnglishTranslated}" +
                              "&s=" +
                              $"&sort={BySeeders}" +
                              "&order=desc" +
                              "&max=20" +
                              $"&q={TransformEpisodeSearch(name, episode)}");

            // https://nyaa.pantsu.cat/feed
            // ?c=3_5&limit=50&order=false&q=new+game%21%21&s=0&sort=5&userID=0

            using (var client = new WebClient())
            {
                var html = await client.DownloadStringTaskAsync(url);

                document.LoadXml(html);
            }

            Console.WriteLine(document);

            var result = document.SelectNodes("//item")
                         ?.Cast <XmlNode>()
                         .Select(ToTorrent)
                         .Where(item => // Episode is this season
            {
                if (item.Date.HasValue)
                {
                    return((item.Date.Value - DateTime.Now).Days <= AnimeSeason.MaxAgeFor(anime, episode));
                }
                return(true);
            })
                         .Where(item => Regex
                                .Split(item.StrippedName, " ")
                                .Any(s => s.Contains(episode.ToString("D2")) && !s.Contains(episode.ToString("D2") + ".5")));

            if (anime.NameCollection.Any(c => Regex.Replace(c, YearPattern, "").Contains(episode.ToString("D2"))))
            {
                result = result?
                         .Where(nyaa => nyaa.StrippedName.Split()
                                .Select(c => Regex.Replace(c, YearPattern, ""))
                                .Count(c => c.Contains(episode.ToString("D2")))
                                >= 2);
            }

            return(result?.OrderByDescending(n => n.Name.Contains(anime.Resolution)));
        }
예제 #9
0
        public async Task UpdateEntry(AnimeSeason season, bool isNew, AiringAnime updated)
        {
            if (!Data.ContainsKey(season.Title))
            {
                return;
            }

            var list  = isNew ? Data[season.Title].New : Data[season.Title].LeftOver;
            var index = list.IndexOf(list.First(a => a.Id.Equals(updated.Id)));

            list[index] = updated;

            await DownloadImage(updated);
            await Save();
        }
예제 #10
0
        // URL related

        /// <summary>
        ///     Build the url for gathering general anime of this season
        /// </summary>
        private async Task <string> BuildBrowseUrl(AnimeSeason animeSeason)
        {
            await CheckAuthentication();

            var builder = new UriBuilder(BrowseUrl);
            var query   = HttpUtility.ParseQueryString(builder.Query);

            query["access_token"] = _credentials.AccessToken;
            query["year"]         = animeSeason.Year.ToString();
            query["season"]       = animeSeason.Season.Description();
            query["sort"]         = "popularity-desc";
            query["full_page"]    = "true";
            builder.Query         = query.ToString();
            return(builder.ToString());
        }
예제 #11
0
 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
 {
     listBox2.Items.Clear();
     if (comboBox1.SelectedIndex >= 0)
     {
         SelectedSeason = SelectedSeries.Seasons[comboBox1.SelectedIndex];
         foreach (AnimeEpisode ep in SelectedSeason.Episodes)
         {
             listBox2.Items.Add(ep.EpisodePath.Name);
         }
     }
     if (SelectedSeason.Episodes.Count != 0)
     {
         listBox2.SelectedIndex = 0;
     }
 }
예제 #12
0
        public async Task FillInDetails(AnimeSeason season, bool isNew, AiringAnime anime)
        {
            anime.Description = "Loading ...";

            var updated = await _api.GetAnime(anime.Id, true);

            if (updated != null)
            {
                await _data.UpdateEntry(season, isNew, updated);

                UpdateObservableProperties(anime, updated);
            }

            else
            {
                anime.Description = "";
            }
        }
예제 #13
0
        public async Task HandleAsync()
        {
            var updateData = await _malApiService.GetSeasonDataAsync();

            if (updateData is null)
            {
                return;
            }

            var existingSeason = await _seasonRepository.GetAsync(season => season.Year == updateData.NewestSeasonYear && season.Name == updateData.NewestSeasonName);

            if (existingSeason is null)
            {
                var newSeason = new AnimeSeason
                {
                    Name = updateData.NewestSeasonName,
                    Year = updateData.NewestSeasonYear
                };

                await _seasonRepository.AddAsync(newSeason);
            }
        }
예제 #14
0
        public override async Task <IEnumerable <RemoteMedia> > FindAllMedia(Anime anime, string name, int episode)
        {
            var document = new XmlDocument();

            var url = new Uri("https://nyaa.si/?page=rss" +
                              $"&q={TransformEpisodeSearch(name, episode)}" +
                              "&c=1_2" +
                              "&f=0");

            using (var client = new WebClient())
            {
                var html = await client.DownloadStringTaskAsync(url);

                document.LoadXml(html);
            }

            var manager = new XmlNamespaceManager(document.NameTable);

            manager.AddNamespace("nyaa", "https://nyaa.si/xmlns/nyaa");

            var result = document.SelectNodes("//item")?
                         .Cast <XmlNode>()
                         .Select(node => ToMedia(node, manager))
                         .Where(item => !item.Name.Contains("OAD")) // Shokugeki specific rule (bad...)
                         .Where(item =>                             // Episode is this season
            {
                if (item.Date.HasValue)
                {
                    return((DateTime.Now - item.Date.Value).Days <= AnimeSeason.MaxAgeFor(anime, episode));
                }
                return(true);
            })
                         .Where(item => Regex.Split(item.StrippedName, " ")
                                .Any(s => s.Contains(episode.ToString("D2")) && !s.Contains(episode.ToString("D2") + ".5")));

            return(result?.OrderByDescending(n => n.Name.Contains(anime.Resolution)).ThenByDescending(n => n.Health));
        }
        public async Task <(bool successful, bool changesMade)> FillInDetails(Anime anime)
        {
            var changesMade = false;

            if (GetId(anime) == 0)
            {
                var(successful, id) = await FindId(anime);

                if (successful)
                {
                    SetId(anime, id);
                }
            }

            if (GetId(anime) > 0)
            {
                var updated = await _api.GetAnime(GetId(anime), false);

                if (anime.Details.OverallTotal < anime.Details.TotalEpisodes)
                {
                    anime.Details.OverallTotal = anime.Details.TotalEpisodes;
                }

                if (anime.Details.Synopsis != updated.Description)
                {
                    anime.Details.Synopsis = updated.Description;
                    changesMade            = true;
                }

                if (anime.Details.Title != updated.TitleRomaji)
                {
                    anime.Details.Title = updated.TitleRomaji;
                    changesMade         = true;
                }

                if (anime.Details.English != updated.TitleEnglish)
                {
                    anime.Details.English = updated.TitleEnglish;
                    changesMade           = true;
                }

                if (updated.TotalEpisodes != 0 && anime.Details.TotalEpisodes != updated.TotalEpisodes)
                {
                    anime.Details.TotalEpisodes = updated.TotalEpisodes;
                    anime.Details.OverallTotal  = updated.TotalEpisodes;
                    changesMade = true;
                }

                if (anime.Details.Image == null && updated.ImagePath != null)
                {
                    anime.Details.Image = updated.ImagePath;
                    changesMade         = true;
                }

                // Date details

                if (updated.StartDate.HasValue)
                {
                    var aired = new AnimeSeason
                    {
                        Year   = updated.StartDate.Value.Year,
                        Season = (Season)Math.Ceiling(Convert.ToDouble(updated.StartDate.Value.Month) / 3)
                    };

                    if (anime.Details.Aired != aired)
                    {
                        anime.Details.Aired = aired;
                        changesMade         = true;
                    }
                }

                if (updated.EndDate is DateTime end)
                {
                    var ended = new AnimeSeason
                    {
                        Year   = end.Year,
                        Season = (Season)Math.Ceiling(Convert.ToDouble(end.Month) / 3)
                    };

                    if (anime.Details.Ended != ended)
                    {
                        anime.Details.Ended = ended;
                        changesMade         = true;
                    }
                }

                var continuationChanged = await CheckSeriesContinuation(anime);

                if (continuationChanged)
                {
                    changesMade = true;
                }

                return(true, changesMade);
            }

            return(false, false);
        }
예제 #16
0
 public AnimeBuilder WithSeason(AnimeSeason season)
 {
     _season = season;
     return(this);
 }
예제 #17
0
        //

        public async Task <List <AiringAnime> > GetNewAnimes(AnimeSeason season)
        {
            return(await GetBrowse(await BuildBrowseUrl(season)));
        }
예제 #18
0
        //

        public async Task <List <AiringAnime> > New(AnimeSeason animeSeason)
        {
            return(await _data.New(AnimeSeason.Current, async() => await _api.GetNewAnimes(animeSeason)));
        }
예제 #19
0
 public async Task <List <AiringAnime> > Leftover(AnimeSeason animeSeason)
 {
     return(await _data.Leftovers(AnimeSeason.Current, async() => await _api.GetLeftoverAnime(animeSeason)));
 }