Next season feature

This commit is contained in:
daru
2022-05-26 01:39:34 +02:00
parent 967a506461
commit af4a3d0239
7 changed files with 113 additions and 14 deletions

2
go.mod
View File

@@ -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
)

2
go.sum
View File

@@ -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=

View File

@@ -20,6 +20,7 @@ const (
husoVersion = "1.1"
registerSecret = "綾波レイ"
seasonApiJikan = "seasons/now"
seasonStrJikan = "seasons/"
userApiJikan = "users/"
userApiMal = "users/"
animeApiMal = "anime/"

View File

@@ -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())
}
}

20
ober.go
View File

@@ -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 {

View File

@@ -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()

View File

@@ -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
}