aboutsummaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-02-24 15:02:38 +0530
committerBobby <[email protected]>2026-02-24 15:02:38 +0530
commitc6ff27b989047cf0af8d6cf2aa86c8e80547cf10 (patch)
tree55206173780ba073611d72fca135fedfd0322cb4 /services
parent17b77153a862ad1eb3babe1e34e748363ac9916c (diff)
downloadmetachan-c6ff27b989047cf0af8d6cf2aa86c8e80547cf10.tar.xz
metachan-c6ff27b989047cf0af8d6cf2aa86c8e80547cf10.zip
Add GetAnimeEpisodes endpoint and implement episode retrieval logic
Diffstat (limited to 'services')
-rw-r--r--services/anime.go57
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 {