diff --git a/src/preferences/dialog/dlgpreflibrary.cpp b/src/preferences/dialog/dlgpreflibrary.cpp
index eedaa4402b42..01a342b180ab 100644
--- a/src/preferences/dialog/dlgpreflibrary.cpp
+++ b/src/preferences/dialog/dlgpreflibrary.cpp
@@ -149,6 +149,7 @@ void DlgPrefLibrary::slotExtraPlugins() {
void DlgPrefLibrary::slotResetToDefaults() {
checkBox_library_scan->setChecked(false);
checkbox_ID3_sync->setChecked(false);
+ checkBox_ID3_rating_sync->setChecked(false);
checkBox_use_relative_path->setChecked(false);
checkBox_show_rhythmbox->setChecked(true);
checkBox_show_banshee->setChecked(true);
@@ -167,6 +168,8 @@ void DlgPrefLibrary::slotUpdate() {
ConfigKey("[Library]","RescanOnStartup")).toInt());
checkbox_ID3_sync->setChecked((bool)m_pconfig->getValueString(
ConfigKey("[Library]","WriteAudioTags")).toInt());
+ checkBox_ID3_rating_sync->setChecked((bool)m_pconfig->getValueString(
+ ConfigKey("[Library]","ID3RatingSync")).toInt());
checkBox_use_relative_path->setChecked((bool)m_pconfig->getValueString(
ConfigKey("[Library]","UseRelativePathOnExport")).toInt());
checkBox_show_rhythmbox->setChecked((bool)m_pconfig->getValueString(
@@ -300,6 +303,8 @@ void DlgPrefLibrary::slotApply() {
ConfigValue((int)checkBox_library_scan->isChecked()));
m_pconfig->set(ConfigKey("[Library]","WriteAudioTags"),
ConfigValue((int)checkbox_ID3_sync->isChecked()));
+ m_pconfig->set(ConfigKey("[Library]","ID3RatingSync"),
+ ConfigValue((int)checkBox_ID3_rating_sync->isChecked()));
m_pconfig->set(ConfigKey("[Library]","UseRelativePathOnExport"),
ConfigValue((int)checkBox_use_relative_path->isChecked()));
m_pconfig->set(ConfigKey("[Library]","ShowRhythmboxLibrary"),
diff --git a/src/preferences/dialog/dlgpreflibrarydlg.ui b/src/preferences/dialog/dlgpreflibrarydlg.ui
index 508bdcb03f79..4cb14de30082 100644
--- a/src/preferences/dialog/dlgpreflibrarydlg.ui
+++ b/src/preferences/dialog/dlgpreflibrarydlg.ui
@@ -196,6 +196,16 @@
+ -
+
+
+ true
+
+
+ Synchronize mixxx star ratings with ID3 ratings (caution: overwrites mixxx ratings)
+
+
+
-
diff --git a/src/preferences/settingsmanager.cpp b/src/preferences/settingsmanager.cpp
index 54b148145751..97bd7ee3aaa5 100644
--- a/src/preferences/settingsmanager.cpp
+++ b/src/preferences/settingsmanager.cpp
@@ -45,6 +45,8 @@ void SettingsManager::initializeDefaults() {
// For safety reasons, we deactivate this feature.
m_pSettings->set(ConfigKey("[Library]","WriteAudioTags"), ConfigValue(0));
+ m_pSettings->set(ConfigKey("[Library]","ID3RatingSync"),ConfigValue(0));;
+
// Intialize default BPM system values.
// NOTE(rryan): These should be in a better place but they've always been in
// MixxxMainWindow.
diff --git a/src/track/trackmetadata.cpp b/src/track/trackmetadata.cpp
index 77d0f777079b..e7ecbc5b109f 100644
--- a/src/track/trackmetadata.cpp
+++ b/src/track/trackmetadata.cpp
@@ -91,7 +91,8 @@ bool operator==(const TrackMetadata& lhs, const TrackMetadata& rhs) {
(lhs.getBitrate() == rhs.getBitrate()) &&
(lhs.getDuration() == rhs.getDuration()) &&
(lhs.getBpm() == rhs.getBpm()) &&
- (lhs.getReplayGain() == rhs.getReplayGain());
+ (lhs.getReplayGain() == rhs.getReplayGain()) &&
+ (lhs.getRating() == rhs.getRating());
}
} //namespace Mixxx
diff --git a/src/track/trackmetadata.h b/src/track/trackmetadata.h
index d80cb0a6b1c6..ba5470152579 100644
--- a/src/track/trackmetadata.h
+++ b/src/track/trackmetadata.h
@@ -150,6 +150,14 @@ class TrackMetadata {
m_replayGain = ReplayGain();
}
+ int getRating() const {
+ return m_iRating;
+ }
+
+ void setRating(int rating) {
+ m_iRating = rating;
+ }
+
// Parse an format date/time values according to ISO 8601
static QDate parseDate(QString str) {
return QDate::fromString(str.trimmed().replace(" ", ""), Qt::ISODate);
@@ -194,6 +202,7 @@ class TrackMetadata {
int m_channels;
int m_duration; // seconds
int m_sampleRate; // Hz
+ int m_iRating;
};
bool operator==(const TrackMetadata& lhs, const TrackMetadata& rhs);
diff --git a/src/track/trackmetadatataglib.cpp b/src/track/trackmetadatataglib.cpp
index 9caea3d1c2b2..05f9fa9824e7 100644
--- a/src/track/trackmetadatataglib.cpp
+++ b/src/track/trackmetadatataglib.cpp
@@ -49,6 +49,7 @@ static_assert(sizeof(wchar_t) == sizeof(QChar), "wchar_t is not the same size th
#include
#include
#include
+#include "controlobject.h"
namespace Mixxx {
@@ -838,6 +839,32 @@ void readTrackMetadataFromID3v2Tag(TrackMetadata* pTrackMetadata,
parseTrackPeak(pTrackMetadata,
toQString(pTrackPeakFrame->fieldList()[1]));
}
+ TagLib::ID3v2::FrameList ratingFrame = tag.frameListMap()["POPM"];
+ int rating = 0;
+
+// const int ratingbool = ControlObject::getControl(ConfigKey("[Library]","ID3RatingSync"));
+//qDebug() << "ID3 " << ratingbool;
+if(!ratingFrame.isEmpty()) {
+ // RatingString "traktor@native-instruments.de rating=255 counter=2"
+
+ QString sRating = TStringToQString(ratingFrame.front()->toString());
+ sRating = sRating.section("=",1,2).left(3);
+ float fRating = sRating.toInt();
+ rating = ceil(fRating/51);
+
+ // Calc rating
+ //
+ // NI - Rating
+ // 255 = 5 | 204 = 4 | 153 = 3 | 102 = 2 | 51 = 1 | 0 = 0
+ //
+ // Banshee - Rating
+ // 255 = 5 | 192 = 4 | 128 = 3 | 64 = 2 | 1 = 1
+ //
+ // ==> Rating = ceil ( X / 51 )
+
+ qDebug() << "Final int() Rating" << rating;
+ pTrackMetadata->setRating(rating);
+ }
}
void readTrackMetadataFromAPETag(TrackMetadata* pTrackMetadata, const TagLib::APE::Tag& tag) {
diff --git a/src/track/trackmetadatataglib.h b/src/track/trackmetadatataglib.h
index 895ea3b73f05..0e4075027f61 100644
--- a/src/track/trackmetadatataglib.h
+++ b/src/track/trackmetadatataglib.h
@@ -5,7 +5,6 @@
#include
#include
#include
-
#include
#include "track/trackmetadata.h"
@@ -32,7 +31,6 @@ bool writeTrackMetadataIntoAPETag(TagLib::APE::Tag* pTag, const TrackMetadata& t
bool writeTrackMetadataIntoXiphComment(TagLib::Ogg::XiphComment* pTag,
const TrackMetadata& trackMetadata);
bool writeTrackMetadataIntoMP4Tag(TagLib::MP4::Tag* pTag, const TrackMetadata& trackMetadata);
-
} //namespace Mixxx
#endif
diff --git a/src/trackinfoobject.cpp b/src/trackinfoobject.cpp
index 075f82b8edae..4f563677a2c1 100644
--- a/src/trackinfoobject.cpp
+++ b/src/trackinfoobject.cpp
@@ -783,13 +783,14 @@ bool TrackInfoObject::isDirty() {
int TrackInfoObject::getRating() const {
QMutexLocker lock(&m_qMutex);
- return m_iRating;
+ return m_metadata.getRating();
}
void TrackInfoObject::setRating (int rating) {
QMutexLocker lock(&m_qMutex);
- if (compareAndSet(&m_iRating, rating)) {
- markDirtyAndUnlock(&lock);
+ if (m_metadata.getRating() != rating ) {
+ m_metadata.setRating(rating);
+ markDirtyAndUnlock(&lock);
}
}
diff --git a/src/trackinfoobject.h b/src/trackinfoobject.h
index 5bac592c83e2..995fa5c5b053 100644
--- a/src/trackinfoobject.h
+++ b/src/trackinfoobject.h
@@ -61,6 +61,7 @@ class TrackInfoObject : public QObject {
Q_PROPERTY(QString key READ getKeyText WRITE setKeyText)
Q_PROPERTY(int duration READ getDuration WRITE setDuration)
Q_PROPERTY(QString durationFormatted READ getDurationText STORED false)
+ Q_PROPERTY(int rating READ getRating WRITE setRating)
TrackId getId() const;