diff --git a/RatingsLight/Plugin.pm b/RatingsLight/Plugin.pm
index 2048ea8..0bc1640 100644
--- a/RatingsLight/Plugin.pm
+++ b/RatingsLight/Plugin.pm
@@ -70,6 +70,7 @@ sub initPlugin {
Slim::Control::Request::addDispatch(['ratingslight', 'setrating', '_trackid', '_rating', '_incremental'], [1, 0, 1, \&setRating]);
Slim::Control::Request::addDispatch(['ratingslight', 'setratingpercent', '_trackid', '_rating', '_incremental'], [1, 0, 1, \&setRating]);
+ Slim::Control::Request::addDispatch(['ratingslight', 'getrating', '_trackid'], [0, 1, 0, \&getRating]);
Slim::Control::Request::addDispatch(['ratingslight', 'ratealbumoptions', '_albumid'], [1, 1, 1, \&rateAlbumTracksOptions_jive]);
Slim::Control::Request::addDispatch(['ratingslight', 'ratingmenu', '_trackid', '_isalbum', '_unratedonly'], [0, 1, 1, \&getRatingMenu]);
Slim::Control::Request::addDispatch(['ratingslight', 'ratealbum', '_albumid', '_rating', '_unratedonly'], [1, 1, 1, \&_rateAlbumTracks]);
@@ -190,7 +191,7 @@ sub postinitPlugin {
# temp. workaround to allow legacy TS rating in iPeng until iPeng supports RL or is discontinued
if ($prefs->get('enableipengtslegacyrating') && !Slim::Utils::PluginManager->isEnabled('Plugins::TrackStat::Plugin')) {
- Slim::Control::Request::addDispatch(['trackstat', 'getrating', '_trackid'], [0, 1, 0, \&getRatingTSLegacy]);
+ Slim::Control::Request::addDispatch(['trackstat', 'getrating', '_trackid'], [0, 1, 0, \&getRating]);
Slim::Control::Request::addDispatch(['trackstat', 'setrating', '_trackid', '_rating', '_incremental'], [1, 0, 1, \&setRating]);
Slim::Control::Request::addDispatch(['trackstat', 'setratingpercent', '_trackid', '_rating', '_incremental'], [1, 0, 1, \&setRating]);
Slim::Control::Request::addDispatch(['trackstat', 'changedrating', '_url', '_trackid', '_rating', '_ratingpercent'],[0, 0, 0, undef]);
@@ -2771,11 +2772,27 @@ sub writeRatingToDB {
}
if ($track && blessed $track && (UNIVERSAL::isa($track, 'Slim::Schema::Track') || UNIVERSAL::isa($track, 'Slim::Schema::RemoteTrack'))) {
- my $previousRating100ScaleValue = $track->rating || 0;
- $track->rating($rating100ScaleValue);
+ main::DEBUGLOG && $log->is_debug && $log->debug('Trying to set rating for: '.$track->url);
+ my $previousRating100ScaleValue = getRatingFromDB($track);
+ my $urlmd5 = $track->urlmd5;
+ my $sql = "update tracks_persistent set rating=$rating100ScaleValue where urlmd5 = \"$urlmd5\"";
+ my $dbh = Slim::Schema->dbh;
+ my $sth = $dbh->prepare($sql);
+ eval {
+ $sth->execute();
+ commit($dbh);
+ };
+ if ($@) {
+ $log->warn("Database error: $DBI::errstr");
+ eval {
+ rollback($dbh);
+ };
+ }
+ $sth->finish();
# confirm and log new rating value
- my $newTrackRating = $track->rating || 0;
+ my $newTrackRating = getRatingFromDB($track);
+
if (defined $newTrackRating && $newTrackRating == $rating100ScaleValue) {
main::DEBUGLOG && $log->is_debug && $log->debug('Rating successful. Track title: '.$track->title.' ## New rating = '.($rating100ScaleValue/20).' ('.$rating100ScaleValue.")\n");
unless ($dontlogthis) {
@@ -2803,51 +2820,44 @@ sub getRatingFromDB {
main::DEBUGLOG && $log->is_debug && $log->debug('Track is not blessed');
$track = Slim::Schema->find('Track', $track->{id});
if (!blessed($track)) {
- main::DEBUGLOG && $log->is_debug && $log->debug('No blessed track object found');
+ main::INFOLOG && $log->is_info && $log->info('No blessed track object found');
return $rating100ScaleValue;
}
}
- # check if remote track is part of LMS library
- if ((Slim::Music::Info::isRemoteURL($track->url) == 1) && (!defined($track->extid))) {
- main::DEBUGLOG && $log->is_debug && $log->debug('Track is remote but has no extid, probably not part of LMS library. Trying to get rating with url: '.$track->url);
- my $url = $track->url;
- my $urlmd5 = $track->urlmd5 || md5_hex($url);
-
- my $dbh = Slim::Schema->dbh;
- my $sqlstatement = "select tracks_persistent.rating from tracks_persistent where tracks_persistent.urlmd5 = \"$urlmd5\"";
- eval{
- my $sth = $dbh->prepare($sqlstatement);
- $sth->execute() or do {$sqlstatement = undef;};
- $rating100ScaleValue = $sth->fetchrow || 0;
- $sth->finish();
- };
- if ($@) { main::DEBUGLOG && $log->is_debug && $log->debug("error: $@"); }
- main::DEBUGLOG && $log->is_debug && $log->debug("Found rating $rating100ScaleValue for url: ".$url);
- return adjustRating($rating100ScaleValue);
- }
-
- # check for dead/moved local tracks
+ # check for dead/moved/non-library local tracks
+ main::DEBUGLOG && $log->is_debug && $log->debug('Track is remote but has no extid, probably not part of LMS library.') if ((Slim::Music::Info::isRemoteURL($track->url) == 1) && (!defined($track->extid)));
if ((Slim::Music::Info::isRemoteURL($track->url) != 1) && (!defined($track->filesize))) {
- main::DEBUGLOG && $log->is_debug && $log->debug('Local track with zero filesize in db - track dead or moved??? Track URL: '.$track->url);
+ main::INFOLOG && $log->is_info && $log->info('Local track with zero filesize in db - track dead or moved??? Track URL: '.$track->url);
return $rating100ScaleValue;
}
- my $thisrating = $track->rating;
- $rating100ScaleValue = $thisrating if $thisrating;
+ # use sqlite instead of LMS method in case library has tracks with identical MusicBrainz IDs
+ main::DEBUGLOG && $log->is_debug && $log->debug('Trying to get rating with sqlite and url: '.$track->url);
+ my $urlmd5 = $track->urlmd5 || md5_hex($track->url);
+
+ my $dbh = Slim::Schema->dbh;
+ my $sqlstatement = "select rating from tracks_persistent where urlmd5 = \"$urlmd5\"";
+ eval{
+ my $sth = $dbh->prepare($sqlstatement);
+ $sth->execute() or do {$sqlstatement = undef;};
+ $rating100ScaleValue = $sth->fetchrow || 0;
+ $sth->finish();
+ };
+ if ($@) { main::DEBUGLOG && $log->is_debug && $log->debug("error: $@"); }
+ main::DEBUGLOG && $log->is_debug && $log->debug("Found rating $rating100ScaleValue for url: ".$track->url);
return adjustRating($rating100ScaleValue);
}
-sub getRatingTSLegacy {
+sub getRating {
my $request = shift;
- main::DEBUGLOG && $log->is_debug && $log->debug('Used TS Legacy dispatch to get rating.');
main::DEBUGLOG && $log->is_debug && $log->debug('request params = '.Data::Dump::dump($request->getParamsCopy()));
if (Slim::Music::Import->stillScanning) {
$log->warn('Warning: access to rating values blocked until library scan is completed');
return;
}
- if ($request->isNotQuery([['trackstat'],['getrating']])) {
+ if ($request->isNotQuery([['ratingslight'],['getrating']]) && $request->isNotQuery([['trackstat'],['getrating']])) {
$log->error('incorrect command');
$request->setStatusBadDispatch();
return;
diff --git a/RatingsLight/install.xml b/RatingsLight/install.xml
index 081ad8c..de4bb5b 100644
--- a/RatingsLight/install.xml
+++ b/RatingsLight/install.xml
@@ -3,7 +3,7 @@
afc9f784-9381-2021-5477-479eca380cf5
PLUGIN_RATINGSLIGHT
Plugins::RatingsLight::Plugin
- 2.8.3
+ 2.8.4
PLUGIN_RATINGSLIGHT_DESC
AF
Plugins::RatingsLight::Importer