Treat 255 as empty ID3v1 genre index
This commit is contained in:
parent
97c1a2100d
commit
5140b76f08
|
@ -170,7 +170,7 @@ set(META_APP_AUTHOR "Martchus")
|
|||
set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
|
||||
set(META_APP_DESCRIPTION "C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags")
|
||||
set(META_VERSION_MAJOR 8)
|
||||
set(META_VERSION_MINOR 1)
|
||||
set(META_VERSION_MINOR 2)
|
||||
set(META_VERSION_PATCH 0)
|
||||
set(META_PUBLIC_SHARED_LIB_DEPENDS c++utilities)
|
||||
set(META_PUBLIC_STATIC_LIB_DEPENDS c++utilities_static)
|
||||
|
|
|
@ -11,6 +11,7 @@ namespace TagParser {
|
|||
|
||||
/*!
|
||||
* \brief Returns all known genre names.
|
||||
* \todo Fix const-correctness in v9.
|
||||
*/
|
||||
const char **Id3Genres::genreNames()
|
||||
{
|
||||
|
@ -37,9 +38,13 @@ const char **Id3Genres::genreNames()
|
|||
|
||||
/*!
|
||||
* \brief Returns the numerical denotation of the specified \a genre or -1 if \a genre is unknown.
|
||||
* \remarks If \a string is empty, the non-standard Id3Genres::emptyGenreIndex() is returned.
|
||||
*/
|
||||
int Id3Genres::indexFromString(const string &genre)
|
||||
{
|
||||
if (genre.empty()) {
|
||||
return emptyGenreIndex();
|
||||
}
|
||||
const char *const *ptr = genreNames();
|
||||
for (int index = 0; index < genreCount(); ++ptr, ++index) {
|
||||
if (genre == *ptr) {
|
||||
|
|
|
@ -14,6 +14,8 @@ public:
|
|||
static inline const char *stringFromIndex(int index);
|
||||
static int indexFromString(const std::string &genre);
|
||||
static constexpr int genreCount();
|
||||
static constexpr int emptyGenreIndex();
|
||||
static constexpr bool isEmptyGenre(int index);
|
||||
static constexpr bool isIndexSupported(int index);
|
||||
|
||||
private:
|
||||
|
@ -36,6 +38,24 @@ constexpr int Id3Genres::genreCount()
|
|||
return 192;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Returns the preferred genre index to indicate that no genre is set at all.
|
||||
* \remarks Apparently some files use 255 to indicate the genre information is missing although this
|
||||
* is not explicitely specified on [ID3.org](http://id3.org/ID3v1).
|
||||
*/
|
||||
constexpr int Id3Genres::emptyGenreIndex()
|
||||
{
|
||||
return 255;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Returns whether the genre \a index indicates the genre field is not set at all.
|
||||
*/
|
||||
constexpr bool Id3Genres::isEmptyGenre(int index)
|
||||
{
|
||||
return index == emptyGenreIndex();
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Returns an indication whether the specified numerical denotation is
|
||||
* supported by this class.
|
||||
|
|
25
tagvalue.cpp
25
tagvalue.cpp
|
@ -212,7 +212,7 @@ int32 TagValue::toInteger() const
|
|||
int TagValue::toStandardGenreIndex() const
|
||||
{
|
||||
if (isEmpty()) {
|
||||
return 0;
|
||||
return Id3Genres::emptyGenreIndex();
|
||||
}
|
||||
int index = 0;
|
||||
switch (m_type) {
|
||||
|
@ -470,13 +470,17 @@ void TagValue::toString(string &result, TagTextEncoding encoding) const
|
|||
case TagDataType::PositionInSet:
|
||||
result = toPositionInSet().toString();
|
||||
break;
|
||||
case TagDataType::StandardGenreIndex:
|
||||
if (const char *genreName = Id3Genres::stringFromIndex(toInteger())) {
|
||||
case TagDataType::StandardGenreIndex: {
|
||||
const auto genreIndex = toInteger();
|
||||
if (Id3Genres::isEmptyGenre(genreIndex)) {
|
||||
result.clear();
|
||||
} else if (const char *genreName = Id3Genres::stringFromIndex(genreIndex)) {
|
||||
result.assign(genreName);
|
||||
break;
|
||||
} else {
|
||||
throw ConversionException("No string representation for the assigned standard genre index available.");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TagDataType::TimeSpan:
|
||||
result = toTimeSpan().toString();
|
||||
break;
|
||||
|
@ -547,12 +551,17 @@ void TagValue::toWString(std::u16string &result, TagTextEncoding encoding) const
|
|||
case TagDataType::PositionInSet:
|
||||
regularStrRes = toPositionInSet().toString();
|
||||
break;
|
||||
case TagDataType::StandardGenreIndex:
|
||||
if (const char *const genreName = Id3Genres::stringFromIndex(toInteger())) {
|
||||
case TagDataType::StandardGenreIndex: {
|
||||
const auto genreIndex = toInteger();
|
||||
if (Id3Genres::isEmptyGenre(genreIndex)) {
|
||||
regularStrRes.clear();
|
||||
} else if (const char *genreName = Id3Genres::stringFromIndex(genreIndex)) {
|
||||
regularStrRes.assign(genreName);
|
||||
break;
|
||||
} else {
|
||||
throw ConversionException("No string representation for the assigned standard genre index available.");
|
||||
}
|
||||
throw ConversionException("No string representation for the assigned standard genre index available.");
|
||||
break;
|
||||
}
|
||||
case TagDataType::TimeSpan:
|
||||
regularStrRes = toTimeSpan().toString();
|
||||
break;
|
||||
|
|
|
@ -84,6 +84,8 @@ void TagValueTests::testInteger()
|
|||
CPPUNIT_ASSERT_EQUAL("42"s, integer.toString());
|
||||
integer.assignInteger(2);
|
||||
CPPUNIT_ASSERT_EQUAL("Country"s, string(Id3Genres::stringFromIndex(integer.toStandardGenreIndex())));
|
||||
integer.assignInteger(255);
|
||||
CPPUNIT_ASSERT_EQUAL(string(), string(Id3Genres::stringFromIndex(integer.toStandardGenreIndex())));
|
||||
|
||||
// negative number
|
||||
integer.assignInteger(-25);
|
||||
|
|
Loading…
Reference in New Issue