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 /repositories | |
| parent | 17b77153a862ad1eb3babe1e34e748363ac9916c (diff) | |
| download | metachan-c6ff27b989047cf0af8d6cf2aa86c8e80547cf10.tar.xz metachan-c6ff27b989047cf0af8d6cf2aa86c8e80547cf10.zip | |
Add GetAnimeEpisodes endpoint and implement episode retrieval logic
Diffstat (limited to 'repositories')
| -rw-r--r-- | repositories/anime.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/repositories/anime.go b/repositories/anime.go index 9a17542..4960e6c 100644 --- a/repositories/anime.go +++ b/repositories/anime.go @@ -6,6 +6,7 @@ import ( "metachan/entities" "metachan/enums" "metachan/utils/logger" + "time" "gorm.io/gorm" "gorm.io/gorm/clause" @@ -209,6 +210,52 @@ func SaveEpisodeSkipTimes(episodeID string, skipTimes []entities.EpisodeSkipTime return nil } +func GetAnimeEpisodes[T idType](maptype enums.MappingType, id T) ([]entities.Episode, error) { + mapping, err := GetAnimeMapping(maptype, id) + if err != nil { + return nil, errors.New("anime not found") + } + + var anime entities.Anime + if err := DB.Where("mapping_id = ?", mapping.ID).Select("id").First(&anime).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, err + } + return nil, errors.New("anime not found") + } + + var episodes []entities.Episode + result := DB. + Preload("Title"). + Preload("SkipTimes"). + Preload("StreamInfo"). + Preload("StreamInfo.SubSources"). + Preload("StreamInfo.DubSources"). + Where("anime_id = ?", anime.ID). + Order("episode_number asc"). + Find(&episodes) + + if result.Error != nil { + return nil, errors.New("failed to fetch episodes") + } + + return episodes, nil +} + +func SaveEpisodeStreamInfo(animeID uint, episodeID string, info *entities.StreamInfo) error { + info.AnimeID = animeID + info.EpisodeID = episodeID + info.LastFetch = time.Now() + + var existing entities.StreamInfo + if DB.Where("episode_id = ? AND anime_id = ?", episodeID, animeID).First(&existing).Error == nil { + info.ID = existing.ID + DB.Where("stream_info_id = ?", existing.ID).Delete(&entities.StreamingSource{}) + } + + return DB.Session(&gorm.Session{FullSaveAssociations: true}).Save(info).Error +} + func GetAllAnimeStubs() ([]animeStub, error) { var stubs []animeStub if err := DB.Model(&entities.Anime{}).Select("mal_id, updated_at").Scan(&stubs).Error; err != nil { |
