aboutsummaryrefslogtreecommitdiff
path: root/repositories
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 /repositories
parent17b77153a862ad1eb3babe1e34e748363ac9916c (diff)
downloadmetachan-c6ff27b989047cf0af8d6cf2aa86c8e80547cf10.tar.xz
metachan-c6ff27b989047cf0af8d6cf2aa86c8e80547cf10.zip
Add GetAnimeEpisodes endpoint and implement episode retrieval logic
Diffstat (limited to 'repositories')
-rw-r--r--repositories/anime.go47
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 {