diff --git a/tag.h b/tag.h index 591a808..fb9d0eb 100644 --- a/tag.h +++ b/tag.h @@ -291,7 +291,6 @@ inline TagDataType Tag::proposedDataType(KnownField field) const switch (field) { case KnownField::Bpm: case KnownField::Bps: - case KnownField::Rating: case KnownField::PartNumber: case KnownField::TotalParts: return TagDataType::Integer; @@ -306,8 +305,13 @@ inline TagDataType Tag::proposedDataType(KnownField field) const return TagDataType::StandardGenreIndex; case KnownField::MCDI: return TagDataType::Binary; + case KnownField::Rating: + // could also be a plain integer but popularity should generally be used (and can be converted + // to an integer) + return TagDataType::Popularity; case KnownField::SynchronizedLyrics: - return TagDataType::Undefined; // not supported so far + // not supported + return TagDataType::Undefined; default: return TagDataType::Text; } diff --git a/tagvalue.cpp b/tagvalue.cpp index 5552323..043634c 100644 --- a/tagvalue.cpp +++ b/tagvalue.cpp @@ -365,6 +365,8 @@ std::int32_t TagValue::toInteger() const return *reinterpret_cast(m_ptr.get()); } throw ConversionException("Can not convert assigned data to integer because the data size is not appropriate."); + case TagDataType::Popularity: + return static_cast(toPopularity().rating); default: throw ConversionException(argsToString("Can not convert ", tagDataTypeString(m_type), " to integer.")); } diff --git a/tests/tagvalue.cpp b/tests/tagvalue.cpp index 5515d72..4c74d3b 100644 --- a/tests/tagvalue.cpp +++ b/tests/tagvalue.cpp @@ -157,7 +157,9 @@ void TagValueTests::testPopularity() CPPUNIT_ASSERT_EQUAL_MESSAGE("conversion to popularity (rating)", 42.0, popularity.rating); CPPUNIT_ASSERT_EQUAL_MESSAGE("conversion to popularity (play counter)", std::uint64_t(123), popularity.playCounter); CPPUNIT_ASSERT_EQUAL_MESSAGE("conversion to string", "foo|42|123"s, tagValue.toString()); - CPPUNIT_ASSERT_THROW_MESSAGE("failing conversion to other type", TagValue("foo|bar"sv, TagTextEncoding::Latin1).toInteger(), ConversionException); + CPPUNIT_ASSERT_EQUAL_MESSAGE("conversion to string", 42, tagValue.toInteger()); + CPPUNIT_ASSERT_THROW_MESSAGE( + "failing conversion to other type", TagValue("foo|bar"sv, TagTextEncoding::Latin1).toPopularity(), ConversionException); } void TagValueTests::testString()