diff options
| author | Bobby <[email protected]> | 2026-01-20 18:13:48 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-01-20 18:13:48 +0530 |
| commit | ed36e0308c7cd3a6197c899cb16bfe65cc5194b4 (patch) | |
| tree | 4c0edabf651fc9b28648760920982c938fdf3d19 /database | |
| parent | df6cf3edcbb560e7615ad13d8daf4843507eb11e (diff) | |
| download | metachan-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.go | 54 |
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() |
