From 0d2459fa3ce5c0946941fa759034d9672f93cd16 Mon Sep 17 00:00:00 2001 From: mkelvers Date: Mon, 6 Jul 2026 07:08:57 +0200 Subject: [PATCH] feat: fetch episode titles from allanime provider --- .../playback/allanime/availability.go | 43 ++++++++++++++----- integrations/playback/allanime/http_test.go | 28 ++++++++---- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/integrations/playback/allanime/availability.go b/integrations/playback/allanime/availability.go index 812ecba4..20b95b2b 100644 --- a/integrations/playback/allanime/availability.go +++ b/integrations/playback/allanime/availability.go @@ -9,9 +9,10 @@ import ( ) type AvailableEpisodes struct { - Sub []string - Dub []string - Raw []string + Sub []string + Dub []string + Raw []string + Titles map[int]string } 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...)) 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) { - graphqlQuery := `query($showId: String!) { + graphqlQuery := `query($showId: String!, $start: Float!, $end: Float!) { show(_id: $showId) { 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 { return AvailableEpisodes{}, err } @@ -61,10 +69,25 @@ func (c *AllAnimeProvider) GetAvailableEpisodes(ctx context.Context, showID stri 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{ - Sub: stringsFrom(detail["sub"]), - Dub: stringsFrom(detail["dub"]), - Raw: stringsFrom(detail["raw"]), + Sub: stringsFrom(detail["sub"]), + Dub: stringsFrom(detail["dub"]), + Raw: stringsFrom(detail["raw"]), + Titles: titles, }, nil } diff --git a/integrations/playback/allanime/http_test.go b/integrations/playback/allanime/http_test.go index 8a87732a..e58a8aca 100644 --- a/integrations/playback/allanime/http_test.go +++ b/integrations/playback/allanime/http_test.go @@ -343,17 +343,19 @@ func TestGetAvailableEpisodes(t *testing.T) { t.Parallel() tests := []struct { - name string - body string - wantSub int - wantDub int - wantErr bool + name string + body string + wantSub int + wantDub int + wantTitle string + wantErr bool }{ { - name: "sub and dub available", - body: `{"data":{"show":{"availableEpisodesDetail":{"sub":["1","2","3"],"dub":["1"]},"lastEpisodeInfo":{}}}}`, - wantSub: 3, - wantDub: 1, + name: "sub and dub available", + body: `{"data":{"show":{"availableEpisodesDetail":{"sub":["1","2","3"],"dub":["1"]}},"episodeInfos":[{"episodeIdNum":1,"notes":"The Beginning"}]}}`, + wantSub: 3, + wantDub: 1, + wantTitle: "The Beginning", }, { name: "sub only", @@ -394,10 +396,18 @@ func TestGetAvailableEpisodes(t *testing.T) { if 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) { t.Parallel()