diff --git a/persistence/genre_repository.go b/persistence/genre_repository.go index 3b4eb61dc..4ea6f67cf 100644 --- a/persistence/genre_repository.go +++ b/persistence/genre_repository.go @@ -3,6 +3,8 @@ package persistence import ( "context" + "github.com/navidrome/navidrome/log" + "github.com/deluan/rest" . "github.com/Masterminds/squirrel" @@ -68,5 +70,24 @@ func (r *genreRepository) NewInstance() interface{} { return &model.Genre{} } +func (r *genreRepository) purgeEmpty() error { + del := Delete(r.tableName).Where(`id in ( +select genre.id from genre +left join album_genres ag on genre.id = ag.genre_id +left join artist_genres a on genre.id = a.genre_id +left join media_file_genres mfg on genre.id = mfg.genre_id +where ag.genre_id is null +and a.genre_id is null +and mfg.genre_id is null +)`) + c, err := r.executeSQL(del) + if err == nil { + if c > 0 { + log.Debug(r.ctx, "Purged unused genres", "totalDeleted", c) + } + } + return err +} + var _ model.GenreRepository = (*genreRepository)(nil) var _ model.ResourceRepository = (*genreRepository)(nil) diff --git a/persistence/persistence.go b/persistence/persistence.go index 8ad96896a..953fbd878 100644 --- a/persistence/persistence.go +++ b/persistence/persistence.go @@ -165,6 +165,11 @@ func (s *SQLStore) GC(ctx context.Context, rootFolder string) error { if err != nil { log.Error(ctx, "Error tidying up playlists", err) } + err = s.Genre(ctx).(*genreRepository).purgeEmpty() + if err != nil { + log.Error(ctx, "Error removing unused genres", err) + return err + } return err }