From 22edf7a2b3258e9d6eb2e755c36163e3f2548ff9 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Wed, 20 Jul 2022 11:44:46 +0200 Subject: [PATCH] TagReaderTagParser: Fix reading and writing rating --- ext/libstrawberry-tagreader/tagreaderbase.cpp | 24 +++++++++++++++++++ ext/libstrawberry-tagreader/tagreaderbase.h | 3 +++ .../tagreadertaglib.cpp | 24 ------------------- ext/libstrawberry-tagreader/tagreadertaglib.h | 2 -- .../tagreadertagparser.cpp | 6 ++++- 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/ext/libstrawberry-tagreader/tagreaderbase.cpp b/ext/libstrawberry-tagreader/tagreaderbase.cpp index af19b0eec..3089def54 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 085f6ba84..de5baf904 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 5b88bfe84..46d068bbe 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 c5323cb97..2861a2895 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 ca28b7e94..f80bee7ec 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();