diff --git a/go.mod b/go.mod index d042ca7..69cad02 100644 --- a/go.mod +++ b/go.mod @@ -21,5 +21,5 @@ require ( github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect github.com/xujiajun/mmap-go v1.0.1 // indirect github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b // indirect - golang.org/x/sys v0.0.0-20220519141025-dcacdad47464 // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect ) diff --git a/go.sum b/go.sum index 74d06eb..ba28db3 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,8 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220519141025-dcacdad47464 h1:MpIuURY70f0iKp/oooEFtB2oENcHITo/z1b6u41pKCw= golang.org/x/sys v0.0.0-20220519141025-dcacdad47464/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/huso.go b/huso.go index b72bb45..2f86cf2 100644 --- a/huso.go +++ b/huso.go @@ -20,6 +20,7 @@ const ( husoVersion = "1.1" registerSecret = "綾波レイ" seasonApiJikan = "seasons/now" + seasonStrJikan = "seasons/" userApiJikan = "users/" userApiMal = "users/" animeApiMal = "anime/" diff --git a/knecht.go b/knecht.go index 78517f7..250c5ba 100644 --- a/knecht.go +++ b/knecht.go @@ -134,9 +134,10 @@ func GetUserData(username string) (*User, []byte, error) { } func GetSeasonDataAll() ([]Anime, []byte, error) { - color.Infoln("Aktuelle Season abfragen...") - logOut.WriteLine("📺 Aktuelle Season abfragen...") - data, _, err := GetSeasonData(1) + seasonStr := GetCurrentSeasonString() + color.Infoln("Aktuelle Season (" + seasonStr + ") abfragen...") + logOut.WriteLine("📺 Aktuelle Season (" + seasonStr + ") abfragen...") + data, _, err := GetSeasonData(seasonApiJikan, 1) if err != nil { return nil, nil, err } @@ -150,7 +151,7 @@ func GetSeasonDataAll() ([]Anime, []byte, error) { for i := 2; data.Pagination.HasNextPage; i++ { color.Infof("Seite %d abfragen...\n", i) logOut.WriteLine(fmt.Sprintf("📺 Seite %d abfragen...", i)) - newData, _, err := GetSeasonData(i) + newData, _, err := GetSeasonData(seasonApiJikan, i) if err != nil { return nil, nil, err } @@ -168,9 +169,44 @@ func GetSeasonDataAll() ([]Anime, []byte, error) { return animes, bytes, err } -func GetSeasonData(page int) (*SeasonJikan, []byte, error) { +func GetNextSeasonDataAll(season string) ([]Anime, []byte, error) { + color.Infoln("Nächste Season (" + season + ") abfragen...") + logOut.WriteLine("📺 Nächste Season (" + season + ") abfragen...") + data, _, err := GetSeasonData(seasonStrJikan+season, 1) + if err != nil { + return nil, nil, err + } + color.Infof("%d Anime auf %d Seiten\n", data.Pagination.Items.Total, data.Pagination.LastVisiblePage) + logOut.WriteLine(fmt.Sprintf("📺 %d Anime auf %d Seiten", data.Pagination.Items.Total, data.Pagination.LastVisiblePage)) + animes := make([]Anime, 0) + // convert to anime + for _, a := range data.Data { + animes = append(animes, JikanConvert(&a)) + } + for i := 2; data.Pagination.HasNextPage; i++ { + color.Infof("Seite %d abfragen...\n", i) + logOut.WriteLine(fmt.Sprintf("📺 Seite %d abfragen...", i)) + newData, _, err := GetSeasonData(seasonStrJikan+season, i) + if err != nil { + return nil, nil, err + } + data.Pagination.CurrentPage = newData.Pagination.CurrentPage + data.Pagination.HasNextPage = newData.Pagination.HasNextPage + data.Pagination.Items.Count += newData.Pagination.Items.Count + // convert to anime + for _, a := range newData.Data { + animes = append(animes, JikanConvert(&a)) + } + } + color.Infof("%d Anime bekommen\n", len(animes)) + logOut.WriteLine(fmt.Sprintf("📺 %d Anime bekommen", len(animes))) + bytes, err := json.Marshal(animes) + return animes, bytes, err +} + +func GetSeasonData(seasonRoute string, page int) (*SeasonJikan, []byte, error) { var data SeasonJikan - body, err := GetSeasonBytes(page) + body, err := GetSeasonBytes(seasonRoute, page) if err != nil { return nil, body, err } @@ -178,11 +214,11 @@ func GetSeasonData(page int) (*SeasonJikan, []byte, error) { return &data, body, err } -func GetSeasonBytes(page int) ([]byte, error) { +func GetSeasonBytes(seasonRoute string, page int) ([]byte, error) { if page != 0 { - return GetDataJikan(seasonApiJikan + "?page=" + strconv.Itoa(page)) + return GetDataJikan(seasonRoute + "?page=" + strconv.Itoa(page)) } - return GetDataJikan(seasonApiJikan) + return GetDataJikan(seasonRoute) } func GetDataMal(apiAddr string) ([]byte, error) { @@ -240,3 +276,19 @@ func GetCurrentSeasonString() string { return fmt.Sprintf("%04d", now.Year()) } } + +func GetNextSeasonString() string { + var now = time.Now() + switch now.Month() { + case time.January, time.February, time.March: + return fmt.Sprintf("%04d/spring", now.Year()) + case time.April, time.May, time.June: + return fmt.Sprintf("%04d/summer", now.Year()) + case time.July, time.August, time.September: + return fmt.Sprintf("%04d/fall", now.Year()) + case time.October, time.November, time.December: + return fmt.Sprintf("%04d/winter", now.Year()+1) + default: + return fmt.Sprintf("%04d", now.Year()) + } +} diff --git a/ober.go b/ober.go index ff29cb3..c05eb86 100644 --- a/ober.go +++ b/ober.go @@ -16,6 +16,7 @@ func RunWebserv() { r := router.New() r.GET("/", Headers(Start)) r.GET("/api/season", Headers(Season)) + r.GET("/api/nextseason", Headers(SeasonNext)) r.GET("/api/auth/{user}", Headers(AuthTest)) r.GET("/api/anime/{id}", Headers(AnimeGet)) r.GET("/api/animesearch", Headers(AnimeSearchGet)) @@ -34,7 +35,7 @@ func RunWebserv() { } func Start(ctx *fasthttp.RequestCtx) { - season, err := GetSeasonCache() + season, err := GetSeasonCache(seasonApiJikan) if err != nil { addErrorToCtx(ctx, err) return @@ -78,6 +79,23 @@ func Season(ctx *fasthttp.RequestCtx) { ctx.SetStatusCode(fasthttp.StatusOK) } +func SeasonNext(ctx *fasthttp.RequestCtx) { + data, err := seasoncache.Get(GetNextSeasonString()) + if err != nil { + addErrorToCtx(ctx, err) + return + } + + err = writeResponseBody(ctx, data) + if err != nil { + addErrorToCtx(ctx, err) + return + } + + ctx.SetContentType("application/json; charset=utf-8") + ctx.SetStatusCode(fasthttp.StatusOK) +} + func AnimeGet(ctx *fasthttp.RequestCtx) { idVal := ctx.UserValue("id") if idVal == nil { diff --git a/praktikant.go b/praktikant.go index 81bbacd..fc258a3 100644 --- a/praktikant.go +++ b/praktikant.go @@ -114,6 +114,20 @@ func LangeArbeit() { } } + // next season data + nextSeason := GetNextSeasonString() + _, bytes, err = GetNextSeasonDataAll(nextSeason) + if err != nil { + color.Errorln(err.Error()) + logOut.WriteError(err) + } else { + err = seasoncache.Set(nextSeason, bytes) + if err != nil { + color.Errorln(err.Error()) + logOut.WriteError(err) + } + } + // refresh anime cache with watched count := 0 animesUsers, err := ReadAnimeUsers() diff --git a/schaffer.go b/schaffer.go index 5646b79..a68c48b 100644 --- a/schaffer.go +++ b/schaffer.go @@ -109,8 +109,8 @@ func UserConvert(user *UserJikan) User { } } -func GetSeasonCache() ([]Anime, error) { - data, err := seasoncache.Get(seasonApiJikan) +func GetSeasonCache(key string) ([]Anime, error) { + data, err := seasoncache.Get(key) if err != nil { return nil, err } @@ -120,7 +120,19 @@ func GetSeasonCache() ([]Anime, error) { } func SearchSeason(animeId int64) (*Anime, error) { - season, err := GetSeasonCache() + season, err := GetSeasonCache(seasonApiJikan) + if err != nil { + return nil, err + } + if len(season) == 0 { + return nil, errors.New("no seasonal anime") + } + for _, a := range season { + if a.Anime == animeId { + return &a, err + } + } + season, err = GetSeasonCache(GetNextSeasonString()) if err != nil { return nil, err }