diff options
| author | Priyansh <[email protected]> | 2025-08-25 11:40:19 +0530 |
|---|---|---|
| committer | Priyansh <[email protected]> | 2025-08-25 11:40:19 +0530 |
| commit | a4d2b4c3d7b043b496ee2ecb51967dbd9785a1ef (patch) | |
| tree | 157b54d7a1bfb613a34e1e3403c87270a7d8e515 | |
| parent | c336a3bab91186be1b998bba67e57d0797bd87ba (diff) | |
| download | metachan-a4d2b4c3d7b043b496ee2ecb51967dbd9785a1ef.tar.xz metachan-a4d2b4c3d7b043b496ee2ecb51967dbd9785a1ef.zip | |
updated routes, added episode ids to each episode
| -rw-r--r-- | controllers/anime.go | 25 | ||||
| -rw-r--r-- | database/anime_cache.go | 2 | ||||
| -rw-r--r-- | database/migrate.go | 14 | ||||
| -rw-r--r-- | entities/anime.go | 1 | ||||
| -rw-r--r-- | router/router.go | 5 | ||||
| -rw-r--r-- | services/anime/helpers.go | 30 | ||||
| -rw-r--r-- | types/anime.go | 1 |
7 files changed, 60 insertions, 18 deletions
diff --git a/controllers/anime.go b/controllers/anime.go index baaf6f9..11da647 100644 --- a/controllers/anime.go +++ b/controllers/anime.go @@ -22,7 +22,7 @@ func getAnimeService() *animeService.Service { } // GetAnimeByMALID fetches anime details by MAL ID -func GetAnimeByMALID(c *fiber.Ctx) error { +func GetAnime(c *fiber.Ctx) error { mapping, err := getAnimeMapping(c) if err != nil { return err @@ -44,7 +44,7 @@ func GetAnimeByMALID(c *fiber.Ctx) error { } // GetAnimeEpisodesByMALID fetches anime episodes by MAL ID -func GetAnimeEpisodesByMALID(c *fiber.Ctx) error { +func GetAnimeEpisodes(c *fiber.Ctx) error { mapping, err := getAnimeMapping(c) if err != nil { return err @@ -66,6 +66,27 @@ func GetAnimeEpisodesByMALID(c *fiber.Ctx) error { return c.JSON(anime.Episodes) } +func GetAnimeCharacters(c *fiber.Ctx) error { + mapping, err := getAnimeMapping(c) + if err != nil { + return err + } + + service := getAnimeService() + anime, err := service.GetAnimeDetails(mapping) + if err != nil { + logger.Log("Failed to fetch anime characters: "+err.Error(), logger.LogOptions{ + Level: logger.Error, + Prefix: "AnimeAPI", + }) + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": "Failed to fetch anime characters", + }) + } + + return c.JSON(anime.Characters) +} + func getAnimeMapping(c *fiber.Ctx) (*entities.AnimeMapping, error) { isAnilist := c.Query("provider") == "anilist" malID := c.Params("id") diff --git a/database/anime_cache.go b/database/anime_cache.go index 6981b7a..835f271 100644 --- a/database/anime_cache.go +++ b/database/anime_cache.go @@ -305,6 +305,7 @@ func SaveAnimeToCache(animeData *types.Anime) error { } episodeRecord := &entities.CachedAnimeSingleEpisode{ + EpisodeID: episode.ID, AnimeID: anime.ID, TitlesID: titles.ID, Description: episode.Description, @@ -600,6 +601,7 @@ func ConvertToTypesAnime(cached *entities.CachedAnime) *types.Anime { anime.Episodes.Episodes = make([]types.AnimeSingleEpisode, len(cached.Episodes)) for i, episode := range cached.Episodes { episodeData := types.AnimeSingleEpisode{ + ID: episode.EpisodeID, Description: episode.Description, Aired: episode.Aired, Score: episode.Score, diff --git a/database/migrate.go b/database/migrate.go index 9c02cc7..d73eea9 100644 --- a/database/migrate.go +++ b/database/migrate.go @@ -34,17 +34,17 @@ func AutoMigrate() { &entities.CachedAnimeSeason{}, ) if err != nil { - logger.Log(fmt.Sprintf("Error during auto migration: %v", err), logger.LogOptions{ - Prefix: "Database", + logger.Log(fmt.Sprintf("Failed to migrate database: %v", err), logger.LogOptions{ Level: logger.Error, - Fatal: true, - }) - } else { - logger.Log("Auto migration completed successfully", logger.LogOptions{ Prefix: "Database", - Level: logger.Success, }) + panic(err) } + + logger.Log("Database migration completed successfully", logger.LogOptions{ + Level: logger.Info, + Prefix: "Database", + }) } // Migrate creates and migrations all tables diff --git a/entities/anime.go b/entities/anime.go index d29f7cd..0014979 100644 --- a/entities/anime.go +++ b/entities/anime.go @@ -208,6 +208,7 @@ type CachedEpisodeTitles struct { // CachedAnimeSingleEpisode for storing individual episode details type CachedAnimeSingleEpisode struct { gorm.Model + EpisodeID string `gorm:"uniqueIndex;size:32"` AnimeID uint TitlesID uint Description string `gorm:"type:text"` diff --git a/router/router.go b/router/router.go index b55014a..4591bc5 100644 --- a/router/router.go +++ b/router/router.go @@ -12,8 +12,9 @@ func Initialize(router *fiber.App) { // Anime routes animeRouter := router.Group("/a") - animeRouter.Get("/:id", controllers.GetAnimeByMALID) - animeRouter.Get("/:id/episodes", controllers.GetAnimeEpisodesByMALID) + animeRouter.Get("/:id", controllers.GetAnime) + animeRouter.Get("/:id/episodes", controllers.GetAnimeEpisodes) + animeRouter.Get("/:id/characters", controllers.GetAnimeCharacters) // 404 Default router.Use(func(c *fiber.Ctx) error { diff --git a/services/anime/helpers.go b/services/anime/helpers.go index 3231676..932dbc2 100644 --- a/services/anime/helpers.go +++ b/services/anime/helpers.go @@ -1,6 +1,7 @@ package anime import ( + "crypto/md5" "crypto/tls" "fmt" "metachan/types" @@ -15,17 +16,33 @@ import ( "time" ) -// generateBasicEpisodes creates a basic list of episode data from Jikan episodes +func generateEpisodeID(titles types.EpisodeTitles) string { + var title string + if titles.English != "" { + title = titles.English + } else if titles.Romaji != "" { + title = titles.Romaji + } else { + title = titles.Japanese + } + + hash := md5.Sum([]byte(title)) + return fmt.Sprintf("%x", hash) +} + func generateBasicEpisodes(episodes []jikan.JikanAnimeEpisode) []types.AnimeSingleEpisode { var animeEpisodes []types.AnimeSingleEpisode for _, episode := range episodes { + titles := types.EpisodeTitles{ + English: episode.Title, + Japanese: episode.TitleJapanese, + Romaji: episode.TitleRomaji, + } + animeEpisodes = append(animeEpisodes, types.AnimeSingleEpisode{ - Titles: types.EpisodeTitles{ - English: episode.Title, - Japanese: episode.TitleJapanese, - Romaji: episode.TitleRomaji, - }, + ID: generateEpisodeID(titles), + Titles: titles, Aired: episode.Aired, Score: episode.Score, Filler: episode.Filler, @@ -34,7 +51,6 @@ func generateBasicEpisodes(episodes []jikan.JikanAnimeEpisode) []types.AnimeSing URL: episode.URL, Description: "No description available", ThumbnailURL: "", - // Stream field removed }) } return animeEpisodes diff --git a/types/anime.go b/types/anime.go index 7ab862e..b5bda0b 100644 --- a/types/anime.go +++ b/types/anime.go @@ -37,6 +37,7 @@ type EpisodeTitles struct { // AnimeSingleEpisode contains information about a single anime episode type AnimeSingleEpisode struct { + ID string `json:"id"` Titles EpisodeTitles `json:"titles"` Description string `json:"description"` Aired string `json:"aired"` |
