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;