input/curl: apply the "charset" parameter to Icy-Name

Extends the URI fragment parameter added in
commit cf9ee33928

Closes https://github.com/MusicPlayerDaemon/MPD/issues/679
This commit is contained in:
Max Kellermann 2019-11-04 15:12:09 +01:00
parent ed327c597a
commit cbaa98c1a1
1 changed files with 53 additions and 1 deletions

View File

@ -40,6 +40,14 @@
#include "util/Domain.hxx"
#include "Log.hxx"
#include "PluginUnavailable.hxx"
#include "config.h"
#ifdef HAVE_ICU_CONVERTER
#include "lib/icu/Converter.hxx"
#include "util/AllocatedString.hxx"
#include "util/UriExtract.hxx"
#include "util/UriQueryParser.hxx"
#endif
#include <cinttypes>
@ -176,6 +184,45 @@ CurlInputStream::FreeEasyIndirect() noexcept
});
}
#ifdef HAVE_ICU_CONVERTER
static std::unique_ptr<IcuConverter>
CreateIcuConverterForUri(const char *uri)
{
const char *fragment = uri_get_fragment(uri);
if (fragment == nullptr)
return nullptr;
const auto charset = UriFindRawQueryParameter(fragment, "charset");
if (charset == nullptr)
return nullptr;
const std::string copy(charset.data, charset.size);
return IcuConverter::Create(copy.c_str());
}
#endif
template<typename F>
static void
WithConvertedTagValue(const char *uri, const char *value, F &&f) noexcept
{
#ifdef HAVE_ICU_CONVERTER
try {
auto converter = CreateIcuConverterForUri(uri);
if (converter) {
f(converter->ToUTF8(value).c_str());
return;
}
} catch (...) {
}
#else
(void)uri;
#endif
f(value);
}
void
CurlInputStream::OnHeaders(unsigned status,
std::multimap<std::string, std::string> &&headers)
@ -217,7 +264,12 @@ CurlInputStream::OnHeaders(unsigned status,
if (i != headers.end()) {
TagBuilder tag_builder;
tag_builder.AddItem(TAG_NAME, i->second.c_str());
WithConvertedTagValue(GetURI(), i->second.c_str(),
[&tag_builder](const char *value){
tag_builder.AddItem(TAG_NAME,
value);
});
SetTag(tag_builder.CommitNew());
}