Limit to the first 4 digits when parsing years badly encoded as YYYYMMDD

This commit is contained in:
emeric
2024-02-02 22:58:37 +01:00
parent d3aa11714a
commit 5db91fc5b5
5 changed files with 78 additions and 4 deletions
+4 -4
View File
@@ -336,19 +336,19 @@ namespace MetaData
if (const Wt::WDate date{ Utils::parseDate(value) }; date.isValid())
track.date = date;
else if (!track.year)
track.year = StringUtils::readAs<int>(value);
track.year = Utils::parseYear(value);
}
else if (tag == "YEAR")
track.year = StringUtils::readAs<int>(value);
track.year = Utils::parseYear(value);
else if (tag == "ORIGINALDATE")
{
if (const Wt::WDate date{ Utils::parseDate(value) }; date.isValid())
track.originalDate = date;
else if (!track.originalYear)
track.originalYear = StringUtils::readAs<int>(value);
track.originalYear = Utils::parseYear(value);
}
else if (tag == "ORIGINALYEAR")
track.originalYear = StringUtils::readAs<int>(value);
track.originalYear = Utils::parseYear(value);
else if (tag == "METADATA_BLOCK_PICTURE")
track.hasCover = true;
else if (tag == "COPYRIGHT")
+32
View File
@@ -64,6 +64,38 @@ namespace MetaData::Utils
return {};
}
std::optional<int> parseYear(std::string_view yearStr)
{
// limit to first 4 digit, accept leading '-'
if (yearStr.empty())
return std::nullopt;
int sign;
if (yearStr.front() == '-')
{
sign = -1;
yearStr.remove_prefix(1);
}
else
{
sign = 1;
}
if (yearStr.empty() || !std::isdigit(yearStr.front()))
return std::nullopt;
int result{};
for (std::size_t i{}; i < yearStr.size() && i < 4; ++i)
{
if (!std::isdigit(yearStr[i])) {
break;
}
result = result * 10 + (yearStr[i] - '0');
}
return result * sign;
}
std::string_view readStyleToString(ParserReadStyle readStyle)
{
switch (readStyle)
+2
View File
@@ -20,6 +20,7 @@
#pragma once
#include <optional>
#include <string_view>
#include <Wt/WDate.h>
@@ -28,6 +29,7 @@
namespace MetaData::Utils
{
Wt::WDate parseDate(std::string_view dateStr);
std::optional<int> parseYear(std::string_view yearStr);
std::string_view readStyleToString(ParserReadStyle readStyle);
struct PerformerArtist