diff --git a/Changelog8.html b/Changelog8.html
index 49604bb2f6a..0a8575fac57 100644
--- a/Changelog8.html
+++ b/Changelog8.html
@@ -42,6 +42,7 @@
Version 8.3.0
#668 - Podcasts: Pre-caching image and more-info data can bring the server to a crawl #668 (thanks mw9!)
Fix image transformation if a cover requested using /current/cover is pointing to a local file.
#700/#718 - High CPU load during playback of certain radio streams (thanks philippe44!)
+ #704 - changed artist names remain in database after quick rescan
#749 - fix mp4 streams where audio offset comes from STCO (thanks philippe44 && bpa!)
diff --git a/Slim/Schema.pm b/Slim/Schema.pm
index 864a0391503..8566e568d59 100644
--- a/Slim/Schema.pm
+++ b/Slim/Schema.pm
@@ -2871,11 +2871,16 @@ sub _postCheckAttributes {
# Walk through the valid contributor roles, adding them to the database.
my $contributors = $self->_mergeAndCreateContributors($attributes, $isCompilation, $create);
+ my $artist = $contributors->{ARTIST} || $contributors->{TRACKARTIST};
+ if ($artist) {
+ $cols{primary_artist} = $artist->[0];
+ }
+
### Update Album row
my $albumId = $self->_createOrUpdateAlbum($attributes,
\%cols, # trackColumns
$isCompilation,
- $contributors->{'ALBUMARTIST'}->[0] || $contributors->{'ARTIST'}->[0], # primary contributor-id
+ $artist->[0], # primary contributor-id
defined $contributors->{'ALBUMARTIST'}->[0] ? 1 : 0, # hasAlbumArtist
$create, # create
$track, # Track
@@ -3000,6 +3005,14 @@ sub _createContributorRoleRelationships {
$sth_delete_tracks->execute($trackId);
# Using native DBI here to improve performance during scanning
+ if ( my $artist = $contributors->{ARTIST} || $contributors->{TRACKARTIST} ) {
+ my $sth_track_artist = $self->dbh->prepare_cached( qq(
+ UPDATE tracks
+ SET primary_artist = ?
+ WHERE id = ?
+ ) );
+ $sth_track_artist->execute( $artist->[0], $trackId );
+ }
my $sth_track = $self->dbh->prepare_cached( qq{
REPLACE INTO contributor_track
diff --git a/Slim/Schema/Contributor.pm b/Slim/Schema/Contributor.pm
index 45df1014ebe..c5c3cd6c56e 100644
--- a/Slim/Schema/Contributor.pm
+++ b/Slim/Schema/Contributor.pm
@@ -221,19 +221,24 @@ sub isInLibrary {
# Rescan list of contributors, this simply means to make sure at least 1 track
# from this contributor still exists in the database. If not, delete the contributor.
sub rescan {
- my ( $class, @ids ) = @_;
+ my ( $class, $ids, $albumId ) = @_;
my $log = logger('scan.scanner');
my $dbh = Slim::Schema->dbh;
- for my $id ( @ids ) {
- my $sth = $dbh->prepare_cached( qq{
- SELECT COUNT(*) FROM contributor_track WHERE contributor = ?
- } );
- $sth->execute($id);
- my ($count) = $sth->fetchrow_array;
- $sth->finish;
+ my $contributorSth = $dbh->prepare_cached( qq{
+ SELECT COUNT(*) FROM contributor_track WHERE contributor = ?
+ } );
+
+ my $albumSth = $dbh->prepare_cached( qq{
+ SELECT COUNT(1) FROM tracks WHERE album = ? AND primary_artist = ?
+ } );
+
+ for my $id ( @$ids ) {
+ $contributorSth->execute($id);
+ my ($count) = $contributorSth->fetchrow_array;
+ $contributorSth->finish;
if ( !$count ) {
main::DEBUGLOG && $log->is_debug && $log->debug("Removing unused contributor: $id");
@@ -241,6 +246,16 @@ sub rescan {
# This will cascade within the database to contributor_album and contributor_track
$dbh->do( "DELETE FROM contributors WHERE id = ?", undef, $id );
}
+ # contributor->album relations aren't removed automatically when the last track with this primary_artist disappears
+ elsif ( $albumId ) {
+ $albumSth->execute($albumId, $id);
+ ($count) = $albumSth->fetchrow_array;
+ $albumSth->finish;
+
+ if ( !$count ) {
+ $dbh->do( "DELETE FROM contributor_album WHERE role = 1 AND album = ? AND contributor = ?", undef, $albumId, $id );
+ }
+ }
}
}
diff --git a/Slim/Utils/Scanner/Local.pm b/Slim/Utils/Scanner/Local.pm
index 22e61b33f53..d1154fceda1 100644
--- a/Slim/Utils/Scanner/Local.pm
+++ b/Slim/Utils/Scanner/Local.pm
@@ -682,7 +682,7 @@ sub deleted {
# Tell Contributors to rescan, if no other tracks left, remove contributor.
# This will also remove entries from contributor_track and contributor_album
for ( @$contribs ) {
- Slim::Schema::Contributor->rescan( $_->[0] );
+ Slim::Schema::Contributor->rescan( [$_->[0]], $album && $album->id );
}
@@ -801,7 +801,7 @@ sub deleted {
Slim::Schema::Album->rescan( @albums );
# 3. Rescan contributors created from the cue sheet
- Slim::Schema::Contributor->rescan( map { $_->{contributor} } @{$contribs} );
+ Slim::Schema::Contributor->rescan( [map { $_->{contributor} } @{$contribs}] );
# 4. Rescan genres created from the cue sheet
Slim::Schema::Genre->rescan( map { $_->{genre} } @{$genres} );
@@ -1001,7 +1001,7 @@ sub changed {
# Tell Contributors to rescan, if no other tracks left, remove contributor.
# This will also remove entries from contributor_track and contributor_album
for my $contrib ( @{ $orig->{contribs} } ) {
- Slim::Schema::Contributor->rescan( $contrib->{contributor} );
+ Slim::Schema::Contributor->rescan( [$contrib->{contributor}], $origTrack->{album_id} );
}
my $album = $track->album;