Index: Slim/Control/Request.pm =================================================================== --- Slim/Control/Request.pm (revision 21314) +++ Slim/Control/Request.pm (working copy) @@ -68,6 +68,9 @@ N playlists new N artwork + N rating + N rating ? + =head2 PLAYERS @@ -605,6 +608,8 @@ addDispatch(['wipecache'], [0, 0, 0, \&Slim::Control::Commands::wipecacheCommand]); addDispatch(['years', '_index', '_quantity'], [0, 1, 1, \&Slim::Control::Queries::yearsQuery]); addDispatch(['artwork', '_artworkid'], [0, 0, 0, \&Slim::Control::Queries::showArtwork]); + addDispatch(['rating', '_item', '?'], [0, 1, 0, \&Slim::Control::Queries::ratingQuery]); + addDispatch(['rating', '_item', '_rating'], [0, 0, 0, \&Slim::Control::Commands::ratingCommand]); # NOTIFICATIONS addDispatch(['client', 'disconnect'], [1, 0, 0, undef]); Index: Slim/Control/Queries.pm =================================================================== --- Slim/Control/Queries.pm (revision 21314) +++ Slim/Control/Queries.pm (working copy) @@ -2620,7 +2620,52 @@ $request->setStatusDone(); } +sub ratingQuery { + my $request = shift; + + $log->debug("Begin Function"); + # check this is the correct query + if ($request->isNotQuery([['rating']])) { + $request->setStatusBadDispatch(); + return; + } + + # get the parameters + my $item = $request->getParam('_item'); + + if (!defined $item) { + $request->setStatusBadParams(); + return; + } + + my $track = blessed($item); + if(!defined($track) && $item !~ /^\d+$/) { + my $url = Slim::Utils::Misc::fileURLFromPath($item); + if(defined($url)) { + $track = Slim::Schema->rs('Track')->objectForUrl({ 'url' => $url }); + } + $log->debug("Got track based on url") if defined $track; + }elsif(!defined($track)) { + $track = Slim::Schema->resultset('Track')->find($item); + $log->debug("Got track based on id") if defined $track; + }else { + $log->debug("Got track based on object") if defined $track; + } + + if(!defined($track) || $track->audio!=1) { + $log->info("Can't find track: $item") if !defined $track; + $log->info("Item is not a track: $item") if defined $track; + $request->setStatusBadParams(); + return; + } + + my $rating = Slim::Schema::rating($track); + $request->addResult("_rating", defined($rating)?$rating:0); + + $request->setStatusDone(); +} + sub readDirectoryQuery { my $request = shift; Index: Slim/Control/Commands.pm =================================================================== --- Slim/Control/Commands.pm (revision 21314) +++ Slim/Control/Commands.pm (working copy) @@ -2546,6 +2546,66 @@ $request->setStatusDone(); } +sub ratingCommand { + my $request = shift; + + $log->debug("Begin Function"); + + # check this is the correct command. + if ($request->isNotCommand([['rating']])) { + $request->setStatusBadDispatch(); + return; + } + + # get the parameters + my $item = $request->getParam('_item'); #p1 + my $rating = $request->getParam('_rating'); #p2 + + if (!defined $item) { + $request->setStatusBadParams(); + return; + } + + if (!defined $rating) { + $request->setStatusBadParams(); + return; + } + + $log->info("item: $item"); + $log->info("rating : $rating"); + + my $track = blessed($item); + if(!defined($track) && $item !~ /^\d+$/) { + my $url = Slim::Utils::Misc::fileURLFromPath($item); + if(defined($url)) { + $track = Slim::Schema->rs('Track')->objectForUrl({ 'url' => $url }); + } + $log->debug("Got track based on url") if defined $track; + }elsif(!defined($track)) { + $track = Slim::Schema->resultset('Track')->find($item); + $log->debug("Got track based on id") if defined $track; + }else { + $log->debug("Got track based on object") if defined $track; + } + + if(!defined($track) || $track->audio!=1) { + $log->info("Can't find track: $item") if !defined $track; + $log->info("Item is not a track: $item") if defined $track; + $request->setStatusBadParams(); + return; + } + + if($rating<0 || $rating>100) { + $request->setStatusBadParams(); + return; + } + + Slim::Schema::rating($track,$rating); + + $request->setStatusDone(); + $log->debug("done."); +} + ################################################################################ # Helper functions ################################################################################ Index: Slim/Utils/Prefs.pm =================================================================== --- Slim/Utils/Prefs.pm (revision 21314) +++ Slim/Utils/Prefs.pm (working copy) @@ -189,6 +189,7 @@ 'useBandAsAlbumArtist' => 0, 'useTPE2AsAlbumArtist' => 0, 'variousArtistsString' => undef, + 'ratingImplementation' => 'LOCAL_RATING_STORAGE', # Server Settings - FileTypes 'disabledextensionsaudio' => '', 'disabledextensionsplaylist' => '', Index: Slim/Schema.pm =================================================================== --- Slim/Schema.pm (revision 21314) +++ Slim/Schema.pm (working copy) @@ -82,6 +82,10 @@ our $initialized = 0; my $trackAttrs = {}; +my %ratingImplementations = ( + 'LOCAL_RATING_STORAGE' => \&_defaultRatingImplementation +); + =head1 METHODS All methods below are class methods on L. Please see @@ -1446,10 +1450,49 @@ return undef; } +sub registerRatingImplementation { + my $source = shift; + my $implementation = shift; + + if(ref $implementation eq 'CODE') { + $ratingImplementations{$source} = $implementation; + } +} + +sub ratingImplementations { + my @implArray = keys %ratingImplementations; + return \@implArray; +} + +sub rating { + my $track = shift; + my $rating = shift; + + my $impl = $prefs->get('ratingImplementation'); + if(!defined($impl) || !exists($ratingImplementations{$impl})) { + $impl = 'LOCAL_RATING_STORAGE'; + } + + return &{$ratingImplementations{$impl}}($track,$rating); +} + # # Private methods: # +sub _defaultRatingImplementation { + my $track = shift; + my $rating = shift; + + if(defined $rating) { + $track->rating($rating); + $track->update(); + Slim::Schema->forceCommit(); + } + + return $track->rating; +} + sub _retrieveTrack { my ($self, $url, $playlist) = @_; Index: Slim/Web/Settings/Server/Behavior.pm =================================================================== --- Slim/Web/Settings/Server/Behavior.pm (revision 21314) +++ Slim/Web/Settings/Server/Behavior.pm (working copy) @@ -25,10 +25,19 @@ qw(noGenreFilter searchSubString ignoredarticles splitList browseagelimit groupdiscs persistPlaylists reshuffleOnRepeat saveShuffled composerInArtists conductorInArtists bandInArtists variousArtistAutoIdentification useBandAsAlbumArtist - useTPE2AsAlbumArtist variousArtistsString) + useTPE2AsAlbumArtist variousArtistsString ratingImplementation) ); } +sub handler { + my ($class, $client, $paramRef) = @_; + + $paramRef->{'ratingImplementations'} = Slim::Schema::ratingImplementations(); + + return $class->SUPER::handler($client, $paramRef); +} + + 1; __END__ Index: HTML/EN/settings/server/behavior.html =================================================================== --- HTML/EN/settings/server/behavior.html (revision 21314) +++ HTML/EN/settings/server/behavior.html (working copy) @@ -102,5 +102,17 @@ [% END %] + [% WRAPPER setting title="SETUP_RATINGIMPLEMENTATION" desc="SETUP_RATINGIMPLEMENTATION_DESC" %] + + [% END %] + [% PROCESS settings/footer.html %] Index: strings.txt =================================================================== --- strings.txt (revision 21314) +++ strings.txt (working copy) @@ -5359,6 +5359,15 @@ SV Spara låtlistor i orginalordning ZH_CN 保存播放表原来次序 +SETUP_RATINGIMPLEMENTATION + EN Rating storage + +SETUP_RATINGIMPLEMENTATION_DESC + EN Rating storage to use when storing or viewing ratings + +LOCAL_RATING_STORAGE + EN Local storage (reset after rescan) + SETUP_CHECKVERSION CS Automatická aktualizace DA Softwareopdateringer