aboutsummaryrefslogtreecommitdiff
path: root/database
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-01-16 12:03:10 +0530
committerBobby <[email protected]>2026-01-16 12:03:10 +0530
commite72166bbe9669abe81e093ab398af066341c4ad7 (patch)
treedf7d377a4be56928789a9c028d6bfde6d1e43f12 /database
parentd881e1234f1d42acd0b598fe829fa56ab09cea53 (diff)
downloadmetachan-e72166bbe9669abe81e093ab398af066341c4ad7.tar.xz
metachan-e72166bbe9669abe81e093ab398af066341c4ad7.zip
Enhance anime data retrieval and storage by adding comprehensive preload and save functionality for images, logos, covers, scores, airing status, broadcast info, genres, producers, studios, licensors, and seasons in GetAnimeByMALID and SaveAnimeToDatabase functions.
Diffstat (limited to 'database')
-rw-r--r--database/anime.go387
1 files changed, 386 insertions, 1 deletions
diff --git a/database/anime.go b/database/anime.go
index e210b62..e2da1f9 100644
--- a/database/anime.go
+++ b/database/anime.go
@@ -12,12 +12,30 @@ import (
func GetAnimeByMALID(malID int) (*types.Anime, error) {
var anime entities.Anime
- result := DB.Preload("Episodes").
+ result := DB.Preload("Images").
+ Preload("Logos").
+ Preload("Covers").
+ Preload("Scores").
+ Preload("AiringStatus").
+ Preload("AiringStatus.From").
+ Preload("AiringStatus.To").
+ Preload("Broadcast").
+ Preload("Genres").
+ Preload("Producers").
+ Preload("Studios").
+ Preload("Licensors").
+ Preload("Episodes").
Preload("Episodes.Titles").
Preload("Characters").
Preload("Characters.VoiceActors").
Preload("AiringSchedule").
Preload("NextAiringEpisode").
+ Preload("Seasons").
+ Preload("Seasons.Images").
+ Preload("Seasons.Scores").
+ Preload("Seasons.AiringStatus").
+ Preload("Seasons.AiringStatus.From").
+ Preload("Seasons.AiringStatus.To").
Where("mal_id = ?", malID).First(&anime)
if result.Error != nil {
@@ -74,6 +92,178 @@ func SaveAnimeToDatabase(animeData *types.Anime) error {
LastUpdated: time.Now(),
}
+ // Save images
+ if animeData.Images.Small != "" || animeData.Images.Large != "" || animeData.Images.Original != "" {
+ anime.Images = &entities.AnimeImages{
+ Small: animeData.Images.Small,
+ Large: animeData.Images.Large,
+ Original: animeData.Images.Original,
+ }
+ }
+
+ // Save logos
+ if animeData.Logos.Small != "" || animeData.Logos.Medium != "" || animeData.Logos.Large != "" {
+ anime.Logos = &entities.AnimeLogos{
+ Small: animeData.Logos.Small,
+ Medium: animeData.Logos.Medium,
+ Large: animeData.Logos.Large,
+ XLarge: animeData.Logos.XLarge,
+ Original: animeData.Logos.Original,
+ }
+ }
+
+ // Save covers
+ if animeData.Covers.Small != "" || animeData.Covers.Large != "" || animeData.Covers.Original != "" {
+ anime.Covers = &entities.AnimeCovers{
+ Small: animeData.Covers.Small,
+ Large: animeData.Covers.Large,
+ Original: animeData.Covers.Original,
+ }
+ }
+
+ // Save scores
+ if animeData.Scores.Score > 0 || animeData.Scores.ScoredBy > 0 {
+ anime.Scores = &entities.AnimeScores{
+ Score: animeData.Scores.Score,
+ ScoredBy: animeData.Scores.ScoredBy,
+ Rank: animeData.Scores.Rank,
+ Popularity: animeData.Scores.Popularity,
+ Members: animeData.Scores.Members,
+ Favorites: animeData.Scores.Favorites,
+ }
+ }
+
+ // Save airing status
+ if animeData.AiringStatus.String != "" {
+ airingStatus := &entities.AiringStatus{
+ String: animeData.AiringStatus.String,
+ }
+
+ if animeData.AiringStatus.From.Year > 0 {
+ airingStatus.From = &entities.AiringStatusDates{
+ Day: animeData.AiringStatus.From.Day,
+ Month: animeData.AiringStatus.From.Month,
+ Year: animeData.AiringStatus.From.Year,
+ String: animeData.AiringStatus.From.String,
+ }
+ }
+
+ if animeData.AiringStatus.To.Year > 0 {
+ airingStatus.To = &entities.AiringStatusDates{
+ Day: animeData.AiringStatus.To.Day,
+ Month: animeData.AiringStatus.To.Month,
+ Year: animeData.AiringStatus.To.Year,
+ String: animeData.AiringStatus.To.String,
+ }
+ }
+
+ anime.AiringStatus = airingStatus
+ }
+
+ // Save broadcast info
+ if animeData.Broadcast.String != "" {
+ anime.Broadcast = &entities.AnimeBroadcast{
+ Day: animeData.Broadcast.Day,
+ Time: animeData.Broadcast.Time,
+ Timezone: animeData.Broadcast.Timezone,
+ String: animeData.Broadcast.String,
+ }
+ }
+
+ // Save genres
+ if len(animeData.Genres) > 0 {
+ anime.Genres = make([]entities.AnimeGenre, len(animeData.Genres))
+ for i, genre := range animeData.Genres {
+ anime.Genres[i] = entities.AnimeGenre{
+ Name: genre.Name,
+ GenreID: genre.GenreID,
+ URL: genre.URL,
+ }
+ }
+ }
+
+ // Save producers
+ if len(animeData.Producers) > 0 {
+ anime.Producers = make([]entities.AnimeProducer, len(animeData.Producers))
+ for i, producer := range animeData.Producers {
+ anime.Producers[i] = entities.AnimeProducer{
+ Name: producer.Name,
+ ProducerID: producer.ProducerID,
+ URL: producer.URL,
+ }
+ }
+ }
+
+ // Save studios
+ if len(animeData.Studios) > 0 {
+ anime.Studios = make([]entities.AnimeStudio, len(animeData.Studios))
+ for i, studio := range animeData.Studios {
+ anime.Studios[i] = entities.AnimeStudio{
+ Name: studio.Name,
+ StudioID: studio.StudioID,
+ URL: studio.URL,
+ }
+ }
+ }
+
+ // Save licensors
+ if len(animeData.Licensors) > 0 {
+ anime.Licensors = make([]entities.AnimeLicensor, len(animeData.Licensors))
+ for i, licensor := range animeData.Licensors {
+ anime.Licensors[i] = entities.AnimeLicensor{
+ Name: licensor.Name,
+ ProducerID: licensor.ProducerID,
+ URL: licensor.URL,
+ }
+ }
+ }
+
+ // Save seasons
+ if len(animeData.Seasons) > 0 {
+ anime.Seasons = make([]entities.AnimeSeason, len(animeData.Seasons))
+ for i, season := range animeData.Seasons {
+ animeSeason := entities.AnimeSeason{
+ MALID: season.MALID,
+ TitleRomaji: season.Titles.Romaji,
+ TitleEnglish: season.Titles.English,
+ TitleJapanese: season.Titles.Japanese,
+ TitleSynonyms: strings.Join(season.Titles.Synonyms, ","),
+ Synopsis: season.Synopsis,
+ Type: string(season.Type),
+ Source: season.Source,
+ Airing: season.Airing,
+ Status: season.Status,
+ Duration: season.Duration,
+ Season: season.Season,
+ Year: season.Year,
+ Current: season.Current,
+ }
+
+ // Save season images
+ if season.Images.Small != "" || season.Images.Large != "" {
+ animeSeason.Images = &entities.AnimeImages{
+ Small: season.Images.Small,
+ Large: season.Images.Large,
+ Original: season.Images.Original,
+ }
+ }
+
+ // Save season scores
+ if season.Scores.Score > 0 {
+ animeSeason.Scores = &entities.AnimeScores{
+ Score: season.Scores.Score,
+ ScoredBy: season.Scores.ScoredBy,
+ Rank: season.Scores.Rank,
+ Popularity: season.Scores.Popularity,
+ Members: season.Scores.Members,
+ Favorites: season.Scores.Favorites,
+ }
+ }
+
+ anime.Seasons[i] = animeSeason
+ }
+ }
+
if len(animeData.Episodes.Episodes) > 0 {
anime.Episodes = make([]entities.AnimeSingleEpisode, len(animeData.Episodes.Episodes))
for i, episode := range animeData.Episodes.Episodes {
@@ -193,6 +383,201 @@ func ConvertToTypesAnime(anime *entities.Anime) *types.Anime {
},
}
+ // Convert images
+ if anime.Images != nil {
+ result.Images = types.AnimeImages{
+ Small: anime.Images.Small,
+ Large: anime.Images.Large,
+ Original: anime.Images.Original,
+ }
+ }
+
+ // Convert logos
+ if anime.Logos != nil {
+ result.Logos = types.AnimeLogos{
+ Small: anime.Logos.Small,
+ Medium: anime.Logos.Medium,
+ Large: anime.Logos.Large,
+ XLarge: anime.Logos.XLarge,
+ Original: anime.Logos.Original,
+ }
+ }
+
+ // Convert covers
+ if anime.Covers != nil {
+ result.Covers = types.AnimeImages{
+ Small: anime.Covers.Small,
+ Large: anime.Covers.Large,
+ Original: anime.Covers.Original,
+ }
+ }
+
+ // Convert scores
+ if anime.Scores != nil {
+ result.Scores = types.AnimeScores{
+ Score: anime.Scores.Score,
+ ScoredBy: anime.Scores.ScoredBy,
+ Rank: anime.Scores.Rank,
+ Popularity: anime.Scores.Popularity,
+ Members: anime.Scores.Members,
+ Favorites: anime.Scores.Favorites,
+ }
+ }
+
+ // Convert airing status
+ if anime.AiringStatus != nil {
+ result.AiringStatus = types.AiringStatus{
+ String: anime.AiringStatus.String,
+ }
+
+ if anime.AiringStatus.From != nil {
+ result.AiringStatus.From = types.AiringStatusDates{
+ Day: anime.AiringStatus.From.Day,
+ Month: anime.AiringStatus.From.Month,
+ Year: anime.AiringStatus.From.Year,
+ String: anime.AiringStatus.From.String,
+ }
+ }
+
+ if anime.AiringStatus.To != nil {
+ result.AiringStatus.To = types.AiringStatusDates{
+ Day: anime.AiringStatus.To.Day,
+ Month: anime.AiringStatus.To.Month,
+ Year: anime.AiringStatus.To.Year,
+ String: anime.AiringStatus.To.String,
+ }
+ }
+ }
+
+ // Convert broadcast
+ if anime.Broadcast != nil {
+ result.Broadcast = types.AnimeBroadcast{
+ Day: anime.Broadcast.Day,
+ Time: anime.Broadcast.Time,
+ Timezone: anime.Broadcast.Timezone,
+ String: anime.Broadcast.String,
+ }
+ }
+
+ // Convert genres
+ if len(anime.Genres) > 0 {
+ result.Genres = make([]types.AnimeGenres, len(anime.Genres))
+ for i, genre := range anime.Genres {
+ result.Genres[i] = types.AnimeGenres{
+ Name: genre.Name,
+ GenreID: genre.GenreID,
+ URL: genre.URL,
+ }
+ }
+ }
+
+ // Convert producers
+ if len(anime.Producers) > 0 {
+ result.Producers = make([]types.AnimeProducer, len(anime.Producers))
+ for i, producer := range anime.Producers {
+ result.Producers[i] = types.AnimeProducer{
+ Name: producer.Name,
+ ProducerID: producer.ProducerID,
+ URL: producer.URL,
+ }
+ }
+ }
+
+ // Convert studios
+ if len(anime.Studios) > 0 {
+ result.Studios = make([]types.AnimeStudio, len(anime.Studios))
+ for i, studio := range anime.Studios {
+ result.Studios[i] = types.AnimeStudio{
+ Name: studio.Name,
+ StudioID: studio.StudioID,
+ URL: studio.URL,
+ }
+ }
+ }
+
+ // Convert licensors
+ if len(anime.Licensors) > 0 {
+ result.Licensors = make([]types.AnimeLicensor, len(anime.Licensors))
+ for i, licensor := range anime.Licensors {
+ result.Licensors[i] = types.AnimeLicensor{
+ Name: licensor.Name,
+ ProducerID: licensor.ProducerID,
+ URL: licensor.URL,
+ }
+ }
+ }
+
+ // Convert seasons
+ if len(anime.Seasons) > 0 {
+ result.Seasons = make([]types.AnimeSeason, len(anime.Seasons))
+ for i, season := range anime.Seasons {
+ result.Seasons[i] = types.AnimeSeason{
+ MALID: season.MALID,
+ Titles: types.AnimeTitles{
+ Romaji: season.TitleRomaji,
+ English: season.TitleEnglish,
+ Japanese: season.TitleJapanese,
+ Synonyms: strings.Split(season.TitleSynonyms, ","),
+ },
+ Synopsis: season.Synopsis,
+ Type: types.AniSyncType(season.Type),
+ Source: season.Source,
+ Airing: season.Airing,
+ Status: season.Status,
+ Duration: season.Duration,
+ Season: season.Season,
+ Year: season.Year,
+ Current: season.Current,
+ }
+
+ // Convert season images
+ if season.Images != nil {
+ result.Seasons[i].Images = types.AnimeImages{
+ Small: season.Images.Small,
+ Large: season.Images.Large,
+ Original: season.Images.Original,
+ }
+ }
+
+ // Convert season scores
+ if season.Scores != nil {
+ result.Seasons[i].Scores = types.AnimeScores{
+ Score: season.Scores.Score,
+ ScoredBy: season.Scores.ScoredBy,
+ Rank: season.Scores.Rank,
+ Popularity: season.Scores.Popularity,
+ Members: season.Scores.Members,
+ Favorites: season.Scores.Favorites,
+ }
+ }
+
+ // Convert season airing status
+ if season.AiringStatus != nil {
+ result.Seasons[i].AiringStatus = types.AiringStatus{
+ String: season.AiringStatus.String,
+ }
+
+ if season.AiringStatus.From != nil {
+ result.Seasons[i].AiringStatus.From = types.AiringStatusDates{
+ Day: season.AiringStatus.From.Day,
+ Month: season.AiringStatus.From.Month,
+ Year: season.AiringStatus.From.Year,
+ String: season.AiringStatus.From.String,
+ }
+ }
+
+ if season.AiringStatus.To != nil {
+ result.Seasons[i].AiringStatus.To = types.AiringStatusDates{
+ Day: season.AiringStatus.To.Day,
+ Month: season.AiringStatus.To.Month,
+ Year: season.AiringStatus.To.Year,
+ String: season.AiringStatus.To.String,
+ }
+ }
+ }
+ }
+ }
+
if len(anime.Episodes) > 0 {
result.Episodes.Episodes = make([]types.AnimeSingleEpisode, len(anime.Episodes))
for i, episode := range anime.Episodes {