aboutsummaryrefslogtreecommitdiff
path: root/utils/mal/episodes.go
blob: ff6168643ee84721742831e185d7550c529e4a04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package mal

import (
	"fmt"
	"metachan/utils/logger"
	"strconv"
	"strings"

	"github.com/PuerkitoBio/goquery"
)

func parseEpisodeRow(row *goquery.Selection) Episode {
	numberText := strings.TrimSpace(row.Find("td.episode-number").Text())
	episodeNumber, _ := strconv.Atoi(numberText)

	titleCell := row.Find("td.episode-title")
	titleLink := titleCell.Find("a")
	episodeURL, _ := titleLink.Attr("href")

	englishTitle := strings.TrimSpace(titleLink.Text())
	japaneseTitle := strings.TrimSpace(titleCell.Find("span.di-ib").Text())

	airedText := strings.TrimSpace(row.Find("td.episode-aired").Text())

	forumLink := row.Find("td.episode-forum a")
	forumURL, _ := forumLink.Attr("href")

	fillerTag := row.Find("span.filler")
	recapTag := row.Find("span.recap")

	return Episode{
		Number: episodeNumber,
		URL:    episodeURL,
		Title: Title{
			English:  englishTitle,
			Japanese: japaneseTitle,
		},
		Aired:    parseAiredDateString(airedText),
		ForumURL: forumURL,
		Filler:   fillerTag.Length() > 0,
		Recap:    recapTag.Length() > 0,
	}
}

func GetAnimeEpisodesByMALID(malID int) ([]Episode, error) {
	var allEpisodes []Episode
	offset := 0

	for {
		pageURL := fmt.Sprintf("%s/anime/%d/_/episode?offset=%d", malBaseURL, malID, offset)
		document, fetchErr := makeRequest(pageURL)
		if fetchErr != nil {
			if len(allEpisodes) > 0 {
				logger.Warnf("MALClient", "Failed to fetch episodes page at offset %d for MAL ID %d: %v", offset, malID, fetchErr)
				break
			}
			logger.Errorf("MALClient", "Failed to fetch episodes for MAL ID %d: %v", malID, fetchErr)
			return nil, fmt.Errorf("failed to fetch episodes for MAL ID %d: %w", malID, fetchErr)
		}

		episodeRows := document.Find("table.episode_list tbody tr")
		if episodeRows.Length() == 0 {
			break
		}

		episodeRows.Each(func(index int, row *goquery.Selection) {
			episode := parseEpisodeRow(row)
			if episode.Number > 0 {
				allEpisodes = append(allEpisodes, episode)
			}
		})

		nextPageLink := document.Find("a.link-blue-box.next")
		if nextPageLink.Length() == 0 {
			break
		}

		offset += 100
	}

	return allEpisodes, nil
}