From 54d13d2022385869318c2ab912dadc67c52dac66 Mon Sep 17 00:00:00 2001
From: Deluan <deluan@deluan.com>
Date: Fri, 17 Jan 2020 23:28:11 -0500
Subject: [PATCH] Purge empty albums/artists

---
 model/album.go                   |  1 +
 model/artist.go                  |  1 +
 persistence/album_repository.go  |  6 ++++++
 persistence/artist_repository.go |  6 ++++++
 scanner/tag_scanner.go           | 10 ++++++++++
 5 files changed, 24 insertions(+)

diff --git a/model/album.go b/model/album.go
index 059519457..b452caa48 100644
--- a/model/album.go
+++ b/model/album.go
@@ -38,4 +38,5 @@ type AlbumRepository interface {
 	GetStarred(...QueryOptions) (Albums, error)
 	Search(q string, offset int, size int) (Albums, error)
 	Refresh(ids ...string) error
+	PurgeEmpty() error
 }
diff --git a/model/artist.go b/model/artist.go
index 59dea872a..a2af148ba 100644
--- a/model/artist.go
+++ b/model/artist.go
@@ -22,4 +22,5 @@ type ArtistRepository interface {
 	Search(q string, offset int, size int) (Artists, error)
 	Refresh(ids ...string) error
 	GetIndex() (ArtistIndexes, error)
+	PurgeEmpty() error
 }
diff --git a/persistence/album_repository.go b/persistence/album_repository.go
index c5d7a2068..de046da6d 100644
--- a/persistence/album_repository.go
+++ b/persistence/album_repository.go
@@ -157,6 +157,12 @@ func (r *albumRepository) PurgeInactive(activeList model.Albums) error {
 	})
 }
 
+func (r *albumRepository) PurgeEmpty() error {
+	o := Db()
+	_, err := o.Raw("delete from album where id not in (select distinct(album_id) from media_file)").Exec()
+	return err
+}
+
 func (r *albumRepository) GetStarred(options ...model.QueryOptions) (model.Albums, error) {
 	var starred []album
 	_, err := r.newQuery(Db(), options...).Filter("starred", true).All(&starred)
diff --git a/persistence/artist_repository.go b/persistence/artist_repository.go
index b46122cd3..e0f3bb795 100644
--- a/persistence/artist_repository.go
+++ b/persistence/artist_repository.go
@@ -160,6 +160,12 @@ func (r *artistRepository) PurgeInactive(activeList model.Artists) error {
 	})
 }
 
+func (r *artistRepository) PurgeEmpty() error {
+	o := Db()
+	_, err := o.Raw("delete from artist where id not in (select distinct(artist_id) from album)").Exec()
+	return err
+}
+
 func (r *artistRepository) Search(q string, offset int, size int) (model.Artists, error) {
 	if len(q) <= 2 {
 		return nil, nil
diff --git a/scanner/tag_scanner.go b/scanner/tag_scanner.go
index 46c76898f..c28a918df 100644
--- a/scanner/tag_scanner.go
+++ b/scanner/tag_scanner.go
@@ -80,6 +80,16 @@ func (s *TagScanner) Scan(ctx context.Context, lastModifiedSince time.Time) erro
 		return err
 	}
 
+	err = s.repos.album.PurgeEmpty()
+	if err != nil {
+		return err
+	}
+
+	err = s.repos.artist.PurgeEmpty()
+	if err != nil {
+		return err
+	}
+
 	return nil
 }