aboutsummaryrefslogtreecommitdiff
path: root/database
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-01-20 18:13:48 +0530
committerBobby <[email protected]>2026-01-20 18:13:48 +0530
commited36e0308c7cd3a6197c899cb16bfe65cc5194b4 (patch)
tree4c0edabf651fc9b28648760920982c938fdf3d19 /database
parentdf6cf3edcbb560e7615ad13d8daf4843507eb11e (diff)
downloadmetachan-ed36e0308c7cd3a6197c899cb16bfe65cc5194b4.tar.xz
metachan-ed36e0308c7cd3a6197c899cb16bfe65cc5194b4.zip
Implement genre synchronization from MAL via Jikan API and add genre retrieval endpoint
Diffstat (limited to 'database')
-rw-r--r--database/anime.go54
1 files changed, 50 insertions, 4 deletions
diff --git a/database/anime.go b/database/anime.go
index e2da1f9..5c06cad 100644
--- a/database/anime.go
+++ b/database/anime.go
@@ -170,15 +170,35 @@ func SaveAnimeToDatabase(animeData *types.Anime) error {
}
}
- // Save genres
+ // Save genres - link to master genres instead of creating duplicates
if len(animeData.Genres) > 0 {
- anime.Genres = make([]entities.AnimeGenre, len(animeData.Genres))
- for i, genre := range animeData.Genres {
- anime.Genres[i] = entities.AnimeGenre{
+ anime.Genres = make([]entities.AnimeGenre, 0, len(animeData.Genres))
+ for _, genre := range animeData.Genres {
+ // Check if master genre exists
+ var masterGenre entities.AnimeGenre
+ err := DB.Where("genre_id = ? AND anime_id = 0", genre.GenreID).First(&masterGenre).Error
+
+ // Create anime-specific genre link
+ animeGenre := entities.AnimeGenre{
Name: genre.Name,
GenreID: genre.GenreID,
URL: genre.URL,
+ Count: 0, // Count is only for master genres
}
+
+ // If master genre doesn't exist, the link will still work
+ // Genre sync will create the master genre later
+ if err != nil {
+ // Master genre doesn't exist yet, that's okay
+ animeGenre.Name = genre.Name
+ animeGenre.URL = genre.URL
+ } else {
+ // Use data from master genre for consistency
+ animeGenre.Name = masterGenre.Name
+ animeGenre.URL = masterGenre.URL
+ }
+
+ anime.Genres = append(anime.Genres, animeGenre)
}
}
@@ -720,6 +740,32 @@ func GetEpisodeStreaming(episodeID string, animeID uint) (*entities.EpisodeStrea
return &streaming, nil
}
+// GetAllGenres retrieves all master genres (AnimeID = 0) with MAL counts
+func GetAllGenres() ([]map[string]interface{}, error) {
+ var results []entities.AnimeGenre
+
+ err := DB.Where("anime_id = 0").
+ Order("count DESC, name ASC").
+ Find(&results).Error
+
+ if err != nil {
+ return nil, err
+ }
+
+ // Convert to map format
+ genres := make([]map[string]interface{}, len(results))
+ for i, r := range results {
+ genres[i] = map[string]interface{}{
+ "id": r.GenreID,
+ "name": r.Name,
+ "url": r.URL,
+ "count": r.Count,
+ }
+ }
+
+ return genres, nil
+}
+
// SaveEpisodeStreaming saves streaming data to the database
func SaveEpisodeStreaming(episodeID string, animeID uint, subSources, dubSources []types.AnimeStreamingSource) error {
tx := DB.Begin()