diff options
| author | Bobby <[email protected]> | 2026-02-24 15:02:38 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-02-24 15:02:38 +0530 |
| commit | c6ff27b989047cf0af8d6cf2aa86c8e80547cf10 (patch) | |
| tree | 55206173780ba073611d72fca135fedfd0322cb4 /services | |
| parent | 17b77153a862ad1eb3babe1e34e748363ac9916c (diff) | |
| download | metachan-c6ff27b989047cf0af8d6cf2aa86c8e80547cf10.tar.xz metachan-c6ff27b989047cf0af8d6cf2aa86c8e80547cf10.zip | |
Add GetAnimeEpisodes endpoint and implement episode retrieval logic
Diffstat (limited to 'services')
| -rw-r--r-- | services/anime.go | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/services/anime.go b/services/anime.go index de19aa5..ec2b99c 100644 --- a/services/anime.go +++ b/services/anime.go @@ -1,6 +1,7 @@ package services import ( + "crypto/md5" "fmt" "metachan/entities" "metachan/enums" @@ -315,6 +316,12 @@ func applyJikanData(anime *entities.Anime, jikanAnime *types.JikanAnimeResponse, } } + titleForID := je.Title + if titleForID == "" { + titleForID = je.TitleRomaji + } + episode.EpisodeID = generateEpisodeID(anime.MALID, je.MALID, titleForID) + anime.Episodes = append(anime.Episodes, episode) } @@ -486,11 +493,11 @@ func applyStreamingData(anime *entities.Anime) { return } - logger.Infof("AnimeService", "Fetching streaming counts for: %s", searchTitle) subCount, dubCount, err := streaming.GetStreamingCounts(searchTitle) - if err != nil { - if anime.Title.English != "" && anime.Title.English != searchTitle { - subCount, dubCount, err = streaming.GetStreamingCounts(anime.Title.English) + if err != nil && anime.Title.English != "" && anime.Title.English != searchTitle { + subCount, dubCount, err = streaming.GetStreamingCounts(anime.Title.English) + if err == nil { + searchTitle = anime.Title.English } } @@ -501,7 +508,39 @@ func applyStreamingData(anime *entities.Anime) { anime.SubbedCount = subCount anime.DubbedCount = dubCount - logger.Infof("AnimeService", "Streaming counts - Subbed: %d, Dubbed: %d", subCount, dubCount) + + if len(anime.Episodes) > 0 { + epNums := make([]int, len(anime.Episodes)) + for i, ep := range anime.Episodes { + epNums[i] = ep.EpisodeNumber + } + sourcesMap, err := streaming.FetchAllEpisodeSources(searchTitle, epNums) + if err == nil { + for i := range anime.Episodes { + ep := &anime.Episodes[i] + if s, ok := sourcesMap[ep.EpisodeNumber]; ok { + sub := make([]entities.StreamingSource, len(s.Sub)) + for j, src := range s.Sub { + sub[j] = entities.StreamingSource{URL: src.URL, Server: src.Server, Type: src.Type} + } + dub := make([]entities.StreamingSource, len(s.Dub)) + for j, src := range s.Dub { + dub[j] = entities.StreamingSource{URL: src.URL, Server: src.Server, Type: src.Type} + } + ep.StreamInfo = &entities.StreamInfo{ + SubSources: sub, + DubSources: dub, + } + } + } + } + } +} + +func generateEpisodeID(malID int, episodeNumber int, title string) string { + unique := fmt.Sprintf("%d-%d-%s", malID, episodeNumber, title) + hash := md5.Sum([]byte(unique)) + return fmt.Sprintf("%x", hash) } func applySeasonData(anime *entities.Anime, mapping *entities.Mapping) { @@ -711,6 +750,14 @@ func saveAnime(anime *entities.Anime, skipTimeMap map[string][]entities.EpisodeS if err := repositories.SaveAnimeEpisodes(anime.ID, anime.Episodes); err != nil { logger.Warnf("AnimeService", "Failed to save episodes: %v", err) } + for i := range anime.Episodes { + ep := &anime.Episodes[i] + if ep.StreamInfo != nil && ep.EpisodeID != "" { + if err := repositories.SaveEpisodeStreamInfo(anime.ID, ep.EpisodeID, ep.StreamInfo); err != nil { + logger.Warnf("AnimeService", "Failed to save stream info for episode %s: %v", ep.EpisodeID, err) + } + } + } } if len(anime.Characters) > 0 { |
