diff --git a/server/db/migrations.go b/server/db/migrations.go index 4c267c0..1f2f680 100644 --- a/server/db/migrations.go +++ b/server/db/migrations.go @@ -14,8 +14,11 @@ func migrateInitSchema() gormigrate.Migration { ID: "202002192100", Migrate: func(tx *gorm.DB) error { return tx.AutoMigrate( - Artist{}, + Genre{}, + TrackGenre{}, + AlbumGenre{}, Track{}, + Artist{}, User{}, Setting{}, Play{}, @@ -170,6 +173,10 @@ func migrateMultiGenre() gormigrate.Migration { TrackGenre{}, AlbumGenre{}, ) + if err := step.Error; err != nil { + return fmt.Errorf("step auto migrate: %w", err) + } + var genreCount int tx. Model(Genre{}). @@ -178,9 +185,6 @@ func migrateMultiGenre() gormigrate.Migration { return nil } - if err := step.Error; err != nil { - return fmt.Errorf("step auto migrate: %w", err) - } step = tx.Exec(` INSERT INTO track_genres (track_id, genre_id) SELECT id, tag_genre_id @@ -188,10 +192,10 @@ func migrateMultiGenre() gormigrate.Migration { WHERE tag_genre_id IS NOT NULL; UPDATE tracks SET tag_genre_id=NULL; `) - if err := step.Error; err != nil { return fmt.Errorf("step migrate track genres: %w", err) } + step = tx.Exec(` INSERT INTO album_genres (album_id, genre_id) SELECT id, tag_genre_id diff --git a/server/db/model.go b/server/db/model.go index 3473b15..3948dbc 100644 --- a/server/db/model.go +++ b/server/db/model.go @@ -126,7 +126,7 @@ func (t *Track) RelPath() string { } func (t *Track) GenreStrings() []string { - var strs []string + strs := make([]string, 0, len(t.Genres)) for _, genre := range t.Genres { strs = append(strs, genre.Name) } @@ -197,7 +197,7 @@ func (a *Album) IndexRightPath() string { } func (a *Album) GenreStrings() []string { - var strs []string + strs := make([]string, 0, len(a.Genres)) for _, genre := range a.Genres { strs = append(strs, genre.Name) } diff --git a/server/scanner/scanner.go b/server/scanner/scanner.go index 66c553b..7bb2d59 100644 --- a/server/scanner/scanner.go +++ b/server/scanner/scanner.go @@ -145,6 +145,28 @@ func (s *Scanner) cleanArtists() (int, error) { return int(q.RowsAffected), q.Error } +func (s *Scanner) cleanGenres() (int, error) { + subTrack := s.db. + Select("genres.id"). + Model(&db.Genre{}). + Joins("JOIN track_genres ON track_genres.genre_id=genres.id"). + Joins("LEFT JOIN tracks ON tracks.id=track_genres.track_id"). + Where("tracks.id IS NULL"). + SubQuery() + subAlbum := s.db. + Select("genres.id"). + Model(&db.Genre{}). + Joins("JOIN album_genres ON album_genres.genre_id=genres.id"). + Joins("LEFT JOIN albums ON albums.id=album_genres.album_id"). + Where("albums.id IS NULL"). + SubQuery() + q := s.db. + Where("genres.id IN ?", subTrack). + Or("genres.id IN ?", subAlbum). + Delete(&db.Genre{}) + return int(q.RowsAffected), q.Error +} + // ## begin entries // ## begin entries // ## begin entries @@ -199,6 +221,7 @@ func (s *Scanner) Start(opts ScanOptions) error { {name: "tracks", f: s.cleanTracks}, {name: "folders", f: s.cleanFolders}, {name: "artists", f: s.cleanArtists}, + {name: "genres", f: s.cleanGenres}, } for _, clean := range cleanFuncs { start = time.Now()