diff --git a/ext/libclementine-tagreader/tagreader.cpp b/ext/libclementine-tagreader/tagreader.cpp index 53f3326db..895412e44 100644 --- a/ext/libclementine-tagreader/tagreader.cpp +++ b/ext/libclementine-tagreader/tagreader.cpp @@ -246,7 +246,31 @@ void TagReader::ReadFile(const QString& filename, } Decode(mp4_tag->comment(), NULL, song->mutable_comment()); } - } else if (tag) { + } +#ifdef TAGLIB_WITH_ASF + else if (TagLib::ASF::File* file = dynamic_cast(fileref->file())) { + const TagLib::ASF::AttributeListMap& attributes_map = file->tag()->attributeListMap(); + if (attributes_map.contains("FMPS/Rating")) { + const TagLib::ASF::AttributeList& attributes = attributes_map["FMPS/Rating"]; + if (!attributes.isEmpty()) { + float rating = TStringToQString(attributes.front().toString()).toFloat(); + if (song->rating() <= 0 && rating > 0) { + song->set_rating(rating); + } + } + } + if (attributes_map.contains("FMPS/Playcount")) { + const TagLib::ASF::AttributeList& attributes = attributes_map["FMPS/Playcount"]; + if (!attributes.isEmpty()) { + int playcount = TStringToQString(attributes.front().toString()).toInt(); + if (song->playcount() <= 0 && playcount > 0) { + song->set_playcount(playcount); + } + } + } + } +#endif + else if (tag) { Decode(tag->comment(), NULL, song->mutable_comment()); } @@ -384,7 +408,6 @@ void TagReader::ParseOggTag(const TagLib::Ogg::FieldListMap& map, song->set_playcount(TStringToQString( map["FMPS_PLAYCOUNT"].front() ).trimmed().toFloat()); } - void TagReader::SetVorbisComments(TagLib::Ogg::XiphComment* vorbis_comments, const pb::tagreader::SongMetadata& song) const { @@ -535,7 +558,17 @@ bool TagReader::SaveSongStatisticsToFile(const QString& filename, SetFMPSVorbisComments(vorbis_comments, song); } else if (TagLib::Ogg::XiphComment* tag = dynamic_cast(fileref->file()->tag())) { SetFMPSVorbisComments(tag, song); - } else { + } +#ifdef TAGLIB_WITH_ASF + else if (TagLib::ASF::File* file = dynamic_cast(fileref->file())) { + TagLib::ASF::Tag* tag = file->tag(); + #define ConvertASF(x) TagLib::ASF::Attribute(QStringToTaglibString(QString::number(x))) + tag->addAttribute("FMPS/Rating", ConvertASF(song.rating())); + tag->addAttribute("FMPS/Playcount", ConvertASF(song.playcount())); + #undef ConvertASF + } +#endif + else { // Nothing to save: stop now return true; } diff --git a/tests/song_test.cpp b/tests/song_test.cpp index 82fa5393d..01879759b 100644 --- a/tests/song_test.cpp +++ b/tests/song_test.cpp @@ -190,4 +190,21 @@ TEST_F(SongTest, RatingAndStatisticsFLAC) { EXPECT_EQ(1337, new_song.playcount()); } +#ifdef TAGLIB_WITH_ASF +TEST_F(SongTest, RatingAndStatisticsASF) { + TemporaryResource r(":/testdata/beep.wma"); + { + Song song = ReadSongFromFile(r.fileName()); + song.set_rating(0.20); + song.set_playcount(1337); + + WriteSongStatisticsToFile(song, r.fileName()); + } + + Song new_song = ReadSongFromFile(r.fileName()); + EXPECT_FLOAT_EQ(0.20, new_song.rating()); + EXPECT_EQ(1337, new_song.playcount()); +} +#endif // TAGLIB_WITH_ASF + } // namespace