diff --git a/ext/libstrawberry-tagreader/tagreaderbase.cpp b/ext/libstrawberry-tagreader/tagreaderbase.cpp index af19b0ee..3089def5 100644 --- a/ext/libstrawberry-tagreader/tagreaderbase.cpp +++ b/ext/libstrawberry-tagreader/tagreaderbase.cpp @@ -25,3 +25,27 @@ const std::string TagReaderBase::kEmbeddedCover = "(embedded)"; TagReaderBase::TagReaderBase() = default; TagReaderBase::~TagReaderBase() = default; + +float TagReaderBase::ConvertPOPMRating(const int POPM_rating) { + + if (POPM_rating < 0x01) return 0.0F; + else if (POPM_rating < 0x40) return 0.20F; + else if (POPM_rating < 0x80) return 0.40F; + else if (POPM_rating < 0xC0) return 0.60F; + else if (POPM_rating < 0xFC) return 0.80F; + + return 1.0F; + +} + +int TagReaderBase::ConvertToPOPMRating(const float rating) { + + if (rating < 0.20) return 0x00; + else if (rating < 0.40) return 0x01; + else if (rating < 0.60) return 0x40; + else if (rating < 0.80) return 0x80; + else if (rating < 1.0) return 0xC0; + + return 0xFF; + +} diff --git a/ext/libstrawberry-tagreader/tagreaderbase.h b/ext/libstrawberry-tagreader/tagreaderbase.h index 085f6ba8..de5baf90 100644 --- a/ext/libstrawberry-tagreader/tagreaderbase.h +++ b/ext/libstrawberry-tagreader/tagreaderbase.h @@ -47,6 +47,9 @@ class TagReaderBase { virtual bool SaveSongPlaycountToFile(const QString &filename, const spb::tagreader::SongMetadata &song) const = 0; virtual bool SaveSongRatingToFile(const QString &filename, const spb::tagreader::SongMetadata &song) const = 0; + static float ConvertPOPMRating(const int POPM_rating); + static int ConvertToPOPMRating(const float rating); + protected: static const std::string kEmbeddedCover; diff --git a/ext/libstrawberry-tagreader/tagreadertaglib.cpp b/ext/libstrawberry-tagreader/tagreadertaglib.cpp index 5b88bfe8..46d068bb 100644 --- a/ext/libstrawberry-tagreader/tagreadertaglib.cpp +++ b/ext/libstrawberry-tagreader/tagreadertaglib.cpp @@ -1047,30 +1047,6 @@ TagLib::ID3v2::PopularimeterFrame *TagReaderTagLib::GetPOPMFrameFromTag(TagLib:: } -float TagReaderTagLib::ConvertPOPMRating(const int POPM_rating) { - - if (POPM_rating < 0x01) return 0.0F; - else if (POPM_rating < 0x40) return 0.20F; - else if (POPM_rating < 0x80) return 0.40F; - else if (POPM_rating < 0xC0) return 0.60F; - else if (POPM_rating < 0xFC) return 0.80F; - - return 1.0F; - -} - -int TagReaderTagLib::ConvertToPOPMRating(const float rating) { - - if (rating < 0.20) return 0x00; - else if (rating < 0.40) return 0x01; - else if (rating < 0.60) return 0x40; - else if (rating < 0.80) return 0x80; - else if (rating < 1.0) return 0xC0; - - return 0xFF; - -} - bool TagReaderTagLib::SaveSongPlaycountToFile(const QString &filename, const spb::tagreader::SongMetadata &song) const { if (filename.isEmpty()) return false; diff --git a/ext/libstrawberry-tagreader/tagreadertaglib.h b/ext/libstrawberry-tagreader/tagreadertaglib.h index c5323cb9..2861a289 100644 --- a/ext/libstrawberry-tagreader/tagreadertaglib.h +++ b/ext/libstrawberry-tagreader/tagreadertaglib.h @@ -79,8 +79,6 @@ class TagReaderTagLib : public TagReaderBase { QByteArray LoadEmbeddedAPEArt(const TagLib::APE::ItemListMap &map) const; - static float ConvertPOPMRating(const int POPM_rating); - static int ConvertToPOPMRating(const float rating); static TagLib::ID3v2::PopularimeterFrame *GetPOPMFrameFromTag(TagLib::ID3v2::Tag *tag); private: diff --git a/ext/libstrawberry-tagreader/tagreadertagparser.cpp b/ext/libstrawberry-tagreader/tagreadertagparser.cpp index ca28b7e9..f80bee7e 100644 --- a/ext/libstrawberry-tagreader/tagreadertagparser.cpp +++ b/ext/libstrawberry-tagreader/tagreadertagparser.cpp @@ -227,6 +227,10 @@ void TagReaderTagParser::ReadFile(const QString &filename, spb::tagreader::SongM if (!tag->value(TagParser::KnownField::Cover).empty() && tag->value(TagParser::KnownField::Cover).dataSize() > 0) { song->set_art_automatic(kEmbeddedCover); } + const float rating = ConvertPOPMRating(tag->value(TagParser::KnownField::Rating)); + if (song->rating() <= 0 && rating > 0.0 && rating <= 1.0) { + song->set_rating(rating); + } } // Set integer fields to -1 if they're not valid @@ -469,7 +473,7 @@ bool TagReaderTagParser::SaveSongRatingToFile(const QString &filename, const spb } for (const auto tag : taginfo.tags()) { - tag->setValue(TagParser::KnownField::Rating, TagParser::TagValue(song.rating())); + tag->setValue(TagParser::KnownField::Rating, TagParser::TagValue(ConvertToPOPMRating(song.rating()))); } taginfo.applyChanges(diag, progress); taginfo.close();