125 lines
2.7 KiB
Go
125 lines
2.7 KiB
Go
package listimportkitsu
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/aerogo/aero"
|
|
"github.com/animenotifier/notify.moe/arn"
|
|
"github.com/animenotifier/kitsu"
|
|
"github.com/animenotifier/notify.moe/components"
|
|
"github.com/animenotifier/notify.moe/utils"
|
|
)
|
|
|
|
// Preview shows an import preview.
|
|
func Preview(ctx aero.Context) error {
|
|
user := utils.GetUser(ctx)
|
|
|
|
if user == nil {
|
|
return ctx.Error(http.StatusBadRequest, "Not logged in")
|
|
}
|
|
|
|
matches, err := getMatches(ctx)
|
|
|
|
if err != nil {
|
|
return ctx.Error(http.StatusBadRequest, err)
|
|
}
|
|
|
|
return ctx.HTML(components.ImportKitsu(user, matches))
|
|
}
|
|
|
|
// Finish ...
|
|
func Finish(ctx aero.Context) error {
|
|
user := utils.GetUser(ctx)
|
|
|
|
if user == nil {
|
|
return ctx.Error(http.StatusBadRequest, "Not logged in")
|
|
}
|
|
|
|
matches, err := getMatches(ctx)
|
|
|
|
if err != nil {
|
|
return ctx.Error(http.StatusBadRequest, err)
|
|
}
|
|
|
|
animeList := user.AnimeList()
|
|
|
|
for _, match := range matches {
|
|
if match.ARNAnime == nil || match.KitsuItem == nil {
|
|
continue
|
|
}
|
|
|
|
rating := match.KitsuItem.Attributes.RatingTwenty
|
|
|
|
if rating < 0 {
|
|
rating = 0
|
|
}
|
|
|
|
if rating > 20 {
|
|
rating = 20
|
|
}
|
|
|
|
// Convert rating
|
|
convertedRating := (float64(rating) / 20.0) * 10.0
|
|
|
|
item := &arn.AnimeListItem{
|
|
AnimeID: match.ARNAnime.ID,
|
|
Status: arn.KitsuStatusToARNStatus(match.KitsuItem.Attributes.Status),
|
|
Episodes: match.KitsuItem.Attributes.Progress,
|
|
Notes: match.KitsuItem.Attributes.Notes,
|
|
Rating: arn.AnimeListItemRating{
|
|
Overall: convertedRating,
|
|
},
|
|
RewatchCount: match.KitsuItem.Attributes.ReconsumeCount,
|
|
Created: arn.DateTimeUTC(),
|
|
Edited: arn.DateTimeUTC(),
|
|
}
|
|
|
|
animeList.Import(item)
|
|
}
|
|
|
|
animeList.Save()
|
|
return ctx.HTML(components.ImportFinished(user))
|
|
}
|
|
|
|
// getMatches finds and returns all matches for the logged in user.
|
|
func getMatches(ctx aero.Context) ([]*arn.KitsuMatch, error) {
|
|
user := utils.GetUser(ctx)
|
|
|
|
if user == nil {
|
|
return nil, errors.New("Not logged in")
|
|
}
|
|
|
|
kitsuUser, err := kitsu.GetUser(user.Accounts.Kitsu.Nick)
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Couldn't load your user info from Kitsu: %s", err.Error())
|
|
}
|
|
|
|
library := kitsuUser.StreamLibraryEntries()
|
|
matches := findAllMatches(library)
|
|
|
|
return matches, nil
|
|
}
|
|
|
|
// findAllMatches returns all matches for the anime inside an anilist anime list.
|
|
func findAllMatches(library chan *kitsu.LibraryEntry) []*arn.KitsuMatch {
|
|
finder := arn.NewAnimeFinder("kitsu/anime")
|
|
matches := []*arn.KitsuMatch{}
|
|
|
|
for item := range library {
|
|
// Ignore non-anime entries
|
|
if item.Anime == nil {
|
|
continue
|
|
}
|
|
|
|
matches = append(matches, &arn.KitsuMatch{
|
|
KitsuItem: item,
|
|
ARNAnime: finder.GetAnime(item.Anime.ID),
|
|
})
|
|
}
|
|
|
|
return matches
|
|
}
|