Index: SQL/SQLite/schema_1_up.sql =================================================================== --- SQL/SQLite/schema_1_up.sql (revision 26430) +++ SQL/SQLite/schema_1_up.sql (working copy) @@ -40,6 +40,7 @@ titlesearch text, customsearch text, album int(10), + primary_artist int(10), -- lazy cache tracknum int(10), content_type varchar(255), timestamp int(10), Index: Slim/Schema/Track.pm =================================================================== --- Slim/Schema/Track.pm (revision 26430) +++ Slim/Schema/Track.pm (working copy) @@ -15,9 +15,10 @@ use Slim::Utils::Prefs; my $prefs = preferences('server'); +my $log = logger('database.info'); our @allColumns = (qw( - id url content_type title titlesort titlesearch album tracknum + id url content_type title titlesort titlesearch album primary_artist tracknum timestamp filesize disc remote audio audio_size audio_offset year secs cover vbr_scale bitrate samplerate samplesize channels block_alignment endian bpm tagversion drm musicmagic_mixable @@ -53,6 +54,7 @@ if ( !main::SLIM_SERVICE ) { # setup our relationships $class->belongs_to('album' => 'Slim::Schema::Album'); + $class->might_have('primary_artist' => 'Slim::Schema::Contributor'); $class->might_have('persistent' => 'Slim::Schema::TrackPersistent' => 'track'); $class->has_many('genreTracks' => 'Slim::Schema::GenreTrack' => 'track'); @@ -128,14 +130,39 @@ return undef; } -sub artist { +sub artistid { my $self = shift; return if main::SLIM_SERVICE; + + my $id = undef; + + if (defined ($id = $self->get_column('primary_artist'))) { + main::INFOLOG && $log->info("Using cached primary artist"); + return wantarray ? ($id, $self->primary_artist) : $id; + } # Bug 3824 - check for both types, in the case that an ALBUMARTIST was set. - return $self->contributorsOfType('ARTIST')->single || - $self->contributorsOfType('TRACKARTIST')->single; + my $artist = $self->contributorsOfType('ARTIST')->single || + $self->contributorsOfType('TRACKARTIST')->single; + + if ($artist) { + main::INFOLOG && $log->info("Caching primary artist"); + $self->set_column('primary_artist', $id = $artist->id); + $self->update; + } + + return wantarray ? ($id, $artist) : $id; +} + +sub artist { + my $self = shift; + + return if main::SLIM_SERVICE; + + my ($id, $artist) = $self->artistid; + + return $artist; } sub artists {