diff --git a/api/anime/handler.go b/api/anime/handler.go index eb642a1..d1e36c3 100644 --- a/api/anime/handler.go +++ b/api/anime/handler.go @@ -270,6 +270,7 @@ func (h *Handler) HandleAnimeDetails(w http.ResponseWriter, r *http.Request) { recommendations []jikan.RecommendationEntry watchlist []database.GetUserWatchListRow status string + episodesCount int ) g, gCtx := errgroup.WithContext(r.Context()) @@ -277,6 +278,26 @@ func (h *Handler) HandleAnimeDetails(w http.ResponseWriter, r *http.Request) { g.Go(func() error { var err error anime, err = h.jikanClient.GetAnimeByID(gCtx, id) + if err == nil && anime.Airing { + // If airing, we want to know how many episodes are released so far. + // The episodes endpoint with page 1 gives us the last visible page in pagination. + eps, err := h.jikanClient.GetEpisodes(gCtx, id, 1) + if err == nil { + if eps.Pagination.LastVisiblePage > 1 { + // Fetch last page to get the true count + lastEps, err := h.jikanClient.GetEpisodes(gCtx, id, eps.Pagination.LastVisiblePage) + if err == nil && len(lastEps.Data) > 0 { + lastEp := lastEps.Data[len(lastEps.Data)-1] + count, _ := strconv.Atoi(lastEp.Episode) + episodesCount = count + } + } else if len(eps.Data) > 0 { + lastEp := eps.Data[len(eps.Data)-1] + count, _ := strconv.Atoi(lastEp.Episode) + episodesCount = count + } + } + } return err }) @@ -336,6 +357,7 @@ func (h *Handler) HandleAnimeDetails(w http.ResponseWriter, r *http.Request) { "Status": status, "CurrentPath": r.URL.Path, "WatchlistIDs": watchlistIDs, + "EpisodesCount": episodesCount, }); err != nil { log.Printf("render error: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) diff --git a/integrations/jikan/types.go b/integrations/jikan/types.go index 9b0d51b..206632b 100644 --- a/integrations/jikan/types.go +++ b/integrations/jikan/types.go @@ -303,7 +303,8 @@ type SearchResponse struct { } type Pagination struct { - HasNextPage bool `json:"has_next_page"` + LastVisiblePage int `json:"last_visible_page"` + HasNextPage bool `json:"has_next_page"` } type TopAnimeResponse struct { diff --git a/templates/anime.gohtml b/templates/anime.gohtml index df81aea..d8acf85 100644 --- a/templates/anime.gohtml +++ b/templates/anime.gohtml @@ -35,7 +35,11 @@ {{end}} {{if $anime.Type}}{{$anime.Type}}{{end}} - {{if $anime.Episodes}}{{$anime.Episodes}} episodes{{end}} + {{if and $anime.Airing .EpisodesCount}} + {{.EpisodesCount}}{{if $anime.Episodes}}/{{$anime.Episodes}}{{end}} episodes + {{else if $anime.Episodes}} + {{$anime.Episodes}} episodes + {{end}} {{if $anime.Status}}{{$anime.Status}}{{end}} {{if $anime.Season}}{{$anime.Premiered}}{{end}} {{if $anime.ShortRating}}{{$anime.ShortRating}}{{end}}