Index: Slim/Schema.pm =================================================================== --- Slim/Schema.pm (revision 21488) +++ Slim/Schema.pm (working copy) @@ -87,6 +87,11 @@ 'LOCAL_RATING_STORAGE' => \&_defaultRatingImplementation, ); +my $trackPostScanners = {}; +my $contributorPostScanners = {}; +my $albumPostScanners = {}; +my $genrePostScanners = {}; + =head1 METHODS All methods below are class methods on L<Slim::Schema>. Please see @@ -1539,10 +1544,115 @@ return $ratingImplementations{$impl}->( $track, $rating ); } +sub registerTrackPostScanner { + my ($self, $name, $args) = @_; + + if(defined($args) && ref($args) eq 'HASH') { + logger('scan.import')->info("Registered track post scanner: $name"); + $trackPostScanners->{$name} = $args; + }elsif(!defined($args)) { + logger('scan.import')->info("Unregistered track post scanner: $name"); + delete $trackPostScanners->{$name}; + }else { + logger('scan.import')->error("Argument must be a hash"); + } +} + +sub executeTrackPostScanners { + my ($self, $track) = @_; + + $self->_executePostScanners($track,$trackPostScanners); +} + +sub registerGenrePostScanner { + my ($self, $name, $args) = @_; + + if(defined($args) && ref($args) eq 'HASH') { + logger('scan.import')->info("Registered genre post scanner: $name"); + $genrePostScanners->{$name} = $args; + }elsif(!defined($args)) { + logger('scan.import')->info("Unregistered genre post scanner: $name"); + delete $genrePostScanners->{$name}; + }else { + logger('scan.import')->error("Argument must be a hash"); + } +} + +sub executeGenrePostScanners { + my ($self, $genre) = @_; + + $self->_executePostScanners($genre,$genrePostScanners); +} + +sub registerContributorPostScanner { + my ($self, $name, $args) = @_; + + if(defined($args) && ref($args) eq 'HASH') { + logger('scan.import')->info("Registered contributor post scanner: $name"); + $contributorPostScanners->{$name} = $args; + }elsif(!defined($args)) { + logger('scan.import')->info("Unregistered contributor post scanner: $name"); + delete $contributorPostScanners->{$name}; + }else { + logger('scan.import')->error("Argument must be a hash"); + } +} + +sub executeContributorPostScanners { + my ($self, $contributor) = @_; + + $self->_executePostScanners($contributor,$contributorPostScanners); +} + +sub registerAlbumPostScanner { + my ($self, $name, $args) = @_; + + if(defined($args) && ref($args) eq 'HASH') { + logger('scan.import')->info("Registered album post scanner: $name"); + $albumPostScanners->{$name} = $args; + }elsif(!defined($args)) { + logger('scan.import')->info("Unregistered album post scanner: $name"); + delete $albumPostScanners->{$name}; + }else { + logger('scan.import')->error("Argument must be a hash"); + } +} + +sub executeAlbumPostScanners { + my ($self, $album) = @_; + + $self->_executePostScanners($album,$albumPostScanners); +} + # # Private methods: # +sub _executePostScanners { + my ($self, $obj, $scanners) = @_; + + my @sortedScanners = sort { + if(exists $scanners->{$a}->{'weight'} && exists $scanners->{$b}->{'weight'}) { + return $scanners->{$a}->{'weight'} <=> $scanners->{$b}->{'weight'}; + }elsif(exists $scanners->{$a}->{'weight'}) { + return $scanners->{$a}->{'weight'} <=> 50; + }elsif(exists $scanners->{$b}->{'weight'}) { + return 50 <=> $scanners->{$b}->{'weight'}; + }else { + return 0; + } + } keys %$scanners; + + for my $key (@sortedScanners) { + if(defined($scanners->{$key}->{'func'})) { + eval {$scanners->{$key}->{'func'}->($obj) }; + if ($@) { + logger('scan.import')->warn("Error when scanning ".ref($obj)." with $key scanner: $@"); + } + } + } +} + sub _defaultRatingImplementation { my ( $track, $rating ) = @_; @@ -2487,9 +2597,12 @@ } } + $self->executeAlbumPostScanners($albumObj); $albumObj->update; } + $self->executeTrackPostScanners($track); + # Save any changes - such as album. $track->update; Index: Slim/Schema/Contributor.pm =================================================================== --- Slim/Schema/Contributor.pm (revision 21488) +++ Slim/Schema/Contributor.pm (working copy) @@ -151,6 +151,8 @@ }); push @contributors, $contributorObj; + + Slim::Schema->executeContributorPostScanners($contributorObj); } return wantarray ? @contributors : $contributors[0]; Index: Slim/Schema/Genre.pm =================================================================== --- Slim/Schema/Genre.pm (revision 21488) +++ Slim/Schema/Genre.pm (working copy) @@ -86,6 +86,8 @@ }); push @genres, $genreObj; + + Slim::Schema->executeGenrePostScanners($genreObj); } return wantarray ? @genres : $genres[0];