142 lines
3.2 KiB
Go
142 lines
3.2 KiB
Go
package arn
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/aerogo/http/client"
|
|
"github.com/aerogo/nano"
|
|
"github.com/akyoto/color"
|
|
"github.com/animenotifier/kitsu"
|
|
)
|
|
|
|
// NewAnimeFromKitsuAnime ...
|
|
func NewAnimeFromKitsuAnime(kitsuAnime *kitsu.Anime) (*Anime, *AnimeCharacters, *AnimeRelations) {
|
|
anime := NewAnime()
|
|
attr := kitsuAnime.Attributes
|
|
|
|
// General data
|
|
anime.Type = strings.ToLower(attr.ShowType)
|
|
anime.Title.Canonical = attr.CanonicalTitle
|
|
anime.Title.English = attr.Titles.En
|
|
anime.Title.Romaji = attr.Titles.EnJp
|
|
anime.Title.Japanese = attr.Titles.JaJp
|
|
anime.Title.Synonyms = attr.AbbreviatedTitles
|
|
anime.StartDate = attr.StartDate
|
|
anime.EndDate = attr.EndDate
|
|
anime.EpisodeCount = attr.EpisodeCount
|
|
anime.EpisodeLength = attr.EpisodeLength
|
|
anime.Status = attr.Status
|
|
anime.Summary = FixAnimeDescription(attr.Synopsis)
|
|
|
|
// Status "unreleased" means the same as "upcoming" so we should normalize it
|
|
if anime.Status == "unreleased" {
|
|
anime.Status = "upcoming"
|
|
}
|
|
|
|
// Kitsu mapping
|
|
anime.SetMapping("kitsu/anime", kitsuAnime.ID)
|
|
|
|
// Import mappings
|
|
mappings := FilterKitsuMappings(func(mapping *kitsu.Mapping) bool {
|
|
return mapping.Relationships.Item.Data.Type == "anime" && mapping.Relationships.Item.Data.ID == anime.ID
|
|
})
|
|
|
|
for _, mapping := range mappings {
|
|
anime.ImportKitsuMapping(mapping)
|
|
}
|
|
|
|
// Download image
|
|
response, err := client.Get(attr.PosterImage.Original).End()
|
|
|
|
if err == nil && response.StatusCode() == http.StatusOK {
|
|
err := anime.SetImageBytes(response.Bytes())
|
|
|
|
if err != nil {
|
|
color.Red("Couldn't set image for [%s] %s (%s)", anime.ID, anime, err.Error())
|
|
}
|
|
} else {
|
|
color.Red("No image for [%s] %s (%d)", anime.ID, anime, response.StatusCode())
|
|
}
|
|
|
|
// Rating
|
|
if anime.Rating.IsNotRated() {
|
|
anime.Rating.Reset()
|
|
}
|
|
|
|
// Trailers
|
|
if attr.YoutubeVideoID != "" {
|
|
anime.Trailers = append(anime.Trailers, &ExternalMedia{
|
|
Service: "Youtube",
|
|
ServiceID: attr.YoutubeVideoID,
|
|
})
|
|
}
|
|
|
|
// Characters
|
|
characters, _ := GetAnimeCharacters(anime.ID)
|
|
|
|
if characters == nil {
|
|
characters = &AnimeCharacters{
|
|
AnimeID: anime.ID,
|
|
Items: []*AnimeCharacter{},
|
|
}
|
|
}
|
|
|
|
// Relations
|
|
relations, _ := GetAnimeRelations(anime.ID)
|
|
|
|
if relations == nil {
|
|
relations = &AnimeRelations{
|
|
AnimeID: anime.ID,
|
|
Items: []*AnimeRelation{},
|
|
}
|
|
}
|
|
|
|
return anime, characters, relations
|
|
}
|
|
|
|
// StreamKitsuAnime returns a stream of all Kitsu anime.
|
|
func StreamKitsuAnime() <-chan *kitsu.Anime {
|
|
channel := make(chan *kitsu.Anime, nano.ChannelBufferSize)
|
|
|
|
go func() {
|
|
for obj := range Kitsu.All("Anime") {
|
|
channel <- obj.(*kitsu.Anime)
|
|
}
|
|
|
|
close(channel)
|
|
}()
|
|
|
|
return channel
|
|
}
|
|
|
|
// FilterKitsuAnime filters all Kitsu anime by a custom function.
|
|
func FilterKitsuAnime(filter func(*kitsu.Anime) bool) []*kitsu.Anime {
|
|
var filtered []*kitsu.Anime
|
|
|
|
channel := Kitsu.All("Anime")
|
|
|
|
for obj := range channel {
|
|
realObject := obj.(*kitsu.Anime)
|
|
|
|
if filter(realObject) {
|
|
filtered = append(filtered, realObject)
|
|
}
|
|
}
|
|
|
|
return filtered
|
|
}
|
|
|
|
// AllKitsuAnime returns a slice of all Kitsu anime.
|
|
func AllKitsuAnime() []*kitsu.Anime {
|
|
all := make([]*kitsu.Anime, 0, DB.Collection("kitsu.Anime").Count())
|
|
|
|
stream := StreamKitsuAnime()
|
|
|
|
for obj := range stream {
|
|
all = append(all, obj)
|
|
}
|
|
|
|
return all
|
|
}
|