aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPriyansh <[email protected]>2025-08-25 11:40:19 +0530
committerPriyansh <[email protected]>2025-08-25 11:40:19 +0530
commita4d2b4c3d7b043b496ee2ecb51967dbd9785a1ef (patch)
tree157b54d7a1bfb613a34e1e3403c87270a7d8e515
parentc336a3bab91186be1b998bba67e57d0797bd87ba (diff)
downloadmetachan-a4d2b4c3d7b043b496ee2ecb51967dbd9785a1ef.tar.xz
metachan-a4d2b4c3d7b043b496ee2ecb51967dbd9785a1ef.zip
updated routes, added episode ids to each episode
-rw-r--r--controllers/anime.go25
-rw-r--r--database/anime_cache.go2
-rw-r--r--database/migrate.go14
-rw-r--r--entities/anime.go1
-rw-r--r--router/router.go5
-rw-r--r--services/anime/helpers.go30
-rw-r--r--types/anime.go1
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"`