feat: fetch episode titles from allanime provider

This commit is contained in:
2026-07-06 07:08:57 +02:00
parent 9f370448ed
commit 0d2459fa3c
2 changed files with 52 additions and 19 deletions

View File

@@ -9,9 +9,10 @@ import (
) )
type AvailableEpisodes struct { type AvailableEpisodes struct {
Sub []string Sub []string
Dub []string Dub []string
Raw []string Raw []string
Titles map[int]string
} }
func (c *AllAnimeProvider) GetEpisodeAvailability(ctx context.Context, animeID int, titleCandidates []string) (domain.EpisodeAvailability, error) { func (c *AllAnimeProvider) GetEpisodeAvailability(ctx context.Context, animeID int, titleCandidates []string) (domain.EpisodeAvailability, error) {
@@ -30,18 +31,25 @@ func (c *AllAnimeProvider) GetEpisodeAvailabilityByProviderID(ctx context.Contex
sub := episodeNums(append(available.Sub, available.Raw...)) sub := episodeNums(append(available.Sub, available.Raw...))
dub := episodeNums(available.Dub) dub := episodeNums(available.Dub)
return domain.EpisodeAvailability{Sub: sub, Dub: dub}, nil return domain.EpisodeAvailability{Sub: sub, Dub: dub, Titles: available.Titles}, nil
} }
func (c *AllAnimeProvider) GetAvailableEpisodes(ctx context.Context, showID string) (AvailableEpisodes, error) { func (c *AllAnimeProvider) GetAvailableEpisodes(ctx context.Context, showID string) (AvailableEpisodes, error) {
graphqlQuery := `query($showId: String!) { graphqlQuery := `query($showId: String!, $start: Float!, $end: Float!) {
show(_id: $showId) { show(_id: $showId) {
availableEpisodesDetail availableEpisodesDetail
lastEpisodeInfo }
episodeInfos(showId: $showId, episodeNumStart: $start, episodeNumEnd: $end) {
episodeIdNum
notes
} }
}` }`
result, err := c.graphqlRequest(ctx, graphqlQuery, map[string]any{"showId": showID}) result, err := c.graphqlRequest(ctx, graphqlQuery, map[string]any{
"showId": showID,
"start": 1,
"end": 100000,
})
if err != nil { if err != nil {
return AvailableEpisodes{}, err return AvailableEpisodes{}, err
} }
@@ -61,10 +69,25 @@ func (c *AllAnimeProvider) GetAvailableEpisodes(ctx context.Context, showID stri
return AvailableEpisodes{}, errors.New("invalid detail") return AvailableEpisodes{}, errors.New("invalid detail")
} }
titles := map[int]string{}
infos, _ := data["episodeInfos"].([]any)
for _, value := range infos {
info, ok := value.(map[string]any)
if !ok {
continue
}
number := numericInt(info["episodeIdNum"])
title := plainText(stringValue(info["notes"]))
if number > 0 && title != "" {
titles[number] = title
}
}
return AvailableEpisodes{ return AvailableEpisodes{
Sub: stringsFrom(detail["sub"]), Sub: stringsFrom(detail["sub"]),
Dub: stringsFrom(detail["dub"]), Dub: stringsFrom(detail["dub"]),
Raw: stringsFrom(detail["raw"]), Raw: stringsFrom(detail["raw"]),
Titles: titles,
}, nil }, nil
} }

View File

@@ -343,17 +343,19 @@ func TestGetAvailableEpisodes(t *testing.T) {
t.Parallel() t.Parallel()
tests := []struct { tests := []struct {
name string name string
body string body string
wantSub int wantSub int
wantDub int wantDub int
wantErr bool wantTitle string
wantErr bool
}{ }{
{ {
name: "sub and dub available", name: "sub and dub available",
body: `{"data":{"show":{"availableEpisodesDetail":{"sub":["1","2","3"],"dub":["1"]},"lastEpisodeInfo":{}}}}`, body: `{"data":{"show":{"availableEpisodesDetail":{"sub":["1","2","3"],"dub":["1"]}},"episodeInfos":[{"episodeIdNum":1,"notes":"The Beginning"}]}}`,
wantSub: 3, wantSub: 3,
wantDub: 1, wantDub: 1,
wantTitle: "The Beginning",
}, },
{ {
name: "sub only", name: "sub only",
@@ -394,10 +396,18 @@ func TestGetAvailableEpisodes(t *testing.T) {
if len(available.Dub) != tt.wantDub { if len(available.Dub) != tt.wantDub {
t.Errorf("Dub count = %d, want %d", len(available.Dub), tt.wantDub) t.Errorf("Dub count = %d, want %d", len(available.Dub), tt.wantDub)
} }
assertEpisodeTitle(t, available, tt.wantTitle)
}) })
} }
} }
func assertEpisodeTitle(t *testing.T, available AvailableEpisodes, want string) {
t.Helper()
if want != "" && available.Titles[1] != want {
t.Errorf("episode 1 title = %q, want %q", available.Titles[1], want)
}
}
func TestSearch(t *testing.T) { func TestSearch(t *testing.T) {
t.Parallel() t.Parallel()