From 831c6118d9f4a7dff39298cda36b6a642a11808a Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Sat, 30 Sep 2017 16:04:13 +0200 Subject: [PATCH] Added anime popularity --- jobs/airing-anime/airing-anime.go | 28 ++++++++++++++---- jobs/anime-ratings/anime-ratings.go | 37 +++++++++++++++++++++++- jobs/sync-anime/sync-anime.go | 5 ++++ mixins/AnimeGrid.pixy | 2 +- pages/anime/anime.pixy | 18 ++++++++++++ patches/add-popularity/add-popularity.go | 16 ++++++++++ 6 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 patches/add-popularity/add-popularity.go diff --git a/jobs/airing-anime/airing-anime.go b/jobs/airing-anime/airing-anime.go index 09de8914..ef944efa 100644 --- a/jobs/airing-anime/airing-anime.go +++ b/jobs/airing-anime/airing-anime.go @@ -7,7 +7,12 @@ import ( "github.com/fatih/color" ) -const currentlyAiringBonus = 4.0 +const ( + currentlyAiringBonus = 4.0 + popularityThreshold = 5 + popularityPenalty = 4.0 + watchingPopularityWeight = 0.1 +) func main() { color.Yellow("Caching airing anime") @@ -21,17 +26,30 @@ func main() { } sort.Slice(animeList, func(i, j int) bool { - scoreA := animeList[i].Rating.Overall - scoreB := animeList[j].Rating.Overall + a := animeList[i] + b := animeList[j] + scoreA := a.Rating.Overall + scoreB := b.Rating.Overall - if animeList[i].Status == "current" { + if a.Status == "current" { scoreA += currentlyAiringBonus } - if animeList[j].Status == "current" { + if b.Status == "current" { scoreB += currentlyAiringBonus } + if a.Popularity.Total() < popularityThreshold { + scoreA -= popularityPenalty + } + + if b.Popularity.Total() < popularityThreshold { + scoreB -= popularityPenalty + } + + scoreA += float64(a.Popularity.Watching) * watchingPopularityWeight + scoreB += float64(b.Popularity.Watching) * watchingPopularityWeight + return scoreA > scoreB }) diff --git a/jobs/anime-ratings/anime-ratings.go b/jobs/anime-ratings/anime-ratings.go index 35f053e7..99c020e9 100644 --- a/jobs/anime-ratings/anime-ratings.go +++ b/jobs/anime-ratings/anime-ratings.go @@ -7,6 +7,7 @@ import ( var ratings = map[string][]*arn.AnimeRating{} var finalRating = map[string]*arn.AnimeRating{} +var popularity = map[string]*arn.AnimePopularity{} // Note this is using the airing-anime as a template with modfications // made to it. @@ -18,9 +19,10 @@ func main() { for _, animeList := range allAnimeLists { extractRatings(animeList) + extractPopularity(animeList) } - // Calculate + // Calculate rating for animeID := range finalRating { overall := []float64{} story := []float64{} @@ -59,6 +61,14 @@ func main() { arn.PanicOnError(anime.Save()) } + // Save popularity + for animeID := range popularity { + anime, err := arn.GetAnime(animeID) + arn.PanicOnError(err) + anime.Popularity = popularity[animeID] + arn.PanicOnError(anime.Save()) + } + color.Green("Finished.") } @@ -92,3 +102,28 @@ func extractRatings(animeList *arn.AnimeList) { ratings[item.AnimeID] = append(ratings[item.AnimeID], item.Rating) } } + +func extractPopularity(animeList *arn.AnimeList) { + for _, item := range animeList.Items { + _, found := popularity[item.AnimeID] + + if !found { + popularity[item.AnimeID] = &arn.AnimePopularity{} + } + + counter := popularity[item.AnimeID] + + switch item.Status { + case arn.AnimeListStatusWatching: + counter.Watching++ + case arn.AnimeListStatusCompleted: + counter.Completed++ + case arn.AnimeListStatusPlanned: + counter.Planned++ + case arn.AnimeListStatusHold: + counter.Hold++ + case arn.AnimeListStatusDropped: + counter.Dropped++ + } + } +} diff --git a/jobs/sync-anime/sync-anime.go b/jobs/sync-anime/sync-anime.go index b531802e..2b97a418 100644 --- a/jobs/sync-anime/sync-anime.go +++ b/jobs/sync-anime/sync-anime.go @@ -111,6 +111,11 @@ func sync(data *kitsu.Anime) *arn.Anime { anime.Rating.Reset() } + // Popularity + if anime.Popularity == nil { + anime.Popularity = &arn.AnimePopularity{} + } + // Trailers anime.Trailers = []*arn.ExternalMedia{} diff --git a/mixins/AnimeGrid.pixy b/mixins/AnimeGrid.pixy index 43537328..b95e06ef 100644 --- a/mixins/AnimeGrid.pixy +++ b/mixins/AnimeGrid.pixy @@ -2,4 +2,4 @@ component AnimeGrid(animeList []*arn.Anime) .anime-grid each anime in animeList a.anime-grid-cell.ajax(href="/anime/" + toString(anime.ID)) - img.anime-grid-image.lazy(data-src=anime.Image.Small, alt=anime.Title.Romaji, title=anime.Title.Romaji + " (" + toString(anime.Rating.Overall) + ")") \ No newline at end of file + img.anime-grid-image.lazy(data-src=anime.Image.Small, alt=anime.Title.Romaji, title=anime.Title.Romaji) \ No newline at end of file diff --git a/pages/anime/anime.pixy b/pages/anime/anime.pixy index 974f6968..93235ddc 100644 --- a/pages/anime/anime.pixy +++ b/pages/anime/anime.pixy @@ -169,6 +169,24 @@ component Anime(anime *arn.Anime, friends []*arn.User, listItems map[*arn.User]* if character.Character() != nil Character(character.Character()) + h3.anime-section-name Popularity + .anime-rating-categories + .anime-rating-category + .anime-rating-category-name Watching + .anime-rating= anime.Popularity.Watching + .anime-rating-category + .anime-rating-category-name Completed + .anime-rating= anime.Popularity.Completed + .anime-rating-category + .anime-rating-category-name Planned + .anime-rating= anime.Popularity.Planned + .anime-rating-category + .anime-rating-category-name Hold + .anime-rating= anime.Popularity.Hold + .anime-rating-category + .anime-rating-category-name Dropped + .anime-rating= anime.Popularity.Dropped + if len(anime.Episodes().Items) > 0 if episodesReversed h3.anime-section-name Latest episodes diff --git a/patches/add-popularity/add-popularity.go b/patches/add-popularity/add-popularity.go new file mode 100644 index 00000000..c799eaca --- /dev/null +++ b/patches/add-popularity/add-popularity.go @@ -0,0 +1,16 @@ +package main + +import ( + "github.com/animenotifier/arn" +) + +func main() { + for anime := range arn.MustStreamAnime() { + if anime.Popularity != nil { + continue + } + + anime.Popularity = &arn.AnimePopularity{} + arn.PanicOnError(anime.Save()) + } +}