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); }
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); }
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))); }
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"; }
public async Task <Season> GetSeasonAsync(int year, AnimeSeason season) { var request = new[] { Constants.Season, year.ToString(), season.GetDescription() }; return(await ExecuteGetRequestAsync <Season>(request)); }
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()); }
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; }
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))); }
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(); }
// 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()); }
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; } }
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 = ""; } }
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); } }
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); }
public AnimeBuilder WithSeason(AnimeSeason season) { _season = season; return(this); }
// public async Task <List <AiringAnime> > GetNewAnimes(AnimeSeason season) { return(await GetBrowse(await BuildBrowseUrl(season))); }
// public async Task <List <AiringAnime> > New(AnimeSeason animeSeason) { return(await _data.New(AnimeSeason.Current, async() => await _api.GetNewAnimes(animeSeason))); }
public async Task <List <AiringAnime> > Leftover(AnimeSeason animeSeason) { return(await _data.Leftovers(AnimeSeason.Current, async() => await _api.GetLeftoverAnime(animeSeason))); }