From d5917a606e399c6ea0732c24dd06fe43125694c4 Mon Sep 17 00:00:00 2001 From: Waylon Robertson Date: Wed, 13 Apr 2016 01:19:35 +1200 Subject: [PATCH 1/2] New Feature: Rating from id3 popm frame translates into star ratings. --- src/track/trackmetadata.cpp | 3 ++- src/track/trackmetadata.h | 9 +++++++++ src/track/trackmetadatataglib.cpp | 23 +++++++++++++++++++++++ src/trackinfoobject.cpp | 7 ++++--- src/trackinfoobject.h | 1 + 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/track/trackmetadata.cpp b/src/track/trackmetadata.cpp index 77d0f777079..e7ecbc5b109 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 d80cb0a6b1c..ba547015257 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 9caea3d1c2b..1db211f2414 100644 --- a/src/track/trackmetadatataglib.cpp +++ b/src/track/trackmetadatataglib.cpp @@ -838,6 +838,29 @@ void readTrackMetadataFromID3v2Tag(TrackMetadata* pTrackMetadata, parseTrackPeak(pTrackMetadata, toQString(pTrackPeakFrame->fieldList()[1])); } + TagLib::ID3v2::FrameList ratingFrame = tag.frameListMap()["POPM"]; + int rating = 0; + 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/trackinfoobject.cpp b/src/trackinfoobject.cpp index 075f82b8eda..4f563677a2c 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 5bac592c83e..995fa5c5b05 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; From f13b11028e8a8f262633522cfb8e10320cdacd86 Mon Sep 17 00:00:00 2001 From: Waylon Robertson Date: Mon, 16 May 2016 12:13:39 +1200 Subject: [PATCH 2/2] Attempt #1 to include updating ratings from mp3's as a preference in dialog. --- src/preferences/dialog/dlgpreflibrary.cpp | 5 +++++ src/preferences/dialog/dlgpreflibrarydlg.ui | 10 ++++++++++ src/preferences/settingsmanager.cpp | 2 ++ src/track/trackmetadatataglib.cpp | 6 +++++- src/track/trackmetadatataglib.h | 2 -- 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/preferences/dialog/dlgpreflibrary.cpp b/src/preferences/dialog/dlgpreflibrary.cpp index eedaa4402b4..01a342b180a 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 508bdcb03f7..4cb14de3008 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 54b14814575..97bd7ee3aaa 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/trackmetadatataglib.cpp b/src/track/trackmetadatataglib.cpp index 1db211f2414..05f9fa9824e 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 { @@ -840,7 +841,10 @@ void readTrackMetadataFromID3v2Tag(TrackMetadata* pTrackMetadata, } TagLib::ID3v2::FrameList ratingFrame = tag.frameListMap()["POPM"]; int rating = 0; - if(!ratingFrame.isEmpty()) { + +// 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()); diff --git a/src/track/trackmetadatataglib.h b/src/track/trackmetadatataglib.h index 895ea3b73f0..0e4075027f6 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